当前位置: 首页 > news >正文

通过npm或yarn自动生成vue组件

不知道大家每次新建组件的时候,是不是都要创建一个目录,然后新增一个.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 // 生成基础组件

clipboard.png

相关文章:

  • EOS是什么
  • 互联网大厂Java面试题:使用无界队列的线程池会导致内存飙升吗?
  • App Store 隐私政策网址(URL)
  • 企业级java springboot b2bc商城系统开源源码二次开发(十六)用restTemplate消费服务...
  • GraphQL 官方自述文档(翻译)
  • 网页视频流m3u8/ts视频下载
  • OS开发基础——多线程的简单应用
  • 阿里云ACE认证学习知识点梳理
  • 二、flask配置与应用-flask
  • Linux下的计算器(bc、expr、dc、echo、awk)知多少?
  • CH2601 电路维修(双端队列bfs)建图恶心
  • 新书推荐|Windows黑客编程技术详解
  • 大主子表关联的性能优化方法
  • 5G一周热闻:华为夺联通5G大单,首张5G电话卡发放
  • einx 1.0 发布,golang 游戏服务器框架
  • angular2开源库收集
  • hadoop集群管理系统搭建规划说明
  • HTTP中GET与POST的区别 99%的错误认识
  • Java多态
  • Java新版本的开发已正式进入轨道,版本号18.3
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • nginx 配置多 域名 + 多 https
  • nodejs调试方法
  • node和express搭建代理服务器(源码)
  • PHP CLI应用的调试原理
  • Python十分钟制作属于你自己的个性logo
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Redis字符串类型内部编码剖析
  • Sass 快速入门教程
  • TCP拥塞控制
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • vue中实现单选
  • 大型网站性能监测、分析与优化常见问题QA
  • 强力优化Rancher k8s中国区的使用体验
  • 怎么把视频里的音乐提取出来
  • nb
  • 通过调用文摘列表API获取文摘
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ###C语言程序设计-----C语言学习(6)#
  • #git 撤消对文件的更改
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (二)斐波那契Fabonacci函数
  • (二十四)Flask之flask-session组件
  • (过滤器)Filter和(监听器)listener
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (十一)手动添加用户和文件的特殊权限
  • (一)Neo4j下载安装以及初次使用
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • *** 2003
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .CSS-hover 的解释