摘要:從使用和也是支持的。此處直接首頁其中當(dāng)時,內(nèi)的配置信息會直接覆蓋初始化后項目中的。文件接下來就是,這個文件負(fù)責(zé)的就是注入或是修改項目中文件。比如我的其中和就是用戶在處理中設(shè)定的問題的回答值。
vue-cli 之 Preset
vue-cli 插件開發(fā)指南
TLDR
背景介紹vue-cli 3 完全推翻了 vue-cli 2 的整體架構(gòu)設(shè)計,所以當(dāng)你需要給組里定制一份基于 vue-cli 的前端項目初始化模板時,就需要去思考:我該怎么做?
我們要做的事情很簡單,就是當(dāng)別人使用 vue create xxx 命令初始化一個前端項目時,可以從 git repo 去拉取項目初始化信息,好處有兩點:
團(tuán)隊內(nèi)部所有的新項目都是統(tǒng)一的目錄結(jié)構(gòu)和代碼組織方式,便于維護(hù)
后期可以開發(fā)公共插件服務(wù)于不同的項目,提高效率
因為 vue-cli 3 才出來不久,所以探索的過程中踩了很多坑,這里就來總結(jié)下。
整體設(shè)計vue-cli 官網(wǎng)介紹到:
你可以通過發(fā)布 git repo 將一個 preset 分享給其他開發(fā)者。這個 repo 應(yīng)該包含以下文件:
preset.json: 包含 preset 數(shù)據(jù)的主要文件(必需)。
generator.js: 一個可以注入或是修改項目中文件的 Generator。
prompts.js: 一個可以通過命令行對話為 generator 收集選項的 prompts 文件。
# 從 GitHub repo 使用 preset vue create --preset username/repo my-project
GitLab 和 BitBucket 也是支持的。如果要從私有 repo 獲取,請確保使用 --clone 選項:
vue create --preset gitlab:username/repo --clone my-project vue create --preset bitbucket:username/repo --clone my-project
是不是看上去很簡單,起碼我在實踐過程中還是遇到了一些問題,接下來就重點講下。
git repo 參數(shù)
上面 --preset 后跟的參數(shù) username/repo 實際是下圖中的紅框內(nèi)部分(千萬別以為是 git clone 后的地址):
preset.json 文件
先說一點:當(dāng)你直接用 vue create xxx 初始化項目時,如果你將初始化信息保存成一個本地模板后,會寫入到你系統(tǒng)的 ~/.vuerc 文件中。該文件中的內(nèi)容其實就是我們接下來需要配置的 present.json。
此處直接 show code :
{ "useConfigFiles": true, "cssPreprocessor": "less", "plugins": { "@vue/cli-plugin-babel": { "version": "^3.0.0" }, "@vue/cli-plugin-eslint": { "version": "^3.0.0", "config": "recommended", "lintOn": ["save", "commit"] } }, "configs": { "vue": { "baseUrl": "/", "outputDir": "dist", "assetsDir": "static", "filenameHashing": true, "lintOnSave": true, "runtimeCompiler": false, "transpileDependencies": [], "productionSourceMap": false, "pages": { "index": { "entry": "src/main.js", "template": "public/index.html", "filename": "index.html", "title": "首頁", "chunks": ["chunk-vendors", "chunk-common", "index"] } }, "devServer": { "open": true, "host": "127.0.0.1", "https": false, "hotOnly": false, "proxy": null }, "pwa": {}, "pluginOptions": {} }, "postcss": {}, "eslintConfig": { } }, "router": true, "vuex": false, "routerHistoryMode": false }
其中當(dāng) "useConfigFiles": true 時, configs 內(nèi)的配置信息會直接覆蓋初始化后項目中的 vue.config.js。
prompts.js 文件
prompts.js 其實就是你在初始化項目時,系統(tǒng)會詢問你的配置選項問題,比如你的項目需不需要安裝 vuex? 需不需要安裝 vue-router?
你的回答會直接影響后面初始化生成的項目文件。
這里最需要注意一點?。?!
當(dāng)你查看官方文檔時,第一眼看到就是下圖:
只要你這樣寫,就一定會 報錯 ?。?!
原因很簡單:上圖中 prompts.js 的寫法是開發(fā)基于 vue-cli-service 插件的代碼。而當(dāng)你是要開發(fā)項目模板時,正確寫法如下:
module.exports = [ { name: "vuex", type: "confirm", message: `是否需要使用 vuex`, default: false }, { name: "elementUI", type: "confirm", message: `element-ui`, default: false } ];
這一點其實官網(wǎng)也有提到,只是很不容易注意到。
此處再給大家安利下 vue-cli-plugin-vuetify 這個開源插件中 prompts.js 的寫法。程序猿嘛,最愛的就是栗子。
generator.js 文件
接下來就是 generator.js,這個文件負(fù)責(zé)的就是 注入或是修改項目中文件。
同樣,我還是直接 show code :
module.exports = (api, options, rootOptions) => { // 安裝一些基礎(chǔ)公共庫 api.extendPackage({ dependencies: { "axios": "^0.18.0", "lodash": "^4.17.10", "keymirror": "^0.1.1" }, devDependencies: { "mockjs": "^1.0.1-beta3" } }); // 安裝 vuex if (options.vuex) { api.extendPackage({ dependencies: { vuex: "^3.0.1" } }); api.render("./template/vuex"); } // 安裝 element-ui 庫 if (options.elementUI) { api.extendPackage({ devDependencies: { "element-ui": "^2.4.6" } }); } // 公共基礎(chǔ)目錄和文件 api.render("./template/default"); // 配置文件 api.render({ "./.eslintrc.js" : "./template/_eslintrc.js", "./.gitignore" : "./template/_gitignore", "./.postcssrc.js" : "./template/_postcssrc.js" }); }
核心 api:
api.extendPackage : 負(fù)責(zé)給初始化項目中的 package.json 添加額外依賴并安裝;
api.render : 負(fù)責(zé)將模板項目中提前定義好的目錄和文件拷貝到初始化的項目中;
api.postProcessFiles : 負(fù)責(zé)具體處理模板項目中的文件,關(guān)于它可以參考 How to build your own vue-cli 3 plugin 和 GeneratorAPI.js 源碼
對于 api.render 需要注意幾點:
拷貝目錄的話,直接傳地址字符串,render 函數(shù)會將你所傳目錄內(nèi)的所有文件覆蓋初始化項目中 src 目錄下的文件(我的測試結(jié)果是限于兩層目錄);
拷貝文件的話,直接傳入一個 object,其中 key 對應(yīng)初始化項目中的目標(biāo)位置,value 對應(yīng)模板項目中的文件位置;
當(dāng)你需要創(chuàng)建一個以 . 開頭的文件時,模板項目中需要用 _ 替代 .,這點官網(wǎng)有說明;
最后再說個很重要點,vue-cli 3 在拷貝文件時使用的是 EJS 模板去實現(xiàn)的,所以開發(fā)者是可以在任意文件中使用 EJS 語法去做更細(xì)粒度的控制。比如我的 main.js:
import Vue from "vue" import App from "./App.vue" <%_ if (options.vuex) { _%> import store from "./store" <%_ } _%> <%_ if (options.elementUI) { _%> import ElementUI from "element-ui"; Vue.use(ElementUI); <%_ } _%> // simulation data import "./mock/index"; Vue.config.productionTip = false new Vue({ router, <%_ if (options.vuex) { _%> store, <%_ } _%> render: h => h(App) }).$mount("#app")
其中 options.vuex 和 options.elementUI 就是用戶在處理 prompts.js 中設(shè)定的問題的回答值。正是基于這點,我沒有再去使用 api.postProcessFiles 這個 api 。
今天就寫到這里,后續(xù)有補(bǔ)充再寫~
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/97760.html
摘要:從使用和也是支持的。此處直接首頁其中當(dāng)時,內(nèi)的配置信息會直接覆蓋初始化后項目中的。文件接下來就是,這個文件負(fù)責(zé)的就是注入或是修改項目中文件。比如我的其中和就是用戶在處理中設(shè)定的問題的回答值。 vue-cli 之 Preset vue-cli 插件開發(fā)指南 TLDR 背景介紹 vue-cli 3 完全推翻了 vue-cli 2 的整體架構(gòu)設(shè)計,所以當(dāng)你需要給組里定制一份基于 vue-cl...
摘要:從使用和也是支持的。此處直接首頁其中當(dāng)時,內(nèi)的配置信息會直接覆蓋初始化后項目中的。文件接下來就是,這個文件負(fù)責(zé)的就是注入或是修改項目中文件。比如我的其中和就是用戶在處理中設(shè)定的問題的回答值。 vue-cli 之 Preset vue-cli 插件開發(fā)指南 TLDR 背景介紹 vue-cli 3 完全推翻了 vue-cli 2 的整體架構(gòu)設(shè)計,所以當(dāng)你需要給組里定制一份基于 vue-cl...
摘要:借助,我們通過非常簡單的問答形式,方便地初始化一個工程,完全不需要擔(dān)心繁復(fù)的配置等等。簡單來說,就是不僅僅能初始化工程,理論上能夠初始化一切工程,包括,等等等等,只要你有一份能夠運(yùn)行的模板,就能夠通過進(jìn)行工程的初始化。 相信對于大部分使用過VueJS的同學(xué)來說,vue-cli是他們非常熟悉的一個工具。借助vue-cli,我們通過非常簡單的問答形式,方便地初始化一個vue工程,完全不需要...
摘要:在年年底的時候,同事聊起腳手架。由于公司業(yè)務(wù)的多樣性前端的靈活性讓我們不得不思考更通用的腳手架。針對開發(fā)使用的腳手架針對項目創(chuàng)建項目通用腳手架是一款強(qiáng)壯的且有一系列工具的通用型腳手架,但發(fā)布指定名稱,和用其開發(fā)工具。 在16年年底的時候,同事聊起腳手架。由于公司業(yè)務(wù)的多樣性,前端的靈活性,讓我們不得不思考更通用的腳手架。而不是伴隨著前端技術(shù)的發(fā)展,不斷的把時間花在配置上。于是chef-...
摘要:當(dāng)你將一系列的特性選擇完畢后最后回提示你是否將已選項保存成一個快速將來可復(fù)用的當(dāng)你選擇保存時,被保存的將會存在用戶的目錄下一個名為的文件里。 準(zhǔn)備工作 npm install -g @vue/cli or yarn global add @vue/cli 安裝需要Node.js8.9以上版本,安裝完成后可以通過vue --version來驗證是否安裝成功 項目創(chuàng)建 vue create...
閱讀 3551·2021-11-23 10:10
閱讀 3320·2019-08-30 14:03
閱讀 2077·2019-08-30 13:09
閱讀 3404·2019-08-29 15:29
閱讀 1550·2019-08-29 11:23
閱讀 2017·2019-08-28 18:28
閱讀 2852·2019-08-26 13:34
閱讀 2175·2019-08-26 11:32