相信不少人都用過vue-cli
或create-react-app
或者相似的腳手架。
腳手架方便咱們複製,粘貼,或者clone代碼庫,並且還能夠更具用戶的選擇,引入用戶所須要的插件。
腳手架每每搭配着早已設計好了架構的項目,而後按需進行拷貝。html
官網介紹: The web's scaffolding tool for modern webapps.
yeoman是一款來作腳手架的工具,咱們藉助它,就能很容易地開發出本身的腳手架了。
yeoman具體的使用,本文不會介紹太多,官網的文檔差很少就夠了,我也會在文章末尾放上本身蒐集的一些參考資料,同窗們本身看看就行了。前端
安裝yeoman: npm install -g yo
vue
generator其實就是一個node module,即npm。yeoman根據咱們寫的generator來執行咱們寫的構建代碼。(對怎麼本身選一個npm包不熟悉的同窗,能夠戳這裏>>)
generator文件夾必須以generator-
開頭,而後以後跟上自定義的腳手架名字,好比generator-zx-vue
,將它作成npm包之後,上傳到npm官網,只有在電腦上全局安裝,而後用yoman運行就行了,以後會詳細介紹。node
除了手動建立本身的generator項目,咱們還能夠經過別人已經作好的腳手架來建立。
安裝generator-generator
: npm install -g generator-generator
而後,運行腳手架: yo generator
以後,咱們就能夠看到一系列的提示,按照提示輸入完信息之後,咱們就有了一份編寫本身的generator的模板項目了。react
其實,這個generator腳手架生成的不少文件咱們都不須要管,咱們只須要把注意力放在generator/app
這個文件夾下的內容就行了。templates
文件是用來做爲倉庫,咱們在編寫腳本的時候,若是須要哪些文件,就直接去這個倉庫裏copy出來就行了。git
由於咱們本身作的generator是一個npm包,咱們天然但願對其進行版本管理,用上git,方便從此的迭代。templates
其實也是一個獨立的項目,咱們以前說了,它是一個早已完成了的項目架子,咱們是從gitlab或者github上copy過來的而已。那該怎麼管理這兩個不一樣的項目呢?github
git用的6的同窗確定一會兒就想到git子模塊的知識了。
不熟悉的同窗能夠戳 git文檔-子模塊>>web
所以,咱們不是把項目copy進templates
,也不是git clone進templates
,而是先刪除app
文件夾下的templates
,而後:git submodule add https://github.com/CodeLittlePrince/vue-construct-for-zx-vue.git templates
這樣的話,咱們就能夠更新本身的倉庫項目(vue-construct-for-zx-vue),generator項目的話,pull子模塊就行了。二者保持獨立,方便迭代和維護。vuex
接下來,咱們就能夠來編寫app
文件夾下的index.js
文件了:vue-cli
const Generator = require('yeoman-generator') const chalk = require('chalk') const yosay = require('yosay') const path = require('path') const fs = require('fs') module.exports = class extends Generator { initializing() { // 打印歡迎語 this.log( yosay(`Welcome to the shining ${chalk.cyan('generator-zx-vue')} generator!`) ) } prompting() { // 讓用戶選擇是否須要包含vuex const prompts = [ { type: 'input', name: 'name', message: 'Name of project:', default: path.basename(process.cwd()) }, { type: 'input', name: 'description', message: 'Description:', default: '', }, // { // type: 'confirm', // name: 'includeVuex', // message: 'Would you like to include Vuex in your project?', // default: false, // } ] return this.prompt(prompts).then(answers => { this.name = answers.name this.description = answers.description // this.includeVuex = answers.includeVuex this.log(chalk.green('name: ', this.name)) this.log(chalk.green('description: ', this.description)) // this.log(chalk.green('includeVuex: ', this.includeVuex)) }) } writing() { // 複製普通文件 // https://github.com/sboudrias/mem-fs-editor this.fs.copyTpl( this.templatePath(), this.destinationPath(), { name: this.name }, {}, { globOptions: { dot: true } } ) // 根據用戶選擇,決定是否安裝vuex if (this.includeVuex) { const pkgJson = { name: this.name, description: this.description, // dependencies: { // vuex: '^3.0.1' // } } // Extend or create package.json file in destination path this.fs.extendJSON(this.destinationPath('package.json'), pkgJson) } } install() { this.npmInstall() } end() { this.log(chalk.green('Construction completed!')) } }
語法很簡單,具體能夠本身看yeoman官方文檔,我簡單的介紹一下幾個比較經常使用的函數,或者說生命週期:
函數名 | 我用來作什麼 |
---|---|
initializing | 我用來寫一些歡迎語 |
prompting | 與用戶的交互,好比input、checkbox、confirm等 |
writing | 拷貝和編輯文件 |
install | 安裝依賴,如npm install |
end | 寫一些如goodbye的結束語 |
沒發佈上線的npm包,本地測試只須要link一下就行了,到generator根目錄,而後運行npm link
,這樣咱們就可使用咱們的generator了,好比,到一個新的空文件夾下運行:yo zx-vue
,就能夠看到項目開始自動構建了。
測試完成後,就能夠發佈到npm官網了,發佈流程可參考我另外一篇文章npm-從0開始寫一個npm module
zx-vue
是一個以vue-construct做爲模板倉庫的腳手架,爲了方便新項目構建,也爲了從此的新項目可以統一。
首先,安裝全局yeomman和generator-zx-vue
:npm install -g yo
npm install -g generator-zx-vue
而後找一個空的文件夾執行:yo zx-vue
生成項目之後的操做能夠參考vue-construct
最後,generator-zx-vue
的地址是generator-zx-vue
我以前本來打算把vuex做爲一個可選項,讓用戶選擇是否引入這個庫。
可是,作下來之後發現,由於用到了ejs模板去作這個事情,而後,最終輸出的文件會由於<% if (condition) { %>
這種ejs語法致使換行,或者縮進不符合eslint。固然,我也能夠把項目弄的更空一點,把全部vuex的使用清掉,但這樣也不是很好,由於我又想讓用戶跑起來這個項目就能看到整個全家桶的效果在頁面上使用到。
其實還有另一種比較暴力的方法就是,我弄一個有vuex的項目,一個沒有vuex的項目,而後選擇copy哪份,,太暴力。
憋了很久也沒想到什麼很好接受的方法,因此就暫且把vuex也直接帶上。
最後,也但願有想法的同窗還有大佬多多留言,給點建議^_^