不知道大家每次新建組件的時候,是不是都要創建一個目錄,然后新增一個.vue文件,然后寫template、script、style這些東西,如果是公共組件,是不是還要新建一個index.js用來導出vue組件、雖然有vscode有代碼片段能實現自動補全,但還是很麻煩,今天靈活運用scripts工作流,自動生成vue文件和目錄。
實踐步驟
安裝一下chalk,這個插件能讓我們的控制臺輸出語句有各種顏色區分
npm install chalk --save-dev yarn add chalk --save-dev
在根目錄中創建一個 scripts 文件夾
新增一個generateComponent.js文件,放置生成組件的代碼
新增一個template.js文件,放置組件模板的代碼
template.js文件,里面的內容可以自己自定義,符合當前項目的模板即可
// template.jsmodule.exports = { vueTemplate: compoenntName => { return `<template> <div class="${compoenntName}"> ${compoenntName}組件 </div></template><script>export default { name: '${compoenntName}'}</script><style scoped lang="stylus" rel="stylesheet/stylus">.${compoenntName} {}</style>` }, entryTemplate: `import Main from './main.vue'export default Main`}
generateComponent.js生成vue目錄和文件的代碼
// generateComponent.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 _ = process.argv.splice(2)[0] === '-com'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) } }) })}// 公共組件目錄src/base,全局注冊組件目錄src/base/global,頁面組件目錄src/components_ ? log('請輸入要生成的組件名稱、如需生成全局組件,請加 global/ 前綴') : log('請輸入要生成的頁面組件名稱、會生成在 components/目錄下')let componentName = ''process.stdin.on('data', async chunk => { const inputName = String(chunk).trim().toString() // 根據不同類型組件分別處理 if (_) { // 組件目錄路徑 const componentDirectory = resolve('../src/base', 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) } 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) } } else { const inputArr = inputName.split('/') const directory = inputArr[0] let componentName = inputArr[inputArr.length - 1] // 頁面組件目錄 const componentDirectory = resolve('../src/components', directory) // vue組件 const componentVueName = resolve(componentDirectory, `${componentName}.vue`) const hasComponentDirectory = fs.existsSync(componentDirectory) if (hasComponentDirectory) { log(`${componentDirectory}組件目錄已存在,直接生成vue文件`) } else { log(`正在生成 component 目錄 ${componentDirectory}`) await dotExistDirectoryCreate(componentDirectory) } try { log(`正在生成 vue 文件 ${componentName}`) await generateFile(componentVueName, vueTemplate(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() }) }}
配置package.json,scripts新增兩行命令,其中-com是為了區別是創建頁面組件還是公共組件
"scripts": { "new:view":"node scripts/generateComponent", "new:com": "node scripts/generateComponent -com" },
執行
npm run new:view // 生成頁組件 npm run new:com // 生成基礎組件 或者 yarn run new:view // 生成頁組件 yarn run new:com // 生成基礎組件
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。
新聞熱點
疑難解答