vue-cli3 项目优化之通过 node 自动生成组件模板
介绍
做前端的大家都知道通过 vue 开发的项目每次创建新组建的时候,都要新建一个目录,然后新增 .vue 文件,在这个文件中再写入 template 、 script 、 style 这些内容,虽然在写入的时候大家都有自己的自动补全共计,不过这些都是模板性的,每次都要这样重复操作,很麻烦有没有。
本文就是通过node来帮助我们,自动去执行这些重复操作,而我们只需要告诉控制台我们需要创建的组件名字就可以了。
本文自动创建的组件包含两个文件入口文件 index.js 、vue文件 main.vue
chalk工具
为了方便我们能看清控制台输出的各种语句,我们先安装一下 chalk
npm install chalk --save-dev
1. 创建views
在根目录中创建一个 scripts 文件夹
- 在 scripts 中创建 generateView 文件夹
- 在 generateView 中新建 index.js ,放置生成组件的代码
- 在 generateView 中新建 template.js ,放置组件模板的代码,模板内容可根据项目需求自行修改
index.js
// index.js const chalk = require('chalk') const path = require('path') const fs = require('fs') const resolve = (...file) => path.resolve(__dirname, ...file) const log = message => console.log(chalk.green(`${message}`)) const suessLog = message => console.log(chalk.blue(`${message}`)) const errorLog = error => console.log(chalk.red(`${error}`)) // 导入模板 const { vueTemplate, entryTemplate } = require('./template') // 生成文件 const generateFile = (path, data) => { if (fs.existsSync(path)) { errorLog(`${path}文件已存在`) return } return new Promise((resolve, reject) => { fs.writeFile(path, data, 'utf8', err => { if (err) { errorLog(err.message) reject(err) } else { resolve(true) } }) }) } log('请输入要生成的页面组件名称、会生成在 views/目录下') let ponentName = '' process.stdin.on('data', async chunk => { // 组件名称 const inputName = String(chunk).trim().toString() // Vue页面组件路径 const ponentPath = resolve('../../src/views', inputName) // vue文件 const vueFile = resolve(ponentPath, 'main.vue') // 入口文件 const entryFile = resolve(ponentPath, 'entry.js') // 判断组件文件夹是否存在 const hasComponentExists = fs.existsSync(ponentPath) if (hasComponentExists) { errorLog(`${inputName}页面组件已存在,请重新输入`) return } else { log(`正在生成 ponent 目录 ${ponentPath}`) await dotExistDirectoryCreate(ponentPath) } try { // 获取组件名 if (inputName.includes('/')) { const inputArr = inputName.split('/') ponentName = inputArr[inputArr.length - 1] } else { ponentName = inputName } log(`正在生成 vue 文件 ${vueFile}`) await generateFile(vueFile, vueTemplate(ponentName)) log(`正在生成 entry 文件 ${entryFile}`) await generateFile(entryFile, entryTemplate(ponentName)) suessLog('生成成功') } catch (e) { errorLog(e.message) } process.stdin.emit('end') }) process.stdin.on('end', () => { log('exit') process.exit() }) function dotExistDirectoryCreate(directory) { return new Promise((resolve) => { mkdirs(directory, function() { resolve(true) }) }) } // 递归创建目录 function mkdirs(directory, callback) { var exists = fs.existsSync(directory) if (exists) { callback() } else { mkdirs(path.dirname(directory), function() { fs.mkdirSync(directory) callback() }) } }
template.js
// template.js module.exports = { vueTemplate: poenntName => { return `<template> <div class="${poenntName}"> ${poenntName}组件 </div> </template> <script> export default { name: '${poenntName}' }; </script> <style lang="stylus" scoped> .${poenntName} { }; </style>` }, entryTemplate: poenntName => { return `import ${poenntName} from './main.vue' export default [{ path: "/${poenntName}", name: "${poenntName}", ponent: ${poenntName} }]` } }
1.1 配置package.json
"new:view": "node ./scripts/generateView/index"
如果使用 npm 的话 就是 npm run new:view
如果是 yarn 自行修改命令
1.2 结果
2. 创建ponent
跟views基本一样的步骤
- 在 scripts 中创建 generateComponent 文件夹
- 在 generateComponent 中新建 index.js ,放置生成组件的代码
- 在 generateComponent 中新建 template.js ,放置组件模板的代码,模板内容可根据项目需求自行修改
index.js
// index.js` const chalk = require('chalk') const path = require('path') const fs = require('fs') const resolve = (...file) => path.resolve(__dirname, ...file) const log = message => console.log(chalk.green(`${message}`)) const suessLog = message => console.log(chalk.blue(`${message}`)) const errorLog = error => console.log(chalk.red(`${error}`)) const { vueTemplate, entryTemplate } = require('./template') const generateFile = (path, data) => { if (fs.existsSync(path)) { errorLog(`${path}文件已存在`) return } return new Promise((resolve, reject) => { fs.writeFile(path, data, 'utf8', err => { if (err) { errorLog(err.message) reject(err) } else { resolve(true) } }) }) } log('请输入要生成的组件名称、如需生成全局组件,请加 global/ 前缀') let ponentName = '' process.stdin.on('data', async chunk => { const inputName = String(chunk).trim().toString() / 组件目录路径 / const ponentDirectory = resolve('../../src/ponents', inputName) / vue组件路径 / const ponentVueName = resolve(ponentDirectory, 'main.vue') / 入口文件路径 / const entryComponentName = resolve(ponentDirectory, 'index.js') const hasComponentDirectory = fs.existsSync(ponentDirectory) if (hasComponentDirectory) { errorLog(`${inputName}组件目录已存在,请重新输入`) return } else { log(`正在生成 ponent 目录 ${ponentDirectory}`) await dotExistDirectoryCreate(ponentDirectory) // fs.mkdirSync(ponentDirectory); } try { if (inputName.includes('/')) { const inputArr = inputName.split('/') ponentName = inputArr[inputArr.length - 1] } else { ponentName = inputName } log(`正在生成 vue 文件 ${ponentVueName}`) await generateFile(ponentVueName, vueTemplate(ponentName)) log(`正在生成 entry 文件 ${entryComponentName}`) await generateFile(entryComponentName, entryTemplate) suessLog('生成成功') } catch (e) { errorLog(e.message) } process.stdin.emit('end') }) process.stdin.on('end', () => { log('exit') process.exit() }) function dotExistDirectoryCreate(directory) { return new Promise((resolve) => { mkdirs(directory, function() { resolve(true) }) }) } // 递归创建目录 function mkdirs(directory, callback) { var exists = fs.existsSync(directory) if (exists) { callback() } else { mkdirs(path.dirname(directory), function() { fs.mkdirSync(directory) callback() }) } }
template.js
// template.js module.exports = { vueTemplate: poenntName => { return `<template> <div class="${poenntName}"> ${poenntName}组件 </div> </template> <script> export default { name: '${poenntName}' }; </script> <style lang="stylus" scoped> .${poenntName} { }; </style>` }, entryTemplate: `import Main from './main.vue' export default Main` }
2.1 配置package.json
"new:p": "node ./scripts/generateComponent/index"
- 如果使用 npm 的话 就是 npm run new:p
- 如果是 yarn 自行修改命令
2.2 结果
通过以上的 vue-cli3 优化,我们项目在开发的过程中就能非常方便的通过命令快速创建公共组件和其他页面了,在页面、组件比较多的项目中,可以为我们提高一些效率,也可以通过这样的命令,来控制团队内不同人员新建文件的格式规范。
以上所述是长沙网络推广给大家介绍的vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,长沙网络推广会及时回复大家的!
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程