通过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获取url参数值的两种方式
Sep 10 Javascript
jQuery Mobile 导航栏代码
Nov 01 Javascript
js调用iframe实现打印页面内容的方法
Mar 04 Javascript
JavaScript简单实现鼠标拖动选择功能
Mar 06 Javascript
js使用DOM操作实现简单留言板的方法
Apr 10 Javascript
使用Jasmine和Karma对AngularJS页面程序进行测试
Mar 05 Javascript
Bootstrap table分页问题汇总
May 30 Javascript
jQuery 中ajax异步调用的四种方式
Jun 28 Javascript
js实现类bootstrap模态框动画
Feb 07 Javascript
基于JavaScript实现图片剪切效果
Mar 07 Javascript
vue用递归组件写树形控件的实例代码
Jul 19 Javascript
浅谈Vue数据响应思路之数组
Nov 06 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
Android App中DrawerLayout抽屉效果的菜单编写实例
2016/03/21 PHP
非常经典的PHP文件上传类分享
2016/05/15 PHP
Linux平台php命令行程序处理管道数据的方法
2016/11/10 PHP
IIS 7.5 asp Session超时时间设置方法
2017/04/17 PHP
ajax调用返回php接口返回json数据的方法(必看篇)
2017/05/05 PHP
Ubuntu上安装yaf扩展的方法
2018/01/29 PHP
用javascript实现在小方框中浏览大图的代码
2007/08/14 Javascript
Javascript根据指定下标或对象删除数组元素
2012/12/21 Javascript
jquery 为a标签绑定click事件示例代码
2014/06/23 Javascript
jQuery+ajax实现鼠标单击修改内容的思路
2014/06/29 Javascript
javascript实现table选中的行以指定颜色高亮显示的方法
2015/05/13 Javascript
jQuery无刷新分页完整实例代码
2015/10/27 Javascript
深入浅析JavaScript中prototype和proto的关系
2015/11/15 Javascript
JavaScript截取、切割字符串的技巧
2016/01/07 Javascript
JavaScript学习笔记之数组去重
2016/03/23 Javascript
Angular的$http与$location
2016/12/26 Javascript
js判断是否是手机页面
2017/03/17 Javascript
ES6(ECMAScript 6)新特性之模板字符串用法分析
2017/04/01 Javascript
JavaScript 自定义事件之我见
2017/09/25 Javascript
Angularjs实现控制器之间通信方式实例总结
2018/03/27 Javascript
解决循环中setTimeout执行顺序的问题
2018/06/20 Javascript
vue 使用自定义指令实现表单校验的方法
2018/08/28 Javascript
vue全局使用axios的方法实例详解
2018/11/22 Javascript
VUE简单的定时器实时刷新的实现方法
2019/01/20 Javascript
Python爬虫爬取一个网页上的图片地址实例代码
2018/01/16 Python
canvas需要在标签里直接定义宽高
2014/12/17 HTML / CSS
iframe与window.onload如何使用详解
2020/05/07 HTML / CSS
购买一个高级域名:BuyDomains
2018/03/11 全球购物
运动会演讲稿300字
2014/08/25 职场文书
2014年四风问题个人对照自查剖析材料
2014/09/15 职场文书
中职毕业生自我鉴定范文(3篇)
2014/09/28 职场文书
2014年污水处理厂工作总结
2014/12/19 职场文书
晚会闭幕词
2015/01/28 职场文书
市级三好生竞选稿
2015/11/21 职场文书
html+css实现分层金字塔的实例
2021/06/02 HTML / CSS
Win11 Build 22000.829更新补丁KB5015882发布(附更新修复内容汇总)
2022/07/15 数码科技