通过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 相关文章推荐
DEFER怎么用?
Jul 01 Javascript
jQuery EasyUI API 中文文档 - Tabs标签页/选项卡
Oct 01 Javascript
通过$(this)使用jQuery包装后的方法或属性
May 18 Javascript
JS的事件绑定深入认识
Jun 26 Javascript
用简洁的jQuery方法toggleClass实现隔行换色
Oct 22 Javascript
jsonp跨域请求数据实现手机号码查询实例分析
Dec 12 Javascript
AngularJS基础 ng-href 指令用法
Aug 01 Javascript
微信小程序 input输入框详解及简单实例
Jan 10 Javascript
jQuery 1.9版本以上的浏览器判断方法代码分享
Aug 28 jQuery
在vue项目中使用Nprogress.js进度条的方法
Jan 31 Javascript
Node.js Buffer用法解读
May 18 Javascript
JavaScript防止全局变量污染的方法总结
Aug 02 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
PHP的一个完美GIF等比缩放类,附带去除缩放黑背景
2014/04/01 PHP
PHP快速生成各种信息提示框的方法
2016/02/03 PHP
php截取视频指定帧为图片
2016/05/16 PHP
找到了一篇jQuery与Prototype并存的冲突的解决方法
2007/08/29 Javascript
JavaScript 获取当前时间戳的代码
2010/08/05 Javascript
jquery Moblie入门—hello world的示例代码学习
2013/01/08 Javascript
JS获取后台Cookies值的小例子
2013/03/04 Javascript
Javascript Throttle &amp; Debounce应用介绍
2013/03/19 Javascript
判定是否原生方法的JS代码
2013/11/12 Javascript
键盘KeyCode值列表汇总
2013/11/26 Javascript
解析JavaScript中的不可见数据类型
2013/12/02 Javascript
jQuery 计算iframe 窗口大小的方法
2014/05/13 Javascript
Webpack 实现 AngularJS 的延迟加载
2016/03/02 Javascript
Angular.js实现多个checkbox只能选择一个的方法示例
2017/02/24 Javascript
vue-router 前端路由之路由传值的方式详解
2019/04/30 Javascript
json字符串对象转换代码实例
2019/09/28 Javascript
jQuery实现html可联动的百分比进度条
2020/03/26 jQuery
vue - props 声明数组和对象操作
2020/07/30 Javascript
9个JavaScript日常开发小技巧
2020/10/06 Javascript
[01:02:25]2014 DOTA2华西杯精英邀请赛5 24 NewBee VS VG
2014/05/25 DOTA
Python的函数的一些高阶特性
2015/04/27 Python
python排序方法实例分析
2015/04/30 Python
python/sympy求解矩阵方程的方法
2018/11/08 Python
python框架flask表单实现详解
2019/11/04 Python
Python合并2个字典成1个新字典的方法(9种)
2019/12/19 Python
python nohup 实现远程运行不宕机操作
2020/04/16 Python
使用python编写一个语音朗读闹钟功能的示例代码
2020/07/14 Python
HTML5计时器小例子
2013/10/15 HTML / CSS
HTML5中判断用户是否正在浏览页面的方法
2014/05/03 HTML / CSS
详解HTML5常用的语义化标签
2019/09/27 HTML / CSS
白宫黑市官网:White House Black Market
2016/11/17 全球购物
资源工程专业毕业生求职信
2014/02/27 职场文书
ktv好的活动方案
2014/08/15 职场文书
离婚承诺书格式范文
2015/05/04 职场文书
opencv 分类白天与夜景视频的方法
2021/06/05 Python
Java 多态分析
2022/04/26 Java/Android