基于Vue-cli的一套代碼支持多個(gè)項(xiàng)目
應(yīng)用場(chǎng)景
在toB端業(yè)務(wù)中,同樣的產(chǎn)品,客戶多多少少會(huì)要求一些定制化。從皮膚,圖片,到一些小的功能的差異。
前端總是沖在最前面需要改的。如果改動(dòng)不大的話,拉個(gè)分支有增加了維護(hù)的成本,分支拉多了,如果主干有一個(gè)問題相當(dāng)于copy了n份,那個(gè)滋味簡(jiǎn)直不要太酸爽。那么,是否可以一套代碼支持多個(gè)項(xiàng)目呢?
前段時(shí)間,接了一個(gè)需求,技術(shù)選型是VUE,用vue-cli搭建的。一套代碼需要支持10幾家客戶,每家的皮膚,功能都有一些小的差異,主體流程大致是一樣的。在這個(gè)場(chǎng)景下研究了一下解決方案。
思路
總體的思路模塊化,然后在編譯的時(shí)候根據(jù)輸入命令直接組裝不同的模塊,打包出我們需要的頁面。
這個(gè)地方就有兩個(gè)問題:
1.如何劃分頁面,控制組件的顆粒度?
2.如何差異化編譯?
項(xiàng)目結(jié)構(gòu)
同樣一個(gè)頁面,有相同的部分,也有一些不一樣的部分。vue本身的組件化思想很容易讓我們想到把頁面拆分成組件,然后把公共的提取出來,差異化的分別處理。
項(xiàng)目總體結(jié)構(gòu)
- build
build結(jié)構(gòu)中主要是webpack的一些腳本配置
- config
config文件主要是項(xiàng)目相關(guān)配置,我們常用的就是當(dāng)端口沖突時(shí)配置監(jiān)聽端口,打包輸出路徑及命名等
- src
源碼文件。
- assets
靜態(tài)資源,一般放圖片,樣式等
- less
樣式文件,這里分主題處理了
- pages
頁面文件
- router
路由
- util
工具類
- components
文件夾中是各個(gè)項(xiàng)目的自有的組件。components目錄下的是公共的組件
- static
靜態(tài)資源,不會(huì)被webpack編譯。一般放一下外部引用文件。
webpack打包配置
如何差異化編譯?
1.cross-env使用環(huán)境變量。在編譯階段,根據(jù)編譯傳入的變量不同,編譯不同的組件。
首先,要改的是package.json的文件
"scripts": { "dev:gx": "cross-env BRANCH_ENV=gx node build/dev-server.js", "build:gx": "cross-env BRANCH_ENV=gx node build/build.js" },
這個(gè)時(shí)候我們編譯的時(shí)候輸入對(duì)應(yīng)的命令 就可以傳入相應(yīng)的環(huán)境變量。
eg:npm run dev:gx 會(huì)傳入BRANCH_ENV=gx。
2.把config/prod.env.js中注入這個(gè)環(huán)境變量
module.exports = { NODE_ENV: '"production"', API_PATH:'""', BRANCH_ENV: JSON.stringify(process.env.BRANCH_ENV) || '"base"', ignoreCsrfToken:'"false"' }
3.webpack.base.conf.js
resolve: { extensions: ['', '.js', '.vue', '.json'], fallback: [path.join(__dirname, '../node_modules')], alias: { 'vue$': 'vue/dist/vue.common.js', 'src': path.resolve(__dirname, '../src'), 'assets': path.resolve(__dirname, '../src/assets/images/'+process.env.BRANCH_ENV), 'components': path.resolve(__dirname, '../src/components'), 'componentsDif': path.resolve(__dirname, '../src/components/'+process.env.BRANCH_ENV), } },
可以看的出,我們把編譯命令注入的環(huán)境變量在引入別名的時(shí)候用上了。比如說,假設(shè)我輸入的編譯命令是
npm run build:gx
這個(gè)時(shí)候
'assets': path.resolve(__dirname, '../src/assets/images/'+process.env.BRANCH_ENV) //等同于 'assets': path.resolve(__dirname, '../src/assets/images/gx')
頁面引用
1.圖片引用
<img class="icon-arrow" src="~assets/arrow.png"> //根據(jù)編譯命令。圖片引用的是src/assets/images/gx/arrow.png background: url(~assets/btn_1.png) no-repeat;
ps:用別名的時(shí)候記得要加上~號(hào)
2.組件引用
//公共組件 import ruleTitle from 'components/RuleTitle' //差異化組件 import ruleContent from 'componentsDif/RuleContent'
總結(jié)
總而言之,核心思想就是跟進(jìn)編譯命令傳入環(huán)境變量,利用環(huán)境變量和別名的配置來差異化打包。比較難的是如何控制組件的顆粒度,如何拆分組件,這個(gè)需要跟據(jù)需求的不同來實(shí)際定制。
以上就是基于Vue-cli的一套代碼支持多個(gè)項(xiàng)目的詳細(xì)內(nèi)容,更多關(guān)于Vue-cli的一套代碼支持多個(gè)項(xiàng)目的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用vNode實(shí)現(xiàn)給列表字段打標(biāo)簽
這篇文章主要為大家介紹了使用vNode實(shí)現(xiàn)給列表字段打標(biāo)簽示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09vue.js實(shí)例對(duì)象+組件樹的詳細(xì)介紹
這篇文章主要介紹了vue.js實(shí)例對(duì)象+組件樹的相關(guān)資料,需要的朋友可以參考下2017-10-10Vue如何實(shí)現(xiàn)自動(dòng)觸發(fā)功能
這篇文章主要介紹了Vue如何實(shí)現(xiàn)自動(dòng)觸發(fā)功能,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01vue-router中關(guān)于children的使用方法
這篇文章主要介紹了vue-router中關(guān)于children的使用方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08

Vue?先初始化父組件再初始化子組件的方法(自定義父子組件mounted執(zhí)行順序)