因爲運行在 Node.js 之上的 Webpack 是單線程模型的,因此Webpack 須要處理的事情須要一件一件的作,不能多件事一塊兒作。 咱們須要Webpack 能同一時間處理多個任務,發揮多核 CPU 電腦的威力,HappyPack 就能讓 Webpack 作到這點,它把任務分解給多個子進程去併發的執行,子進程處理完後再把結果發送給主進程。css
因爲 JavaScript 是單線程模型,要想發揮多核 CPU 的能力,只能經過多進程去實現,而沒法經過多線程實現。node
提示:因爲HappyPack 對file-loader、url-loader 支持的不友好,因此不建議對該loader使用webpack
npm i -D happypack
webpack.config.jsweb
const HappyPack = require('happypack'); const os = require('os'); const happyThreadPool = HappyPack.ThreadPool({ size: os.cpus().length }); module.exports = { module: { rules: [ { test: /\.js$/, //把對.js 的文件處理交給id爲happyBabel 的HappyPack 的實例執行 loader: 'happypack/loader?id=happyBabel', //排除node_modules 目錄下的文件 exclude: /node_modules/ }, ] }, plugins: [ new HappyPack({ //用id來標識 happypack處理那裏類文件 id: 'happyBabel', //如何處理 用法和loader 的配置同樣 loaders: [{ loader: 'babel-loader?cacheDirectory=true', }], //共享進程池 threadPool: happyThreadPool, //容許 HappyPack 輸出日誌 verbose: true, }) ] }
在 Loader 配置中,全部文件的處理都交給了 happypack/loader 去處理,使用緊跟其後的 querystring ?id=babel 去告訴 happypack/loader 去選擇哪一個 HappyPack 實例去處理文件。npm
在 Plugin 配置中,新增了兩個 HappyPack 實例分別用於告訴 happypack/loader 去如何處理 .js 和 .css 文件。選項中的 id 屬性的值和上面 querystring 中的 ?id=babel 相對應,選項中的 loaders 屬性和 Loader 配置中同樣。babel