您好,登錄后才能下訂單哦!
介紹
做前端的大家都知道通過 vue 開發的項目每次創建新組建的時候,都要新建一個目錄,然后新增 .vue 文件,在這個文件中再寫入 template 、 script 、 style 這些內容,雖然在寫入的時候大家都有自己的自動補全共計,不過這些都是模板性的,每次都要這樣重復操作,很麻煩有沒有。
本文就是通過node來幫助我們,自動去執行這些重復操作,而我們只需要告訴控制臺我們需要創建的組件名字就可以了。
本文自動創建的組件包含兩個文件:入口文件 index.js 、vue文件 main.vue
chalk工具
為了方便我們能看清控制臺輸出的各種語句,我們先安裝一下 chalk
npm install chalk --save-dev
1. 創建views
在根目錄中創建一個 scripts 文件夾
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 successLog = 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 componentName = '' process.stdin.on('data', async chunk => { // 組件名稱 const inputName = String(chunk).trim().toString() // Vue頁面組件路徑 const componentPath = resolve('../../src/views', inputName) // vue文件 const vueFile = resolve(componentPath, 'main.vue') // 入口文件 const entryFile = resolve(componentPath, 'entry.js') // 判斷組件文件夾是否存在 const hasComponentExists = fs.existsSync(componentPath) if (hasComponentExists) { errorLog(`${inputName}頁面組件已存在,請重新輸入`) return } else { log(`正在生成 component 目錄 ${componentPath}`) await dotExistDirectoryCreate(componentPath) } try { // 獲取組件名 if (inputName.includes('/')) { const inputArr = inputName.split('/') componentName = inputArr[inputArr.length - 1] } else { componentName = inputName } log(`正在生成 vue 文件 ${vueFile}`) await generateFile(vueFile, vueTemplate(componentName)) log(`正在生成 entry 文件 ${entryFile}`) await generateFile(entryFile, entryTemplate(componentName)) successLog('生成成功') } 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: compoenntName => { return `<template> <div class="${compoenntName}"> ${compoenntName}組件 </div> </template> <script> export default { name: '${compoenntName}' }; </script> <style lang="stylus" scoped> .${compoenntName} { }; </style>` }, entryTemplate: compoenntName => { return `import ${compoenntName} from './main.vue' export default [{ path: "/${compoenntName}", name: "${compoenntName}", component: ${compoenntName} }]` } }
1.1 配置package.json
"new:view": "node ./scripts/generateView/index"
如果使用 npm 的話 就是 npm run new:view
如果是 yarn 自行修改命令
1.2 結果
2. 創建component
跟views基本一樣的步驟
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 successLog = 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 componentName = '' process.stdin.on('data', async chunk => { const inputName = String(chunk).trim().toString() /** * 組件目錄路徑 */ const componentDirectory = resolve('../../src/components', inputName) /** * vue組件路徑 */ const componentVueName = resolve(componentDirectory, 'main.vue') /** * 入口文件路徑 */ const entryComponentName = resolve(componentDirectory, 'index.js') const hasComponentDirectory = fs.existsSync(componentDirectory) if (hasComponentDirectory) { errorLog(`${inputName}組件目錄已存在,請重新輸入`) return } else { log(`正在生成 component 目錄 ${componentDirectory}`) await dotExistDirectoryCreate(componentDirectory) // fs.mkdirSync(componentDirectory); } try { if (inputName.includes('/')) { const inputArr = inputName.split('/') componentName = inputArr[inputArr.length - 1] } else { componentName = inputName } log(`正在生成 vue 文件 ${componentVueName}`) await generateFile(componentVueName, vueTemplate(componentName)) log(`正在生成 entry 文件 ${entryComponentName}`) await generateFile(entryComponentName, entryTemplate) successLog('生成成功') } 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: compoenntName => { return `<template> <div class="${compoenntName}"> ${compoenntName}組件 </div> </template> <script> export default { name: '${compoenntName}' }; </script> <style lang="stylus" scoped> .${compoenntName} { }; </style>` }, entryTemplate: `import Main from './main.vue' export default Main` }
2.1 配置package.json
"new:comp": "node ./scripts/generateComponent/index"
2.2 結果
通過以上的 vue-cli3 優化,我們項目在開發的過程中就能非常方便的通過命令快速創建公共組件和其他頁面了,在頁面、組件比較多的項目中,可以為我們提高一些效率,也可以通過這樣的命令,來控制團隊內不同人員新建文件的格式規范。
總結
以上所述是小編給大家介紹的vue-cli3 項目優化之通過 node 自動生成組件模板 generate View、Component,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。