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 相关文章推荐
javascript中的document.open()方法使用介绍
Oct 09 Javascript
node.js中的buffer.length方法使用说明
Dec 14 Javascript
jQuery常用数据处理方法小结
Feb 20 Javascript
JS从一组数据中找到指定的单条数据的方法
Jun 02 Javascript
总结Node.js中的一些错误类型
Aug 15 Javascript
BootstrapValidator超详细教程(推荐)
Dec 07 Javascript
vue省市区三联动下拉选择组件的实现
Apr 28 Javascript
vue axios登录请求拦截器
Apr 02 Javascript
详解开发react应用最好用的脚手架 create-react-app
Apr 24 Javascript
深入理解redux之compose的具体应用
Jan 12 Javascript
vue实现图片按比例缩放问题操作
Aug 11 Javascript
AJAX实现省市县三级联动效果
Oct 16 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数字格式化
2006/12/06 PHP
PHPMyAdmin 快速配置方法
2009/05/11 PHP
PHP高自定义性安全验证码代码
2011/11/27 PHP
In Javascript Class, how to call the prototype method.(three method)
2007/01/09 Javascript
用按钮控制iframe显示的网页实现方法
2013/02/04 Javascript
js跑步算法的实现代码
2013/12/04 Javascript
使用iframe window的scroll方法控制iframe页面滚动
2014/03/05 Javascript
使用jquery.upload.js实现异步上传示例代码
2014/07/29 Javascript
js动态切换图片的方法
2015/01/20 Javascript
JS实现兼容性好,自动置顶的淘宝悬浮工具栏效果
2015/09/18 Javascript
js操作XML文件的实现方法兼容IE与FireFox
2016/06/25 Javascript
最佳的JavaScript错误处理实践
2016/07/16 Javascript
jQuery实现的简单百分比进度条效果示例
2016/08/01 Javascript
浅谈JS之tagNaem和nodeName
2016/09/13 Javascript
jQuery EasyUI Panel面板组件使用详解
2017/02/28 Javascript
jquery实现一个全局计时器(商城可用)
2017/06/30 jQuery
javascript用rem来做响应式开发
2018/01/13 Javascript
Vue 页面权限控制和登陆验证功能的实例代码
2019/06/20 Javascript
Javascript实现鼠标移入方向感知
2020/06/24 Javascript
python利用dir函数查看类中所有成员函数示例代码
2017/09/08 Python
Python之自动获取公网IP的实例讲解
2017/10/01 Python
快速解决vue.js 模板和jinja 模板冲突的问题
2019/07/26 Python
Python3 io文本及原始流I/O工具用法详解
2020/03/23 Python
Python 如何在字符串中插入变量
2020/08/01 Python
深入了解Python装饰器的高级用法
2020/08/13 Python
使用Python快速打开一个百万行级别的超大Excel文件的方法
2021/03/02 Python
HTML5单页面手势滑屏切换原理
2016/03/21 HTML / CSS
波兰品牌鞋履在线商店:Eastend.pl
2020/01/11 全球购物
大四学年自我鉴定
2013/11/13 职场文书
夜班门卫岗位职责
2013/12/09 职场文书
优秀医生事迹材料
2014/02/12 职场文书
人力资源经理的岗位职责
2014/03/02 职场文书
计划生育证明书写要求
2014/09/17 职场文书
电力工程合作意向书
2015/05/11 职场文书
《抽屉原理》教学反思
2016/02/20 职场文书
一篇文章弄懂Python关键字、标识符和变量
2021/07/15 Python