基於Vue-cli的一套代碼支持多個項目的解決方案

基於Vue-cli的一套代碼支持多個項目的解決方案

應用場景

在toB端業務中,一樣的產品,客戶多多少少會要求一些定製化。從皮膚,圖片,到一些小的功能的差別。
前端老是衝在最前面須要改的。若是改動不大的話,拉個分支有增長了維護的成本,分支拉多了,若是主幹有一個問題至關於copy了n份,那個滋味簡直不要太酸爽。那麼,是否能夠一套代碼支持多個項目呢?前端

前段時間,接了一個需求,技術選型是VUE,用vue-cli搭建的。一套代碼須要支持10幾家客戶,每家的皮膚,功能都有一些小的差別,主體流程大體是同樣的。在這個場景下研究了一下解決方案。vue

思路

整體的思路模塊化,而後在編譯的時候根據輸入命令直接組裝不一樣的模塊,打包出咱們須要的頁面。
這個地方就有兩個問題:node

1.如何劃分頁面,控制組件的顆粒度?webpack

2.如何差別化編譯?web

項目結構

一樣一個頁面,有相同的部分,也有一些不同的部分。vue自己的組件化思想很容易讓咱們想到把頁面拆分紅組件,而後把公共的提取出來,差別化的分別處理。vue-cli

項目整體結構

圖片描述

build

build結構中主要是webpack的一些腳本配置npm

config

config文件主要是項目相關配置,咱們經常使用的就是當端口衝突時配置監聽端口,打包輸出路徑及命名等json

src

源碼文件。less

assets:靜態資源,通常放圖片,樣式等模塊化

less:樣式文件,這裏分主題處理了

pages:頁面文件

router:路由

util:工具類

components

圖片描述

文件夾中是各個項目的自有的組件。components目錄下的是公共的組件

static

靜態資源,不會被webpack編譯。通常放一下外部引用文件。

webpack打包配置

如何差別化編譯?

1.cross-env使用環境變量。在編譯階段,根據編譯傳入的變量不一樣,編譯不一樣的組件。
首先,要改的是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"
  },

這個時候咱們編譯的時候輸入對應的命令 就能夠傳入相應的環境變量。
eg:npm run dev:gx 會傳入BRANCH_ENV=gx。

2.把config/prod.env.js中注入這個環境變量

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),
    }
  },

能夠看的出,咱們把編譯命令注入的環境變量在引入別名的時候用上了。好比說,假設我輸入的編譯命令是

npm run build:gx

這個時候

'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">
//根據編譯命令。圖片引用的是src/assets/images/gx/arrow.png

background: url(~assets/btn_1.png) no-repeat;

ps:用別名的時候記得要加上~號

2.組件引用

//公共組件
import ruleTitle from 'components/RuleTitle'
//差別化組件
import ruleContent from 'componentsDif/RuleContent'

總結

總而言之,核心思想就是跟進編譯命令傳入環境變量,利用環境變量和別名的配置來差別化打包。比較難的是如何控制組件的顆粒度,如何拆分組件,這個須要跟據需求的不一樣來實際定製。

相關文章
相關標籤/搜索