記一次dll構(gòu)建時(shí)機(jī)優(yōu)化

之前dll文件是在構(gòu)建機(jī)器上每次都重新構(gòu)建一次谆刨,后來發(fā)現(xiàn)是可以根據(jù)packages的版本號(hào)進(jìn)行對比渺鹦,從而判斷是否需要重新構(gòu)建dll舀透。

所以寫了一個(gè)文件在每次提交時(shí)判斷是否需要重新構(gòu)建

優(yōu)化dll構(gòu)建

build.dll.js

'use strict';

function exec(cmd) {
  // 將輸出實(shí)時(shí)打印在控制臺(tái)
  require('child_process').execSync(cmd, { stdio: [0, 1, 2] });
}

const fs = require('fs');
const chalk = require('chalk');
const _ = require('lodash');
// 項(xiàng)目package.json
const packageJson = require('../package.json');
// 用于判斷的版本記錄文件
const dllJson = require('./build.dll.json');
const dllConfig = require('./webpack.dll.config');

console.log(chalk.yellow(' 正在檢查是否需要更新dll文件'));
// 可能webpack.dll.config有多個(gè)入口
const vendors = Object.values(dllConfig.entry).reduce((result, it) => result.concat(it), []);
const oldPackages = dllJson.packages;
const newPackages = _.pick(packageJson.dependencies, vendors);
const isEqual = _.isEqual(oldPackages, newPackages);
if (!isEqual) {
  console.log(chalk.cyan(' => 正在重新構(gòu)建\n'));
  // 執(zhí)行dll
  exec('npm run build:dll');
  // 構(gòu)建后將新的版本記錄寫入文件,version用于HtmlWebpackPlugin寫入index.html
  fs.writeFileSync(
    'build/build.dll.json',
    JSON.stringify({ packages: newPackages, version: dllJson.version + 1 }, null, 2)
  );
  console.log(chalk.green(' => 構(gòu)建完成\n'));
} else {
  console.log(chalk.green(' => 不需要重新構(gòu)建\n'));
}

build.dll.json

{
  "packages": {
    "vuex": "^2.3.1",
    "vue-router": "^2.3.1",
    "vue-tables-2": "^0.6.64",
    "echarts": "^3.8.5"
  },
  "version": 4
}

之后為了自動(dòng)的改動(dòng)vendor.dll.jsindex.html的版本號(hào)(用于瀏覽器緩存)密任,需要在webpack.dev.conf.jswebpack.prod.conf.js加入HtmlWebpackPlugin參數(shù)

new HtmlWebpackPlugin({
  // ...省略
  customInfo: {
    vendorVersion: vendorVersion,
  },
}),

index.html加入版本號(hào)的參數(shù)

<script src="/static/js/vendor.dll.js?v=<%= htmlWebpackPlugin.options.customInfo.vendorVersion %>"></script>

最后一步颜启,在pre-commit加上執(zhí)行這個(gè)文件(需要裝husky),這樣每次提交就會(huì)先進(jìn)行檢查浪讳,如果需要構(gòu)建就會(huì)將構(gòu)建后的文件上傳git

npm i -D husky

"husky": {
    "hooks": {
      "pre-commit": "node build/build.dll.js
    }
  }

總結(jié)

這樣雖然會(huì)減少線上構(gòu)建的時(shí)間缰盏,但是因?yàn)?code>vendor.dll.js是在本地構(gòu)建的,可能會(huì)出現(xiàn)本地和線上版本不同的問題淹遵,之后可以想想怎么進(jìn)一步改造

附件(webpack.dll.config.js)

'use strict';
const path = require('path');
const webpack = require('webpack');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');

const context = path.join(__dirname, '..');

module.exports = {
  // 你想要打包的模塊的數(shù)組
  entry: {
    vendor1: [
      'vuex',
      'vue-router',
      'lodash',
      'vue-tables-2',
    ],
    vendor2: [
      'echarts',
    ],
  },
  output: {
    path: path.join(context, 'static/js'), // 打包后文件輸出的位置
    filename: '[name].dll.js',
    library: '[name]_library',
    // vendor.dll.js中暴露出的全局變量名口猜。
    // 主要是給DllPlugin中的name使用,
    // 故這里需要和webpack.DllPlugin中的`name: '[name]_library',`保持一致透揣。
  },
  plugins: [
    new webpack.DllPlugin({
      path: path.join(__dirname, '.', '[name]-manifest.json'),
      name: '[name]_library',
      context: context,
    }),
    // 壓縮打包的文件
    new UglifyJsPlugin({
      uglifyOptions: {
        compress: {
          warnings: false,
        },
      },
      sourceMap: false,
      parallel: true,
    }),
  ],
};

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末济炎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子辐真,更是在濱河造成了極大的恐慌须尚,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侍咱,死亡現(xiàn)場離奇詭異耐床,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)楔脯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進(jìn)店門撩轰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人昧廷,你說我怎么就攤上這事钧敞。” “怎么了麸粮?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長镜廉。 經(jīng)常有香客問我弄诲,道長,這世上最難降的妖魔是什么娇唯? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任齐遵,我火速辦了婚禮,結(jié)果婚禮上塔插,老公的妹妹穿的比我還像新娘梗摇。我一直安慰自己,他們只是感情好想许,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布伶授。 她就那樣靜靜地躺著断序,像睡著了一般。 火紅的嫁衣襯著肌膚如雪糜烹。 梳的紋絲不亂的頭發(fā)上违诗,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天,我揣著相機(jī)與錄音嗦玖,去河邊找鬼跷敬。 笑死壹粟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的阵苇。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼感论,長吁一口氣:“原來是場噩夢啊……” “哼绅项!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起笛粘,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤趁怔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后薪前,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體润努,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年示括,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了铺浇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,626評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡垛膝,死狀恐怖鳍侣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吼拥,我是刑警寧澤倚聚,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站凿可,受9級(jí)特大地震影響惑折,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜枯跑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一惨驶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧敛助,春花似錦粗卜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽攻臀。三九已至,卻和暖如春测砂,著一層夾襖步出監(jiān)牢的瞬間茵烈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工砌些, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留呜投,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓存璃,卻偏偏與公主長得像仑荐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子纵东,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 姓名:李丹丹 公司:山東萬潔環(huán)闭痴校科技有限公司 組別:第373期 利他一組 【日精進(jìn)打卡第232天】 【知~學(xué)習(xí)】 ...
    小雨淅淅373閱讀 82評論 0 0
  • 執(zhí)子之手與子偕老在變幻莫測的霓虹燈下似乎顯得更加彌足珍貴,往后余生的浪漫更似乎在那紫醉金迷中跌失色彩偎球。我...
    圓圓_48e9閱讀 618評論 0 2
  • 孩子的成長離不開父母細(xì)心觀察洒扎。當(dāng)你用一雙慧眼觀察自己的的孩子的時(shí)候,你一定會(huì)發(fā)現(xiàn)孩子每天都在進(jìn)步成長衰絮。隨之而來帶給...
    志成媽媽閱讀 245評論 1 4