当前位置: 首页 > news >正文

Node.js 助力前端开发:自动化操作实战

前端开发中,重复性任务如新建文件、配置路由、生成组件等,往往耗时且容易出错。借助 Node.js 的强大能力,我们可以实现开发过程中的自动化操作,提高效率。

文章目录

  • 自动生成 router 配置文件
  • 自动生成组件模板
  • 动态构建导航菜单
  • 自动检测并删除未使用的文件
  • 前端性能报告生成

自动生成 router 配置文件

以下是脚本需要实现的主要功能:

  • 读取命令行参数(如路由名称)。

  • 根据模板文件生成路由配置和组件文件。

  • 自动更新 router/index.js 文件。

    脚本文件:generateRoute.js

const fs = require('fs');
const path = require('path');// 获取命令行参数
const args = process.argv.slice(2);
const [routeName] = args;if (!routeName) {console.error('请提供路由名称!');process.exit(1);
}// 定义文件路径
const routerPath = path.resolve(__dirname, '../src/router/index.js');
const componentPath = path.resolve(__dirname, `../src/views/${routeName}`);
const componentFile = `${componentPath}/index.vue`;// 路由模板
const routeTemplate = `
{path: '/${routeName}',name: '${routeName}',component: () => import('@/views/${routeName}/index.vue')
},
`;// 组件模板
const componentTemplate = `<template><div class="${routeName}"><h1>${routeName} 页面</h1></div>
</template><script>
export default {name: '${routeName}'
};
</script><style scoped>
.${routeName} {
}
</style>`;// 创建组件文件夹及文件
if (!fs.existsSync(componentPath)) {fs.mkdirSync(componentPath, { recursive: true });
}
fs.writeFileSync(componentFile, componentTemplate);
console.log(`组件文件已创建: ${componentFile}`);// 更新路由文件
let routerContent = fs.readFileSync(routerPath, 'utf-8');
const insertPosition = routerContent.lastIndexOf(']');
routerContent =routerContent.slice(0, insertPosition) + routeTemplate + routerContent.slice(insertPosition);
fs.writeFileSync(routerPath, routerContent);
console.log(`路由配置已更新: ${routerPath}`);

使用方法:

  1. 将脚本文件放置在 scripts 文件夹中。
  2. 在项目的 package.json 文件中添加命令:
{"scripts": {"generate:route": "node scripts/generateRoute.js"}
}

运行以下命令,自动生成路由及组件:

npm run generate:route <路由名称>

自动生成组件模板

生成 Vue/React 组件模板文件夹,包括 index.vue/index.jsx、style.scss 等文件。
支持命令行参数指定组件类型(页面组件、通用组件)。

// generateComponent.js
const fs = require('fs');
const path = require('path');function generateComponent(componentName, type = 'common') {const baseDir = type === 'page' ? '../src/pages/' : '../src/components/';const dirPath = path.resolve(__dirname, `${baseDir}${componentName}`);const filePath = `${dirPath}/index.vue`;const template = `
<template><div class="${componentName}">Hello ${componentName}</div>
</template><script>
export default {name: '${componentName}',
};
</script><style scoped>
.${componentName} {
}
</style>`;if (!fs.existsSync(dirPath)) {fs.mkdirSync(dirPath, { recursive: true });fs.writeFileSync(filePath, template);console.log(`组件模板已生成:${filePath}`);} else {console.error('组件已存在!');}
}
generateComponent(process.argv[2], process.argv[3]);

命令:

node generateComponent.js MyComponent page

动态构建导航菜单

用途:根据文件结构动态生成菜单配置(如侧边栏、顶部导航)
读取项目的文件夹结构,自动生成导航菜单的 JSON 配置。
支持递归扫描,动态构建多层菜单。

