通过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 相关文章推荐
学习YUI.Ext 第六天--关于树TreePanel(Part 1)
Mar 10 Javascript
JavaScript delete 属性的使用
Oct 08 Javascript
基于JQuery的一句代码实现表格的简单筛选
Jul 26 Javascript
Jquery弹出窗口插件 LeanModal的使用方法
Mar 10 Javascript
javascript生成随机数的方法
May 16 Javascript
兼容最新firefox、chrome和IE的javascript图片预览实现代码
Aug 08 Javascript
JavaScript中函数声明与函数表达式的区别详解
Aug 18 Javascript
写jQuery插件时的注意点
Feb 20 Javascript
JS中原始值和引用值的储存方式示例详解
Mar 23 Javascript
jQuery 实现批量提交表格多行数据的方法
Aug 09 jQuery
Vue列表渲染的示例代码
Nov 01 Javascript
Layui Table js 模拟选中checkbox的例子
Sep 03 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 调试工具Debug Tools
2011/04/30 PHP
PHP获取文件的MD5值并判断是否被修改的例子
2014/06/19 PHP
PHP中rename()函数的妙用讲解
2019/02/28 PHP
让GoogleCode的SVN下的HTML文件在FireFox下正常显示.
2009/05/25 Javascript
用Javascript实现锚点(Anchor)间平滑跳转
2009/09/08 Javascript
关于图片的预加载过程中隐藏未知的
2012/12/19 Javascript
JavaScript中的比较操作符&gt;、=、
2014/12/31 Javascript
nodejs爬虫抓取数据之编码问题
2015/07/03 NodeJs
Linux下为Node.js程序配置MySQL或Oracle数据库的方法
2016/03/19 Javascript
jquery popupDialog 使用 加载jsp页面的方法
2016/10/25 Javascript
layer弹出层中H5播放器全屏出错的解决方法
2017/02/21 Javascript
解决VUE中document.body.scrollTop为0的问题
2018/09/15 Javascript
vue使用v-for实现hover点击效果
2018/09/29 Javascript
详解ESLint在Vue中的使用小结
2018/10/15 Javascript
Vue Router中应用中间件的方法
2020/08/06 Javascript
Python translator使用实例
2008/09/06 Python
Python如何发布程序的详细教程
2018/10/09 Python
Django管理员账号和密码忘记的完美解决方法
2018/12/06 Python
详解Python字符串切片
2019/05/20 Python
应用OpenCV和Python进行SIFT算法的实现详解
2019/08/21 Python
python 实现多维数组(array)排序
2020/02/28 Python
python 弧度与角度互转实例
2020/04/15 Python
python能做哪些生活有趣的事情
2020/09/09 Python
PyCharm2019.3永久激活破解详细图文教程,亲测可用(不定期更新)
2020/10/29 Python
CSS3动画:5种预载动画效果实例
2017/04/05 HTML / CSS
浅析border-radius如何兼容IE
2016/04/19 HTML / CSS
印度首个本地在线平台:nearbuy
2019/03/28 全球购物
斯图尔特·韦茨曼鞋加拿大官网:Stuart Weitzman加拿大
2019/10/13 全球购物
护士个人简历自荐信
2013/10/18 职场文书
社区党总支书记先进事迹材料
2014/01/24 职场文书
网络程序员自荐信
2014/01/25 职场文书
安全生产目标管理责任书
2014/07/25 职场文书
竞选班长演讲稿400字
2014/08/22 职场文书
档案工作个人总结
2015/03/03 职场文书
失恋33天观后感
2015/06/11 职场文书
tomcat下部署jenkins的方法
2022/05/06 Servers