Webpack 優(yōu)化

構建優(yōu)化

縮小文件搜索范圍

優(yōu)化 loader 配置

通過test编振、includeexclude三個配置項毙驯,減少loader處理的文件

優(yōu)化 resolve.modules 配置

當安裝的第三方模塊都放在項目根目錄下的./node_modules目錄下時稽坤,沒有必要按照默認的方式去一層層的尋找,可以指明存放第三方模塊的絕對路徑线得,以減少尋找。

module.exports = {
  resolve: {
    // 使用絕對路徑指明第三方模塊存放的位置徐伐,以減少搜索步驟
    // 其中 __dirname 表示當前工作目錄贯钩,也就是項目根目錄
    modules: [path.resolve(__dirname, 'node_modules')]
  },
};

優(yōu)化 module.noParse 配置

module.noParse配置項可以讓 Webpack 忽略對部分沒采用模塊化的文件的遞歸解析處理,這樣做的好處是能提高構建性能办素。

module.exports = {
  module: {
    // index.html中外部鏈接引入的文件
    noParse: [/jquery|lodash/],
  },
};

使用 HappyPack

在整個 Webpack 構建流程中角雷,最耗時的流程可能就是 Loader 對文件的轉換操作了,因為要轉換的文件數(shù)據(jù)巨多摸屠,而且這些轉換操作都只能一個個挨著處理谓罗。 HappyPack 的核心原理就是把這部分任務分解到多個進程去并行處理,從而減少了總的構建時間季二。

安裝依賴

npm i -D happypack

接入配置

const HappyPack = require('happypack');

const os = require('os'); // node 提供的系統(tǒng)操作模塊
// 構造出共享進程池,根據(jù)我的系統(tǒng)的內(nèi)核數(shù)量 指定線程池個數(shù) 也可以其他數(shù)量
const happyThreadPool = HappyPack.ThreadPool({size: os.cpus().length});

module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        // 把對 .js 文件的處理轉交給 id 為 babel 的 HappyPack 實例
        use: ['happypack/loader?id=babel'],
        // 排除 node_modules 目錄下的文件揭措,node_modules 目錄下的文件都是采用的 ES5 語法胯舷,沒必要再通過 Babel 去轉換
        exclude: path.resolve(__dirname, 'node_modules'),
      },
      {
        // 把對 .css 文件的處理轉交給 id 為 css 的 HappyPack 實例
        test: /\.css$/,
        use: ExtractTextPlugin.extract({
          use: ['happypack/loader?id=css'],
        }),
      },
    ]
  },
  plugins: [
    new HappyPack({
      // 用唯一的標識符 id 來代表當前的 HappyPack 是用來處理一類特定的文件
      id: 'babel',
      // 如何處理 .js 文件,用法和 Loader 配置中一樣
      loaders: ['babel-loader?cacheDirectory'],
      // 使用共享進程池中的子進程去處理任務
      threadPool: happyThreadPool,
    }),
    new HappyPack({
      id: 'css',
      // 如何處理 .css 文件绊含,用法和 Loader 配置中一樣
      loaders: ['css-loader'],
      // 使用共享進程池中的子進程去處理任務
      threadPool: happyThreadPool,
    })
  ],
};

使用 ParallelUglifyPlugin

由于壓縮 JavaScript 代碼需要先把代碼解析成用 Object 抽象表示的 AST 語法樹桑嘶,再去應用各種規(guī)則分析和處理 AST,導致這個過程計算量巨大躬充,耗時非常多逃顶。

當 Webpack 有多個 JavaScript 文件需要輸出和壓縮時,原本會使用 UglifyJS 去一個個挨著壓縮再輸出充甚, 但是 ParallelUglifyPlugin 則會開啟多個子進程以政,把對多個文件的壓縮工作分配給多個子進程去完成,每個子進程其實還是通過 UglifyJS 去壓縮代碼伴找,但是變成了并行執(zhí)行盈蛮。 所以 ParallelUglifyPlugin 能更快的完成對多個文件的壓縮工作。

npm i -D webpack-parallel-uglify-plugin

const path = require('path');
const ParallelUglifyPlugin = require('webpack-parallel-uglify-plugin');

