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

之前dll文件是在構(gòu)建機(jī)器上每次都重新構(gòu)建一次,后來(lái)發(fā)現(xiàn)是可以根據(jù)packages的版本號(hào)進(jìn)行對(duì)比,從而判斷是否需要重新構(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)本地和線上版本不同的問(wè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)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容