博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component
阅读量:6965 次
发布时间:2019-06-27

本文共 6757 字,大约阅读时间需要 22 分钟。

介绍

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

本文就是通过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.jsconst 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.jsmodule.exports = {    vueTemplate: compoenntName => {        return `
` }, 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基本一样的步骤
  • 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 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.jsmodule.exports = {    vueTemplate: compoenntName => {        return `
` }, entryTemplate: `import Main from './main.vue'export default Main`}复制代码

2.1 配置package.json

"new:comp": "node ./scripts/generateComponent/index"复制代码

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

2.2 结果


通过以上的 vue-cli3 优化,我们项目在开发的过程中就能非常方便的通过命令快速创建公共组件和其他页面了,在页面、组件比较多的项目中,可以为我们提高一些效率,也可以通过这样的命令,来控制团队内不同人员新建文件的格式规范。

转载地址:http://fsdsl.baihongyu.com/

你可能感兴趣的文章
准备开始在51上写博了。
查看>>
介绍最新大片——程序员必看!
查看>>
云栖专辑|阿里开发者们的第二个感悟:PG大V德哥的使命感与开放心态
查看>>
重构职场竞争力之测试能力提升方法
查看>>
VS2005相关----整理起始页面板
查看>>
shop++商品搜索出现乱码的解决方法
查看>>
【转载】OSPF网络类型
查看>>
存储虚拟化大幅减少了宕机时间
查看>>
原型设计的一些事
查看>>
CentOS6.5-源码编译安装最新MySQL5.7.10
查看>>
maven创建项目
查看>>
docker技术剖析--docker资源限制及应用总结 for centos7.2
查看>>
Python学习笔记整理(十六)类的设计
查看>>
零代码如何打造自己的实时监控预警系统
查看>>
在 Windows 7 下安装 Hyper-V manager
查看>>
表:一对多,多对多
查看>>
mysql 4G内存配置表
查看>>
与servlet Api 的集成
查看>>
《排序算法系列一、简单选择排序》
查看>>
用户报告性能缓慢的解决流程
查看>>