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,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,长沙网络推广会及时回复大家的!
编程语言
- 甘肃哪有关键词排名优化购买方式有哪些
- 甘肃SEO如何做网站优化
- 河南seo关键词优化怎么做电话营销
- 北京SEO优化如何做QQ群营销
- 来宾百度关键词排名:提升您网站曝光率的关键
- 卢龙关键词优化:提升您网站排名的策略与技巧
- 山东网站优化的注意事项有哪些
- 四川整站优化怎样提升在搜索引擎中的排名
- 疏附整站优化:提升网站性能与用户体验的全新
- 海南seo主要做什么工作售后服务要做到哪些
- 荣昌百度网站优化:提升您网站的搜索引擎排名
- 河北seo网站排名关键词优化如何做SEO
- 江西优化关键词排名推广售后保障一般有哪些
- 古浪SEO优化:提升你的网站可见性
- 西藏网站排名优化怎么把网站排名在百度首页
- 如何提升阳东百度快照排名:详尽指南