const fs = require('fs');
const path = require('path');function generateMenu(dir, baseRoute = '') {const files = fs.readdirSync(dir);return files.map((file) => {const fullPath = path.join(dir, file);const isDir = fs.lstatSync(fullPath).isDirectory();return {path: `${baseRoute}/${file}`,name: file,...(isDir ? { children: generateMenu(fullPath, `${baseRoute}/${file}`) } : {})};});
}const menu = generateMenu(path.resolve(__dirname, '../src/pages'));
fs.writeFileSync('./menu.json', JSON.stringify(menu, null, 2));
console.log('导航菜单配置已生成:menu.json');

自动检测并删除未使用的文件

扫描项目中的所有代码文件,提取其中引用的资源路径。
对比项目中的实际文件,标记为未使用的文件,并提示是否删除。
代码实现:

const fs = require('fs');
const path = require('path');
const glob = require('glob');const projectDir = path.resolve(__dirname, '../src'); // 项目源码目录
const assetsDir = path.resolve(__dirname, '../src/assets'); // 静态资源目录// 扫描源码中的引用资源
function getUsedFiles() {const files = glob.sync(`${projectDir}/**/*.{js,vue,html}`, { nodir: true });const usedFiles = new Set();files.forEach((file) => {const content = fs.readFileSync(file, 'utf-8');const regex = /['"]?assets\/([^'"]+\.(png|jpg|jpeg|svg|gif|webp|ico))['"]?/g;let match;while ((match = regex.exec(content)) !== null) {usedFiles.add(match[1]);}});return usedFiles;
}// 检测未使用的文件
function getUnusedFiles() {const usedFiles = getUsedFiles();const allFiles = glob.sync(`${assetsDir}/**/*`, { nodir: true }).map((file) =>path.relative(assetsDir, file));const unusedFiles = allFiles.filter((file) => !usedFiles.has(file));return unusedFiles;
}// 删除未使用的文件
function deleteUnusedFiles(files) {files.forEach((file) => {const fullPath = path.join(assetsDir, file);fs.unlinkSync(fullPath);console.log(`删除文件:${fullPath}`);});
}const unusedFiles = getUnusedFiles();
if (unusedFiles.length > 0) {console.log('未使用的文件:', unusedFiles);// 提示用户是否删除const readline = require('readline').createInterface({input: process.stdin,output: process.stdout,});readline.question('是否删除未使用的文件?(y/n): ', (answer) => {if (answer.toLowerCase() === 'y') {deleteUnusedFiles(unusedFiles);console.log('未使用的文件已删除。');} else {console.log('未使用的文件未被删除。');}readline.close();});
} else {console.log('没有未使用的文件。');
}

使用方法:
将脚本保存为 detectUnusedFiles.js。
在项目目录中运行:

node detectUnusedFiles.js

前端性能报告生成

统计 dist 目录下的文件大小并生成报告。
遍历构建后的 dist 目录,读取文件大小。
计算各类文件的总大小,并按文件类型分类统计。
输出 JSON 格式的性能报告。

const fs = require('fs');
const path = require('path');
const glob = require('glob');const distDir = path.resolve(__dirname, '../dist'); // 构建目录// 获取文件大小
function getFileSize(filePath) {return fs.statSync(filePath).size;
}// 生成性能报告
function generatePerformanceReport() {const files = glob.sync(`${distDir}/**/*`, { nodir: true });const report = {totalSize: 0,fileTypeStats: {},files: [],};files.forEach((file) => {const size = getFileSize(file);const ext = path.extname(file).slice(1) || 'unknown';report.totalSize += size;if (!report.fileTypeStats[ext]) {report.fileTypeStats[ext] = 0;}report.fileTypeStats[ext] += size;report.files.push({file: path.relative(distDir, file),size: `${(size / 1024).toFixed(2)} KB`,});});const reportFile = path.join(distDir, 'performance-report.json');fs.writeFileSync(reportFile, JSON.stringify(report, null, 2));console.log(`性能报告已生成:${reportFile}`);
}generatePerformanceReport();

性能报告示例输出:

{"totalSize": 3502876,"fileTypeStats": {"js": 1203456,"css": 452876,"png": 145000,"html": 1000},"files": [{"file": "index.html","size": "1.00 KB"},{"file": "js/app.js","size": "1175.38 KB"}]
}

