通过npm或yarn自动生成vue组件的方法示例


Posted in Javascript onFebruary 12, 2019

不知道大家每次新建组件的时候,是不是都要创建一个目录,然后新增一个.vue文件,然后写template、script、style这些东西,如果是公共组件,是不是还要新建一个index.js用来导出vue组件、虽然有vscode有代码片段能实现自动补全,但还是很麻烦,今天灵活运用scripts工作流,自动生成vue文件和目录。

实践步骤

安装一下chalk,这个插件能让我们的控制台输出语句有各种颜色区分

npm install chalk --save-dev 
yarn add chalk --save-dev

在根目录中创建一个 scripts 文件夹

新增一个generateComponent.js文件,放置生成组件的代码

新增一个template.js文件,放置组件模板的代码

template.js文件,里面的内容可以自己自定义,符合当前项目的模板即可

// template.js
module.exports = {
 vueTemplate: compoenntName => {
  return `<template>
 <div class="${compoenntName}">
  ${compoenntName}组件
 </div>
</template>

<script>
export default {
 name: '${compoenntName}'
}
</script>

<style scoped lang="stylus" rel="stylesheet/stylus">
.${compoenntName} {

}
</style>

`
 },
 entryTemplate: `import Main from './main.vue'
export default Main`
}

generateComponent.js生成vue目录和文件的代码

// generateComponent.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 _ = process.argv.splice(2)[0] === '-com'

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)
   }
  })
 })
}

// 公共组件目录src/base,全局注册组件目录src/base/global,页面组件目录src/components
_ ? log('请输入要生成的组件名称、如需生成全局组件,请加 global/ 前缀') : log('请输入要生成的页面组件名称、会生成在 components/目录下')
let componentName = ''
process.stdin.on('data', async chunk => {
 const inputName = String(chunk).trim().toString()

 // 根据不同类型组件分别处理
 if (_) {
  // 组件目录路径
  const componentDirectory = resolve('../src/base', 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)
  }

  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)
  }
 } else {
  const inputArr = inputName.split('/')
  const directory = inputArr[0]
  let componentName = inputArr[inputArr.length - 1]

  // 页面组件目录
  const componentDirectory = resolve('../src/components', directory)

  // vue组件
  const componentVueName = resolve(componentDirectory, `${componentName}.vue`)

  const hasComponentDirectory = fs.existsSync(componentDirectory)
  if (hasComponentDirectory) {
   log(`${componentDirectory}组件目录已存在,直接生成vue文件`)
  } else {
   log(`正在生成 component 目录 ${componentDirectory}`)
   await dotExistDirectoryCreate(componentDirectory)
  }

  try {
   log(`正在生成 vue 文件 ${componentName}`)
   await generateFile(componentVueName, vueTemplate(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()
  })
 }
}

配置package.json,scripts新增两行命令,其中-com是为了区别是创建页面组件还是公共组件

"scripts": {
  "new:view":"node scripts/generateComponent",
  "new:com": "node scripts/generateComponent -com"
 },

执行

npm run new:view // 生成页组件
  npm run new:com // 生成基础组件
  或者
  yarn run new:view // 生成页组件
  yarn run new:com // 生成基础组件

通过npm或yarn自动生成vue组件的方法示例

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
XHTML-Strict 内允许出现的标签
Dec 11 Javascript
javascript学习笔记(三) String 字符串类型介绍
Jun 19 Javascript
基于jquery的9行js轻松实现tab控件示例
Oct 12 Javascript
JavaScript中的函数的两种定义方式和函数变量赋值
May 12 Javascript
javascript使用正则表达式实现去掉空格之后的字符
Feb 15 Javascript
禁止按回车键提交表单的方法
Jun 11 Javascript
浅析AngularJs HTTP响应拦截器
Dec 28 Javascript
jQuery快速实现商品数量加减的方法
Feb 06 Javascript
Angular使用Md5加密的解决方法
Sep 16 Javascript
原生JS实现萤火虫效果
Mar 07 Javascript
基于Vue CSR的微前端实现方案实践
May 27 Javascript
Element Steps步骤条的使用方法
Jul 26 Javascript
js实现json数组分组合并操作示例
Feb 12 #Javascript
vue文件运行的方法教学
Feb 12 #Javascript
vue的for循环使用方法
Feb 12 #Javascript
JavaScript常用工具方法封装
Feb 12 #Javascript
vue组件开发props验证的实现
Feb 12 #Javascript
Vue 组件参数校验与非props特性的方法
Feb 12 #Javascript
从组件封装看Vue的作用域插槽的实现
Feb 12 #Javascript
You might like
thinkphp3.0 模板中函数的使用
2012/11/13 PHP
PHP中header和session_start前不能有输出原因分析
2013/01/11 PHP
如何在Ubuntu下启动Apache的Rewrite功能
2013/07/05 PHP
PHP函数积累总结
2019/03/19 PHP
jQuery 1.2.x 升? 1.3.x 注意事项
2009/05/06 Javascript
JavaScript高级程序设计 事件学习笔记
2011/09/10 Javascript
Extjs单独定义各组件的实例代码
2013/06/25 Javascript
javascript实现炫酷的拖动分页
2015/05/11 Javascript
jQuery实现简单下拉导航效果
2015/09/07 Javascript
解决js函数闭包内存泄露问题的办法
2016/01/25 Javascript
正则中的回溯定义与用法分析【JS与java实现】
2016/12/27 Javascript
bootstrap paginator分页前后台用法示例
2017/06/17 Javascript
js+html5实现侧滑页面效果
2017/07/15 Javascript
React-Native中props具体使用详解
2017/09/04 Javascript
vue实现点击关注后及时更新列表功能
2018/06/26 Javascript
jquery 通过ajax请求获取后台数据显示在表格上的方法
2018/08/08 jQuery
JavaScript碎片—函数闭包(模拟面向对象)
2019/03/13 Javascript
微信小程序tabBar 返回tabBar不刷新页面
2019/07/25 Javascript
javascript中this的用法实践分析
2019/07/29 Javascript
vue keep-alive列表页缓存 详情页返回上一页不刷新,定位到之前位置
2019/11/26 Javascript
python&amp;MongoDB爬取图书馆借阅记录
2016/02/05 Python
python实现class对象转换成json/字典的方法
2016/03/11 Python
浅谈Python由__dict__和dir()引发的一些思考
2017/10/30 Python
python3获取两个日期之间所有日期,以及比较大小的实例
2018/04/08 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
2020/06/09 Python
基于canvas使用贝塞尔曲线平滑拟合折线段的方法
2018/01/10 HTML / CSS
Html5页面二次分享的实现
2018/07/30 HTML / CSS
阿里巴巴国际站:Alibaba.com
2016/07/21 全球购物
爱游人:Travelliker
2017/09/05 全球购物
部门经理迟到检讨书
2015/02/16 职场文书
西游记读书笔记
2015/06/25 职场文书
小学开学典礼新闻稿
2015/07/17 职场文书
机械生产实习心得体会
2016/01/22 职场文书
基于Redis延迟队列的实现代码
2021/05/13 Redis
MySQL系列之十三 MySQL的复制
2021/07/02 MySQL
磁贴还没死, 微软Win11可修改注册表找回Win10开始菜单
2021/11/21 数码科技