通过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 相关文章推荐
js或css文件后面跟参数的原因说明
Jan 09 Javascript
jQuery中live方法的重复绑定说明
Oct 21 Javascript
实现点击列表弹出列表索引的两种方式
Mar 08 Javascript
关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别
Oct 12 Javascript
jquery实现网页的页面平滑滚动效果代码
Nov 02 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)
Feb 16 Javascript
jQuery实现图片局部放大镜效果
Mar 17 Javascript
关于cookie的初识和运用(js和jq)
Apr 07 Javascript
关于js二维数组和多维数组的定义声明(详解)
Oct 02 Javascript
JavaScript实现构造json数组的方法分析
Aug 17 Javascript
微信小程序使用npm包的方法步骤
Aug 13 Javascript
Vue中axios拦截器如何单独配置token
Dec 27 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
一些操作和快捷键的理解和讨论
2020/03/04 星际争霸
2.PHP入门
2006/10/09 PHP
PHP新手上路(九)
2006/10/09 PHP
JS与PHP向函数传递可变参数的区别实例代码
2011/05/18 PHP
js限制checkbox勾选的个数以及php获取多个checkbbox的方法深入解析
2013/07/18 PHP
php中操作memcached缓存进行增删改查数据的实现代码
2014/08/15 PHP
使用Huagepage和PGO来提升PHP7的执行性能
2015/11/30 PHP
PHP去除空数组且数组键名重置的讲解
2019/02/28 PHP
PHP Redis扩展无法加载的问题解决方法
2019/08/22 PHP
Add a Formatted Table to a Word Document
2007/06/15 Javascript
封装好的省市地区联动控件附下载
2007/08/13 Javascript
如何使用jquery控制CSS样式,并且取消Css样式(如背景色,有实例)
2013/07/09 Javascript
js 自定义个性下拉选择框示例
2013/08/20 Javascript
基于BootStrap Metronic开发框架经验小结【四】Bootstrap图标的提取和利用
2016/05/12 Javascript
angular4中关于表单的校验示例
2017/10/16 Javascript
快速处理vue渲染前的显示问题
2018/03/05 Javascript
vue+Element-ui实现分页效果实例代码详解
2018/12/10 Javascript
Jquery使用each函数实现遍历及数组处理
2020/07/14 jQuery
vue中封装axios并实现api接口的统一管理
2020/12/25 Vue.js
[06:10]6.81新信使新套装!给你一个炫酷的DOTA2
2014/05/06 DOTA
Python实现批量把SVG格式转成png、pdf格式的代码分享
2014/08/21 Python
python 编程之twisted详解及简单实例
2017/01/28 Python
利用Python如何实现数据驱动的接口自动化测试
2018/05/11 Python
windows下pycharm安装、创建文件、配置默认模板
2018/07/31 Python
浅谈Python traceback的优雅处理
2018/08/31 Python
python暴力解压rar加密文件过程详解
2019/07/05 Python
Python可变参数会自动填充前面的默认同名参数实例
2019/11/18 Python
python pyecharts 实现一个文件绘制多张图
2020/05/13 Python
python dict如何定义
2020/09/02 Python
python中yield的用法详解
2021/01/13 Python
Python中lru_cache的使用和实现详解
2021/01/25 Python
Html5 postMessage实现跨域消息传递
2016/03/11 HTML / CSS
澳大利亚在线床零售商:Bedworks
2020/09/01 全球购物
如何开发安全的AJAX应用
2014/03/26 面试题
浪费资源的建议书
2014/03/12 职场文书
教师教育心得体会
2016/01/19 职场文书