作前端的你們都知道經過 vue
開發的項目每次建立新組建的時候,都要新建一個目錄,而後新增 .vue
文件,在這個文件中再寫入 template
、 script
、 style
這些內容,雖然在寫入的時候你們都有本身的自動補全共計,不過這些都是模板性的,每次都要這樣重複操做,很麻煩有沒有。前端
本文就是經過node
來幫助咱們,自動去執行這些重複操做,而咱們只須要告訴控制檯咱們須要建立的組件名字就能夠了。 本文自動建立的組件包含兩個文件:入口文件 index.js
、vue文件 main.vue
vue
爲了方便咱們能看清控制檯輸出的各類語句,咱們先安裝一下 chalk
npm install chalk --save-devnode
scripts
文件夾scripts
中建立 generateView
文件夾generateView
中新建 index.js
,放置生成組件的代碼generateView
中新建 template.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
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}
}]`
}
}
複製代碼
"new:view": "node ./scripts/generateView/index"
複製代碼
若是使用 npm
的話 就是 npm run new:view
若是是 yarn
自行修改命令vue-cli
scripts
中建立 generateComponent
文件夾generateComponent
中新建 index.js
,放置生成組件的代碼generateComponent
中新建 template.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
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`
}
複製代碼
"new:comp": "node ./scripts/generateComponent/index"
複製代碼
若是使用 npm
的話 就是 npm run new:comp
若是是 yarn
自行修改命令npm
經過以上的 vue-cli3 優化,咱們項目在開發的過程當中就能很是方便的經過命令快速建立公共組件和其餘頁面了,在頁面、組件比較多的項目中,能夠爲咱們提升一些效率,也能夠經過這樣的命令,來控制團隊內不一樣人員新建文件的格式規範。json