通过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 相关文章推荐
jQuery 下拉列表 二级联动插件分享
Mar 29 Javascript
如何在一个页面显示多个百度地图
Apr 07 Javascript
使用firebug进行调试javascript的示例
Dec 16 Javascript
JQuery实现的购物车功能(可以减少或者添加商品并自动计算价格)
Jan 13 Javascript
JavaScript通过select动态更换图片的方法
Mar 23 Javascript
基于jQuery实现二级下拉菜单效果
Feb 01 Javascript
jQuery实现div跟随鼠标移动
Aug 20 jQuery
深入浅出webpack教程系列_安装与基本打包用法和命令参数详解
Sep 10 Javascript
vue使用axios跨域请求数据问题详解
Oct 18 Javascript
React中使用UEditor百度富文本的方法
Aug 22 Javascript
封装微信小程序http拦截器过程解析
Aug 13 Javascript
js模拟F11页面全屏显示
Sep 17 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
CI框架在CLI下执行占用内存过大问题的解决方法
2014/06/17 PHP
PHP将回调函数作用到给定数组单元的方法
2014/08/19 PHP
PHP微信开发之查询城市天气
2016/06/23 PHP
js 获取浏览器高度和宽度值(多浏览器)
2009/09/02 Javascript
javascript 数组学习资料收集
2010/04/11 Javascript
浅析JQuery UI Dialog的样式设置问题
2013/12/18 Javascript
node.js中的url.parse方法使用说明
2014/12/10 Javascript
JavaScript必知必会(七)js对象继承
2016/06/08 Javascript
js实现百度登录框鼠标拖拽效果
2017/03/07 Javascript
js+html5实现复制文字按钮
2017/07/15 Javascript
js图片放大镜实例讲解(必看篇)
2017/07/17 Javascript
浅谈angular.copy() 深拷贝
2017/09/14 Javascript
node前端开发模板引擎Jade的入门
2018/05/11 Javascript
JS实现模糊查询带下拉匹配效果
2018/06/21 Javascript
浅谈 Webpack 如何处理图片(开发、打包、优化)
2019/05/15 Javascript
前端天气插件tpwidget使用方法详解
2019/06/24 Javascript
JavaScript遍历数组的方法代码实例
2020/01/14 Javascript
Python跳出循环语句continue与break的区别
2014/08/25 Python
Python使用CMD模块更优雅的运行脚本
2015/05/11 Python
Ubuntu下安装PyV8
2016/03/13 Python
浅析Python中的for 循环
2016/06/09 Python
Python 获取ftp服务器文件时间的方法
2019/07/02 Python
Django对models里的objects的使用详解
2019/08/17 Python
基于python SMTP实现自动发送邮件教程解析
2020/06/02 Python
Python析构函数__del__定义原理解析
2020/11/20 Python
应用心理学个人求职信范文
2013/12/11 职场文书
优秀演讲稿范文
2013/12/29 职场文书
医学专业应届生的自我评价
2014/02/28 职场文书
大学校务公开实施方案
2014/03/31 职场文书
民主生活会批评与自我批评总结
2014/10/17 职场文书
安全生产工作汇报材料
2014/10/28 职场文书
《颐和园》教学反思
2016/02/19 职场文书
python爬虫--selenium模块
2021/03/31 Python
Nginx进程调度问题详解
2021/09/25 Servers
vue特效之翻牌动画
2022/04/20 Vue.js
MySQL的存储过程和相关函数
2022/04/26 MySQL