使用方法:
将脚本保存为 generatePerformanceReport.js。
在项目目录中运行:

node generatePerformanceReport.js

相关文章:

Node.js 助力前端开发:自动化操作实战

前端开发中&#xff0c;重复性任务如新建文件、配置路由、生成组件等&#xff0c;往往耗时且容易出错。借助 Node.js 的强大能力&#xff0c;我们可以实现开发过程中的自动化操作&#xff0c;提高效率。 文章目录 自动生成 router 配置文件自动生成组件模板动态构建导航菜单自…...

HuggingFace peft LoRA 微调 LLaMA

1. 安装必要库 pip install transformers peft accelerate2. 加载 LLaMA 模型和分词器 从 Hugging Face Transformers 加载预训练的 LLaMA 模型和分词器。 from transformers import AutoModelForCausalLM, AutoTokenizer# 加载 LLaMA 模型和分词器 model_name "meta-…...

记-编译magisk_v22

1) 下载源码 git clone gitgitee.com:MayuriNFC/Magisk.git 使用国内镜像站 2) 切换标签: git checkout v22.0 3)下载/更新依赖 git submodule initgit sumodule update 4)下载对应ndk(自动下载出错了,用了手动下载), wget -c https://dl.google.com/android/reposito…...

前端登录业务

1.用户登录成功拿到token&#xff0c;放在请求拦截器的请求头中&#xff0c;调用户接口才可以获取到用户信息&#xff0c;存储到仓库中&#xff0c;以便其他组件使用用户信息 2.退出登录需要清空用户数据&#xff0c;以及本地存储&#xff0c;调退出登录接口告诉服务器当前toke…...

项目2路由交换

背景 某学校为满足日常教学生活需求&#xff0c;推动数字校园的建设&#xff0c;学校有办公楼和学生宿舍楼和服务器集群三块区域&#xff0c;请合理规划IP地址和VLAN&#xff0c;实现企业内部能够互联互通现要求外网能通过公网地址访问服务器集群&#xff0c;学生和老师能正常…...

易语言 OCR 文字识别

一.引言 文字识别&#xff0c;也称为光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;&#xff0c;是一种将不同形式的文档&#xff08;如扫描的纸质文档、PDF文件或数字相机拍摄的图片&#xff09;中的文字转换成可编辑和可搜索的数据的技术。随着技…...

云手机+YouTube:改变通信世界的划时代技术

随着科技的不断进步&#xff0c;手机作为人们生活中不可或缺的工具&#xff0c;也在不断地更新换代。近年来&#xff0c;一个名为“油管云手机”的全新产品正在引起广泛的关注和讨论。作为一个运用最新科技实现的新型手机&#xff0c;它在通信领域带来了全新的体验和革命性的变…...

C++-----------映射

探索 C 中的映射与查找表 在 C 编程中&#xff0c;映射&#xff08;Map&#xff09;和查找表&#xff08;Lookup Table&#xff09;是非常重要的数据结构&#xff0c;它们能够高效地存储和检索数据&#xff0c;帮助我们解决各种实际问题。今天&#xff0c;我们就来深入探讨一下…...

清空DNS 缓存

如果遇到修改了host文件&#xff0c;但是IP和域名的映射有问题的情况&#xff0c;可以尝试刷新DNS缓存。 ipconfig/flushdns win建加R建&#xff0c;然后输入cmd&#xff0c;然后回车 然后回车&#xff0c;或者点击确定按钮。 出现如下所示标识清空DNS 缓存成功。...

计算机网络习题( 第3章 物理层 第4章 数据链路层 )

第3章 物理层 一、单选题 1、下列选项中&#xff0c;不属于物理层接口规范定义范畴的是&#xff08; &#xff09;。 A、 接口形状 B、 引脚功能 C、 传输媒体 D、 信号电平 正确答案&#xff1a; C 2、在物理层接口特性中&#xff0c;用于描述完成每种功能的事件发…...

UE5 崩溃问题汇总!!!

