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

更新日期: 2019-02-12阅读: 3.1k标签: yarn

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


来自:https://segmentfault.com/a/1190000018123763


链接: https://fly63.com/article/detial/1977

Yarn vs npm: 你需要知道的一切

Yarn 是 Facebook, Google, Exponent 和 Tilde 开发的一款新的 JavaScript 包管理工具。它的目的是解决这些团队使用 npm 面临的少数问题,即:安装的时候无法保证速度/一致性,安全问题,因为 npm 安装时允许运行代码

yarn和npm的区别对比_比较npm和yarn 命令行

npm 是目前js最流行的包管理工具,通过 npm 可以安装、共享、分发代码,管理项目依赖关系。Yarn 是为了弥补 npm 的一些缺陷而出现的,Yarn 定位为快速、可靠、安全的依赖管理工具。

Bun 炒作的太火了,不过是另一个 yarn 的故事?

我们又要犯同样的错误了。我经常被提醒,每 5 年世界上的程序员数量就会翻一番,这意味着任何时候,有 50%的行业人员经验都不到 5 年。这可能就是为什么我们会一次又一次地被类似 Bun 这样的东西搅局的原因

npm 和 yarn 你选哪个?

每个团队都必须在开发过程中做出各种决定。其中通常会涉及到 yarn,npm 或其它用于构建和打包 javascript 代码的工具。一些开发人员渴望朝着某个方向前进

Windows下Yarn安装与使用

输入yarn -version 可以看到版本号,说明安装成功了。我们就可以在项目中像使用npm一样使用yarn了

细说包管理器yarn和npm

在过去,一个简单的文本编辑器就足以让开发人员创建和管理大部分项目。但从那以后,WEB发生了翻天覆地的变化,如今,即使是一个相当简单的项目,通常也会有成百上千个带有复杂嵌套依赖关系的脚本,如果没有自动化工具,这些脚本根本无法有序的管理,这时就需要包管理器。

清除npm/yarn缓存包

我们平时在使用npm命令或者yarn命令的时候,有时会在本地缓存一些包,导致本地电脑硬盘占用率增加。 由于杀毒软件的扫描,某些软件包可能会丢失某些文件。 这时候npm 使用本地包的话,就会导致我们的项目无法运行

升级 Yarn 2,大规模瘦身 node_modules

node项目中最臭名昭著的莫过于node_modules文件夹,这个糟糕的结构动辄使你的文件数目增加几万甚至几十万,无论是安装还是删除,都要消耗大量时间,并且占据大量inode结点,我们随便进入一个react项目文件夹

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!