vue-cli3 项目优化之通过 node 自动生成组件模板 generateView

介绍

做前端的大家都知道通过 vue 开发的项目每次创建新组建的时候,都要新建一个目录,然后新增 .vue 文件,在这个文件中再写入 templatescriptstyle 这些内容,虽然在写入的时候大家都有自己的自动补全共计,不过这些都是模板性的,每次都要这样重复操作,很麻烦有没有。

《vue-cli3 项目优化之通过 node 自动生成组件模板 generateView》

本文就是通过node来帮助我们,自动去执行这些重复操作,而我们只需要告诉控制台我们需要创建的组件名字就可以了。
本文自动创建的组件包含两个文件:入口文件 index.js 、vue文件 main.vue

《vue-cli3 项目优化之通过 node 自动生成组件模板 generateView》

1.1 chalk工具

为了方便我们能看清控制台输出的各种语句,我们先安装一下 chalk

npm install chalk --save-dev

1.2 创建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 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.3 配置package.json

"new:view": "node ./scripts/generateView/index"

如果使用 npm 的话 就是 npm run new:view
如果是 yarn 自行修改命令

1.4 结果

《vue-cli3 项目优化之通过 node 自动生成组件模板 generateView》

《vue-cli3 项目优化之通过 node 自动生成组件模板 generateView》

《vue-cli3 项目优化之通过 node 自动生成组件模板 generateView》

《vue-cli3 项目优化之通过 node 自动生成组件模板 generateView》

稍后再补上生成公用component的代码,基本差不多,改吧改吧就行了
《vue-cli3 项目优化之通过 node 自动生成组件模板 generateView》

    原文作者:多多ing
    原文地址: https://segmentfault.com/a/1190000018056163
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