你們都知道,使用vue-cli能夠快速的初始化一個基於Vue.js的項目,全局安裝腳手架以後,你能夠經過vue list命令看到官方提供的5個模板html
vue listvue
當開發一個獨立項目的時候,使用官方提供的template確實很方便,省去了繁瑣的依賴配置,webpack等配置問題,甚至連項目目錄結構也不須要去考慮,着實方便。可是,當咱們須要開發多個系統,每一個系統依賴的包,webpack都不一致的時候,vue官方提供的模板就顯得捉襟見肘了,這是咱們就須要去考慮,可否開發一套本身定製化的template,答案是確定的,那麼在開始定製以前咱們須要瞭解一些前置知識。node
首先咱們瞭解一下模板的主要結構,當咱們從githup官網上去看vue官方給們提供的模板結構的時候,發現模板其實很簡單,主要包括兩個部分webpack
使用vue-cli初始化項目時會使用該工具來下載目標倉庫,默認咱們日常都會下載webpack這個模板(vue init webpack myProject),自定義模板能夠是一個GitHub倉庫,也能夠是一個本地文件,使用以下命令來初始化項目:git
vue init username/repo my-project //其中username爲自定義模板倉庫所在GitHub用戶名,repo是倉庫名
vue init ./../ my-project //本地文件
vue-cli在模板倉庫下載完成後,將經過Inquire.js根據模板倉庫中的meta.js或meta.json文件中的設置,與用戶進行一些簡單的交互以肯定項目的一些細節,以下圖:web
該交互是可選的,若是項目中沒有meta.js或meta.json文件時,模板倉庫下載完成後將直接進入模板模板構建過程。vue-cli
在經過命令行交互肯定了項目初始化細節後,就該進入最後一道工序,按照模板初始化咱們的項目了,這裏vue-cli選用的是Handlebars.js,一個簡單高效的語義化模板構建引擎。npm
定製模板主要圍繞着命令行交互(Inquirer.js)與模板文件開發(Handlebars.js)這兩部分。json
meta.js至關於模板項目的配配置文件,這個文件不是必須的,這裏主要看看它能作些什麼,設置都在meta.js或meta.json裏面,可是我推薦使用meta.js,由於它的配置相對更靈活一點,下面主要簡單說明一下meta.js的配置。gulp
meta.js一共包含以下幾個字段,簡單列一下各字段功能:
命令行交互主要是meta.js中prompts字段的配置,詳細的配置能夠閱讀官方文檔,或者在這裏推薦我一個朋友的博客地址,他那有詳細的說明。
module.exports = { metalsmith:{ before: addTestAnswers },
"helpers": { "if_or": function (v1, v2, options) { if (v1 || v2) { return options.fn(this); } return options.inverse(this); }, template_version() { return templateVersion }, }, "prompts": { "name": { "type": "input", "required": true, "message": "項目名" }, "author": { "type": "input", "message": "做者" }, } }
說一下各個字段的意思
模板基本語法(Handlebars.js)
在編寫模板的時候,咱們能夠用Mustache語法在任何文本類型的文件中輸出在命令行交互中獲得一些數據:
{ "name": "{{ name }}", "description": "{{ description }}", "scripts": { "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", "start": "npm run dev", {{/if_eq}} {{#e2e}} "e2e": "node test/e2e/runner.js",{{/e2e}} {{#if_or unit e2e}} "build": "node build/build.js" }, "dependencies": { {{#vux}} "vux": "^2.2.0", {{/vux}} } }
以package.json文件爲例,{{name}}即爲meta.js裏面寫name,{{#vux}}"vux":"^2.2.0",{{/vux}}即爲根據命令行交互的結果得知是否渲染。
vue-cli中爲handlebar.js預置了if_eq與unless_eq輔助函數,用於使用交互所得數據來處理模板中是否渲染兩種邏輯關係,此外handlebars中還內內置了if、unless、each等輔助函數。此外咱們能夠自定義輔助函數(handlebars.js)
有時候現有的輔助函數不能可能不能知足咱們的需求,經過meta.js中的helpers字段咱們能夠自定義輔助函數:
"helpers": { "if_or": function (v1, v2, options) { if (v1 || v2) { return options.fn(this); } return options.inverse(this); }, template_version() { return templateVersion }, },
輔助函數能夠接受若干個參數,最後一個參數options爲輔助函數的鉤子,調用options.fn(this)即輸出該輔助函數運算結果爲真時的內容,反之調用options.inverse(this)的內容
如今就能夠直接再模板中使用if_or輔助函數了:
{{#if_or unit e2e}} "test": "{{#unit}}npm run unit{{/unit}}{{#unit}}{{#e2e}} && {{/e2e}}{{/unit}}{{#e2e}}npm run e2e{{/e2e}}", {{/if_or}}
輔助函數值能夠控制文件內的一部份內容的輸出與否,有時候咱們須要根據交互結果控制某些文件自己是否輸出。
在meta.js中的filters字段中進行相應的設置就能夠達到控制文件輸出的效果
filters: {//根據命令行交互的結果過濾將要渲染的項目文件 '.eslintrc.js': 'lint', '.eslintignore': 'lint', 'config/test.env.js': 'unit || e2e', 'build/webpack.test.conf.js': "unit && runner === 'karma'", 'test/unit/**/*': 'unit', 'test/unit/index.js': "unit && runner === 'karma'", 'test/unit/jest.conf.js': "unit && runner === 'jest'", 'test/unit/karma.conf.js': "unit && runner === 'karma'", 'test/unit/specs/index.js': "unit && runner === 'karma'", 'test/unit/setup.js': "unit && runner === 'jest'", 'test/e2e/**/*': 'e2e', 'src/router/**/*': 'router', },
filters中鍵名是要控制輸出的文件的路徑,鍵名對應的值爲命令行交互中獲得的數據
關於metalSmith插件的使用本人還沒有研究,若是有感興趣的朋友敬請期待,或能夠直接去查閱相關資料。
以上就就是定製團隊模板的大概步驟,差很少已經介紹結束了,若是有興趣趕快爲本身的團隊定製去吧!!!