Играете с VueJS? Уже пробовали потрясающий vue-cli с vue-loader? Если да, то вот небольшая идея, которая сэкономила мне несколько нажатий клавиш при создании новых компонентов Vue.

Я работал в Laravel пару лет, и мне нравится в нем простой способ создания новых вещей, таких как контроллеры, модели и т.д. было бы аккуратно.

В Laravel генерация контроллера происходит так…

php artisan make:controller AwesomeController

Я хотел иметь возможность делать что-то подобное с Vue…

npm run make:component Checkbox

Это возможно несколькими способами. Один из способов сделать это — использовать то, как работают скрипты npm. Если вы когда-либо пытались создать проект vue-cli, то, вероятно, видели, что происходит в файле «package.json».

"scripts": {
    "dev": "node build/dev-server.js",
    "build": "node build/build.js",
    "lint": "eslint --ext .js,.vue src",
    "make:component": "node scripts/make/component.js"
},

Довольно просто. Напишите «npm run» плюс все, что находится внутри объекта «scripts» и презто, что-то произойдет.

Что я хотел сделать, так это создать новый предварительно заполненный файл «Whatever.vue» внутри папки «components» моего проекта всякий раз, когда я выполнял «npm run make:component Whatever» в своем терминале.

Чтобы сэкономить мне время, сгенерированный файл должен выглядеть примерно так…

<template>
</template>
<script>
import { mapState } from 'vuex'
export default {
  data () {
    return {}
  },
  computed: mapState({
  })
}
</script>
<style lang="sass">
</style>

Чисто и просто. Можно добавить больше или меньше. Впрочем, это как раз то, что мне было нужно.

Итак, чтобы это работало, я создал папку «скрипты» внутри своего проекта Vue и добавил следующее…

scripts
  - make
    - components.js
    - config.js

Внутри файла «config.js» я бы добавил несколько значений по умолчанию…

var exports = module.exports = {}
exports.flavors = {
  style: 'sass',
  script: null,
  template: null
}
exports.css = {
  scoped: false
}

И, наконец, в файле «component.js»…

const fs = require('fs')
const defaults = require('./config.js')
const args = process.argv.slice(2)
const componentName = args[0]
const templateFlavor = args[1] || defaults.flavors.template
const scriptFlavor = args[2] || defaults.flavors.script
const styleFlavor = args[3] || defaults.flavors.style
const cssScoped = args[4] || defaults.css.scoped
const source = `<template${(templateFlavor) ? ` lang="${templateFlavor}"` : ''}>
</template>
<script${(scriptFlavor) ? ` lang="${scriptFlavor}"` : ''}>
import { mapState } from 'vuex'
export default {
  data () {
    return {}
  },
  computed: mapState({
  })
}
</script>
<style${(cssScoped) ? ' scoped' : ''}${(styleFlavor) ? ` lang="${styleFlavor}"` : ''}>
</style>
`
fs.writeFile(
  `src/components/${componentName}.vue`,
  source,
  err => {
    if (err) {
      return console.log('Could\'t create the component.')
    }
return console.log('Component generated')
  }
)

Целая куча тарабарщины, но она сводится к нескольким простым вещам:

  1. Возьмите значения по умолчанию из «config.js».
  2. Отрежьте первые 2 аргумента по умолчанию из команды «npm run make:component Whatever», так что единственные аргументы, о которых нам нужно беспокоиться, — это те, которые ПОСЛЕ части «npm run make:component» нашей команды.
  3. Установите различные варианты и укажите, должен ли CSS быть ограниченным или нет. В моем случае я использую только Sass для своих стилей, но вы можете использовать Jade для своего шаблона или CoffeeScript для своего скрипта, например…

    «npm run make:component Checkbox jade coffee»
    < br /> … потому что args[1] — это вариант шаблона, а args[2] — вариант сценария.
  4. Определите шаблон, который мы хотим для нашего компонента. Ваш пробег может отличаться. Я просто пошел с тем, что мне нужно.
  5. Завершите все, используя «fs», чтобы создать фактический файл «Checkbox.vue» в нашей папке «src/components».

И это действительно все, что нужно сделать.

Вы можете оживить его, используя более продвинутые плагины, такие как yargs или подобные, чтобы сделать команду более явной.

Получайте удовольствие и попробуйте VueJS, если вы еще этого не сделали.