vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component


Posted in Javascript onApril 30, 2019

介绍

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

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

vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component

chalk工具

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

npm install chalk --save-dev

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

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

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

1.2 结果

vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component

vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component

vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component

vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component

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.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"

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

2.2 结果

vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component

vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component

vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component

vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component

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

总结

以上所述是小编给大家介绍的vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
基于jquery的给文章加入关键字链接
Oct 26 Javascript
javascript三元运算符用法实例
Apr 16 Javascript
微信小程序 后台https域名绑定和免费的https证书申请详解
Nov 10 Javascript
JS实现的简单轮播图运动效果示例
Dec 22 Javascript
Angular 2父子组件数据传递之@Input和@Output详解 (上)
Jul 05 Javascript
webpack 1.x升级过程中的踩坑总结大全
Aug 09 Javascript
vue-content-loader内容加载器的使用方法
Aug 05 Javascript
vue实现在一个方法执行完后执行另一个方法的示例
Aug 25 Javascript
vue中axios请求的封装实例代码
Mar 23 Javascript
JS获取本地地址及天气的方法实例小结
May 10 Javascript
jQuery Raty星级评分插件使用方法实例分析
Nov 25 jQuery
Vue中通过属性绑定为元素绑定style行内样式的实例代码
Apr 30 Javascript
微信小程序时间戳转日期的详解
Apr 30 #Javascript
使用 Vue cli 3.0 构建自定义组件库的方法
Apr 30 #Javascript
vue自动路由-单页面项目(非build时构建)
Apr 30 #Javascript
vue-router 前端路由之路由传值的方式详解
Apr 30 #Javascript
微信小程序页面间传值与页面取值操作实例分析
Apr 30 #Javascript
vue2.0基于vue-cli+element-ui制作树形treeTable
Apr 30 #Javascript
微信小程序常用赋值方法小结
Apr 30 #Javascript
You might like
PHP连接access数据库
2008/03/27 PHP
PHP的简易冒泡法代码分享
2012/08/28 PHP
探讨:如何编写PHP扩展
2013/06/13 PHP
php实现mysql备份恢复分卷处理的方法
2014/12/26 PHP
php使用函数pathinfo()、parse_url()和basename()解析URL
2016/11/25 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
PHP判断是否是微信打开,浏览器打开的方法
2018/03/14 PHP
Laravel5.1框架路由分组用法实例分析
2020/01/04 PHP
Cookie跨域问题解决方案代码示例
2020/11/24 PHP
JavaScript While 循环基础教程
2007/04/05 Javascript
关于JavaScript与HTML的交互事件
2013/04/12 Javascript
Jquery Uploadify多文件上传带进度条且传递自己的参数
2013/08/28 Javascript
jquery获取checkbox的值并post提交
2015/01/14 Javascript
学习JavaScript设计模式(链式调用)
2015/11/26 Javascript
JavaScript类型检测之typeof 和 instanceof 的缺陷与优化
2016/01/13 Javascript
Kendo Grid editing 自定义验证报错提示的解决方法
2016/11/18 Javascript
JS中如何实现点击a标签返回页面顶部的问题
2017/01/19 Javascript
vue cli使用绝对路径引用图片问题的解决
2017/12/06 Javascript
在vue项目中,使用axios跨域处理
2018/03/07 Javascript
Vue组件中prop属性使用说明实例代码详解
2018/05/31 Javascript
vue脚手架搭建项目的兼容性配置详解
2018/07/17 Javascript
解决layui-table单元格设置为百分比在ie8下不能自适应的问题
2019/09/28 Javascript
js校验开始时间和结束时间
2020/05/26 Javascript
node中短信api实现验证码登录的示例代码
2021/01/20 Javascript
[59:44]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 paiN vs iG
2018/03/31 DOTA
Python中利用原始套接字进行网络编程的示例
2015/05/04 Python
关于Python 3中print函数的换行详解
2017/08/08 Python
详解python中的json和字典dict
2018/06/22 Python
python+splinter实现12306网站刷票并自动购票流程
2018/09/25 Python
python求最大值,不使用内置函数的实现方法
2019/07/09 Python
Python利用PyExecJS库执行JS函数的案例分析
2019/12/18 Python
HTML5+WebSocket实现多文件同时上传的实例
2016/12/29 HTML / CSS
入党积极分子自我鉴定
2014/02/18 职场文书
党员干部承诺书
2014/03/25 职场文书
介绍信怎么写
2015/05/05 职场文书
零基础学java之带返回值的方法的定义和调用
2022/04/10 Java/Android