Using bundled DotNet SDK version: 6.0.302 ERROR: UnrealBuildTool.dll not found in "..\..\Engine\Binaries\DotNET\UnrealBuildTool\UnrealBuildTool.dll" 在你遇到这种极奇崩溃的BUG &#xff0c;难以解决的时候。 尝试了N种方法&#xff0c;都不行的解决方法。…...

基于ArcGIS Pro的SWAT模型在流域水循环、水生态模拟中的应用及案例分析;SWAT模型安装、运行到结果读取全流程指导

目前&#xff0c;流域水资源和水生态问题逐渐成为制约社会经济和环境可持续发展的重要因素。SWAT模型是一种基于物理机制的分布式流域水文与生态模拟模型&#xff0c;能够对流域的水循环过程、污染物迁移等过程进行精细模拟和量化分析。SWAT模型目前广泛应用于流域水文过程研究…...

Docker下TestHubo安装配置指南

TestHubo是一款开源免费的测试管理工具&#xff0c; 下面介绍Docker 私有部署的安装与配置。TestHubo 私有部署版本更适合有严格数据安全要求的企业&#xff0c;支持在本地或专属服务器上运行&#xff0c;以实现对数据和系统的完全控制。 1、Docker 服务端安装 Docker安装包下…...

AWS、Google Cloud Platform (GCP)、Microsoft Azure、Linode和 桔子数据 的 价格对比

要对比 AWS、Google Cloud Platform (GCP)、Microsoft Azure、Linode 和 桔子数据 的 价格&#xff0c;我们需要先了解每个平台的定价模型、服务类型以及不同服务之间的价格差异。以下是根据各个平台常见服务&#xff08;如计算实例、存储、数据传输等&#xff09;做的一个 简化…...

基础优化方法

梯度下降 学习率代表每一次沿着这个方向走多远&#xff0c; batchsize的概念 梯度下降通过不断沿着反梯度方向更新参数求解 两个重要的超参数是 batchsize 和 学习率...

v语言介绍

V 语言是一种多用途的编程语言&#xff0c;可以用于前端开发、后端开发、系统编程、游戏开发等多个领域。它的设计哲学是提供接近 C 语言的性能&#xff0c;同时简化开发过程并提高代码的安全性和可读性。接下来我会详细介绍 V 在前后端开发中的应用&#xff0c;并给出一个具体…...

Ubuntu安装Apache Airflow详细指南

本文我们介绍如何在Ubuntu上安装Apache Airflow。Apache Airflow旨在通过编程方式编写、调度和监控工作流。随着数据编排在现代数据工程中变得越来越重要&#xff0c;掌握Apache Airflow等工具可以显著提高您的生产力和效率。 学习Apache Airflow的首要任务是安装单机版本进行测…...

【数据可视化复习方向】

1.数据可视化就是数据中信息的可视化 2.数据可视化主要从数据中寻找三个方面的信息&#xff1a;模式、关系和异常 3.大数据可视化分类&#xff1a;科学可视化、信息可视化、可视分析学 4.大数据可视化作用&#xff1a;记录信息、分析推理、信息传播与协同 5.可视化流程&…...

CentOS下安装RabbitMQ

提示:“奔跑吧邓邓子” 的高效运维专栏聚焦于各类运维场景中的实际操作与问题解决。内容涵盖服务器硬件(如 IBM System 3650 M5)、云服务平台(如腾讯云、华为云)、服务器软件(如 Nginx、Apache、GitLab、Redis、Elasticsearch、Kubernetes、Docker 等)、开发工具(如 Gi…...

探究音频丢字位置和丢字时间对pesq分数的影响

丢字的本质 丢字的本质是在一段音频中一小段数据变为0 丢字对主观感受的影响 1. 丢字位置 丢字的位置对感知效果有很大影响。如果丢字发生在音频信号的静音部分或低能量部分&#xff0c;感知可能不明显&#xff1b;而如果丢字发生在高能量部分或关键音素上&#xff0c;感知…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...