module.exports = {
  plugins: [
    // 使用 ParallelUglifyPlugin 并行壓縮輸出的 JS 代碼
    new ParallelUglifyPlugin({
      //開啟幾個子進程去并發(fā)的執(zhí)行壓縮技矮。默認是當前運行電腦的 CPU 核數(shù)減去1抖誉。 
      workerCount: 4,
      // 傳遞給 UglifyJS 的參數(shù)
      uglifyJS: {
        output: {
          // 最緊湊的輸出
          beautify: false,
          // 刪除所有的注釋
          comments: false,
        },
        compress: {
          // 在UglifyJs刪除沒有用到的代碼時不輸出警告
          warnings: false,
          // 刪除所有的 `console` 語句殊轴,可以兼容ie瀏覽器
          drop_console: true,
          // 內(nèi)嵌定義了但是只用到一次的變量
          collapse_vars: true,
          // 提取出出現(xiàn)多次但是沒有定義成變量去引用的靜態(tài)值
          reduce_vars: true,
        }
      },
    }),
  ],
};

輸出質(zhì)量優(yōu)化

使用imagemin-webpack-plugin插件

import ImageminPlugin from 'imagemin-webpack-plugin'

module.exports = {
  plugins: [
    // Make sure that the plugin is after any plugins that add images
    new ImageminPlugin({
      disable: process.env.NODE_ENV !== 'production', // Disable during development
      test: /\.(gif|png|jpe?g|svg)$/i,
      onlyUseIfSmaller: true,
      pngquant: {
        quality: '65-80'
      }
    })
  ]
}

chainWebpack配置

import ImageminWebpackPlugin from 'imagemin-webpack-plugin';

module.exports = {
    chainWebpack: config => {
      config.plugin('imagemin-webpack-plugin')
       .use(ImageminWebpackPlugin, [
         {
           disable: process.env.NODE_ENV !== 'production'
           test: /\.(gif|png|jpe?g|svg)$/i,
           onlyUseIfSmaller: true,
           pngquant: {
            quality: '65-80'
           }
         }
      ]);
    }
}

提取公共代碼

將所有從node_modules的引用打包到一個名字叫vendor的chunk

module.exports = {
  //...
  optimization: {
    splitChunks: {
      cacheGroups: {
        commons: {
          test: /[\\/]node_modules[\\/]/,
          name: 'vendors',
          chunks: 'all'
        }
      }
    }
  }
};
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市袒炉,隨后出現(xiàn)的幾起案子旁理,更是在濱河造成了極大的恐慌,老刑警劉巖我磁,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件孽文,死亡現(xiàn)場離奇詭異,居然都是意外死亡十性,警方通過查閱死者的電腦和手機叛溢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來劲适,“玉大人楷掉,你說我怎么就攤上這事∠际疲” “怎么了烹植?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長愕贡。 經(jīng)常有香客問我草雕,道長,這世上最難降的妖魔是什么固以? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任墩虹,我火速辦了婚禮,結果婚禮上憨琳,老公的妹妹穿的比我還像新娘诫钓。我一直安慰自己,他們只是感情好篙螟,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布菌湃。 她就那樣靜靜地躺著,像睡著了一般遍略。 火紅的嫁衣襯著肌膚如雪惧所。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天绪杏,我揣著相機與錄音下愈,去河邊找鬼。 笑死寞忿,一個胖子當著我的面吹牛驰唬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼叫编,長吁一口氣:“原來是場噩夢啊……” “哼辖佣!你這毒婦竟也來了?” 一聲冷哼從身側響起搓逾,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤卷谈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后霞篡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體世蔗,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年朗兵,在試婚紗的時候發(fā)現(xiàn)自己被綠了污淋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡余掖,死狀恐怖寸爆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盐欺,我是刑警寧澤赁豆,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站冗美,受9級特大地震影響魔种,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜粉洼,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一节预、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧属韧,春花似錦心铃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柱衔。三九已至樊破,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間唆铐,已是汗流浹背哲戚。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留艾岂,地道東北人顺少。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親脆炎。 傳聞我的和親對象是個殘疾皇子梅猿,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354