最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

webpack常用構建優(yōu)化策略小結

 更新時間:2019年11月21日 09:35:52   作者:jackwang  
這篇文章主要介紹了webpack常用構建優(yōu)化策略小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

簡介

讀了《深入淺出webpack》總結一下常用的webpack的構建優(yōu)化策略,可通過以下手段來提升項目構建時的速度

更精準的loader規(guī)則

將loader規(guī)則寫清楚

僅讓需要處理的文件,進入loader處理環(huán)節(jié),如下

  rules: [{
   // 正則盡量準確
   test: /\.js$/,
   // 使用緩存,緩存后在文件未改變時編譯會更快(緩存查找原理見補充1)
   use: ['babel-loader?cacheDirectory'],
   // 指定需要處理的目錄
   include: path.resolve(__dirname, 'src')
   // 理論上只有include就夠了,但是某些情況需要排除文件的時候可以用這個,排除不需要處理文件
   // exclude: []
  }]

更精準的查找目錄

將查找路徑設置精確

理論上我們項目的第三方依賴均應在自己的工程的node_modules下,所以我們可以設置查找目錄,減少node的默認查找(默認查找方式見補充2)

module.exports = {
  resolve: {
    // 指定當前目錄下的node_modules目錄
    modules: [path.resolve(__dirname, 'node_modules')]
  }
}

更精準的擴展名

數(shù)量更多類型的文件盡量放在前面

平時寫代碼,我們都習慣直接寫文件名,而不去寫擴展名,那么解析則按照下面屬性進行解析

module.exports = {
  extensions: ['.js', '.jsx', '.ts', '.tsx'],
}

默認值

extensions: [".js", ".json"]

使用動態(tài)鏈接庫預編譯大模塊

使用動態(tài)鏈接庫,提前編譯大模塊

原理請見補充3

新建一個文件webpack_dll.config.js,內(nèi)容如下

const path = require('path');
const webpack = require('webpack');

// 復用的大模塊放在這里,這樣每次都不需要重新編譯了
const vendors = [
 'react',
 'react-dom',
 'lodash'
];

module.exports = {
 mode: 'development',
 output: {
  path: path.resolve(__dirname, './dist'),
  filename: '[name].js',
  library: '[name]',
 },
 entry: {
  vendors,
 },
 plugins: [
  new webpack.DllPlugin({
   path: path.resolve(__dirname, './dist/manifest.json'),
   name: '[name]',
  }),
 ],
};

執(zhí)行webpack --config webpack_dll.config.js進行首次編譯(如果更新版本需要再次編譯)

然后在你的webpack配置文件中引入manifest.json

 plugins: [
  new webpack.DllReferencePlugin({
   manifest: require('./dist/manifest.json')
  })
 ],

多進程處理文件

使用HappyPack同時處理多個loader編譯任務

為了發(fā)揮多核CPU電腦的功能,利用HappyPack將任務分發(fā)給多個子進程并發(fā)執(zhí)行

const path = require('path');
const HappyPack = require('happypack');
// 共享5個進程池
const happyThreadPool = HappyPack.ThreadPool({ size: 5 });

module.exports = {
 entry: './src/index.js',
 output: {
  filename: 'bundle.js',
  path: path.resolve(__dirname, 'dist'),
 },
 module: {
  // noParse: [/react\.production\.min\.js$/],
  rules: [{
   test: /\.js$/,
   // 和下面插件id一直,happypack才可以找到
   use: ['happypack/loader?id=babel'],
   include: path.resolve(__dirname, 'src')
  }]
 },
 plugins: [
  // 插件可以實例化多個
  new HappyPack({
   // 與上面對應
   id: 'babel',
   // 實際要使用的loader
   loaders: ['babel-loader?cacheDirectory'],
   // 默認開啟進程數(shù)
   threads: 3,
   // 是否允許happyPack打印日志
   verbose: true,
   // 共享進程數(shù),如果你使用超過一個happyplugin,官方建議共享進程池
   threadPool: happyThreadPool
  })
 ],
};

原理見補充4

多進程壓縮文件

使用ParallelUglifyPlugin多進程同時壓縮文件

ParallelUglifyPlugin是在UglifyJS基礎上,增加了多進出處理的能力,加快了壓縮速度

import ParallelUglifyPlugin from 'webpack-parallel-uglify-plugin';
 
module.exports = {
 plugins: [
  new ParallelUglifyPlugin({
   test,
   include,
   exclude,
   cacheDir,
   workerCount,
   sourceMap,
   uglifyJS: {
   },
   uglifyES: {
   }
  }),
 ],
};

減少監(jiān)聽文件

減少監(jiān)聽文件

原理見補充5

當我們使用webpack的watch功能進行文件監(jiān)聽時,更好的方式是控制監(jiān)聽目錄,如下,排除node_modules減少對該目錄監(jiān)聽,減少編譯所需要循環(huán)的文件,提高檢查速度

module.export = {
  watchOptions: {
    ignored: /node_modules/
  }
}

其他沒那么重要的優(yōu)化

更精準的mainFields

默認的這個值查找方式見官網(wǎng)點擊此處

看了下react和lodash,只有一個main,目前來看使用es6看來還不普遍,所以這個值目前可能不太重要

module.exports = {
  resolve: {
    mainFields: ['main']
  }
}

第三方庫映射

為什么這個不重要,我發(fā)現(xiàn)react直接導出的index.js則是根據(jù)環(huán)境判斷使用哪份代碼,目測來看并不需要進行循環(huán)依賴的處理

通過依賴,則可以直接使用打包后代碼,而不需webpack去循環(huán)依賴

 resolve: {
  mainFields: ["main"],
  alias: {
   'react': path.resolve(__dirname, './node_modules/react/cjs/react.production.min.js')
  }
 }

不使用inline模式的devServer

原理見補充6

默認情況下,應用程序啟用內(nèi)聯(lián)模式(inline mode)。這意味著一段處理實時重載的腳本被插入到你的包(bundle)中,并且構建消息將會出現(xiàn)在瀏覽器控制臺。

當使用inline模式時,devServer會向每個Chunk中注入一段重載的腳本代碼,但是其實一個頁面只需要一次,所以當Chunk過多時,可以將inline設置為false

module.export = {
  devServer: {
    inline: false
  }
}

補充

補充1-cacheDirectory原理

當有設置cacheDirectory時,指定的目錄將用來緩存loader的執(zhí)行結果。之后的 webpack 構建,將會嘗試讀取緩存,來避免在每次執(zhí)行時,可能產(chǎn)生的、高性能消耗的Babel重新編譯過程。如果設置了一個空值 (loader: 'babel-loader?cacheDirectory') 或者 true (loader: babel-loader?cacheDirectory=true),loader 將使用默認的緩存目錄 node_modules/.cache/babel-loader,如果在任何根目錄下都沒有找到 node_modules 目錄,將會降級回退到操作系統(tǒng)默認的臨時文件目錄。

補充2-node的默認查找方式

  • 查找當前目錄下的node_modules目錄,看是否有匹配項,如有,命中文件
  • 尋找父目錄的下的node_modules,如有,命中文件
  • 按照這個規(guī)則一直往父目錄搜索直到到根目錄下的node_modules

補充3-動態(tài)鏈接庫思想

大量項目中可以復用的模塊只需要被編譯一次,在之后的構建過程中被動態(tài)鏈接庫包含的模塊將不會重新編譯,而是直接使用動態(tài)鏈接庫中的代碼。(注:如果升級依賴的模塊版本,需要重新編譯動態(tài)鏈接庫)

補充4-HappyPack原理

webpack構建中,需要大量的loader轉換操作,很耗時,由于nodejs是單線程的,如果想更好利用cpu的多核能力,可以開啟多個進程,同時對文件進行處理;可以看到在配置文件中,我們每次將文件交給happypack-loader去處理,然后由happypack去調(diào)度來執(zhí)行文件的處理(happypack采用哪個loaders進行處理,是通過id知道的)

補充5-文件監(jiān)聽原理

webpack會從入口觸發(fā),將所有的依賴項放到一個list里邊,然后每次修改文件內(nèi)容,回去遍歷整個list里邊的文件,看是否有編輯時間的變化,如果有的話則進行編譯

補充6-自動刷新原理

  • 向要開發(fā)的網(wǎng)頁中注入代理客戶端代碼,通過代理客戶端去刷新整個頁面(默認)
  • 將要開發(fā)的網(wǎng)頁放進一個iframe,通過刷新iframe去看刷新效果

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • electron多標簽頁模式更像客戶端的實現(xiàn)示例

    electron多標簽頁模式更像客戶端的實現(xiàn)示例

    本文主要介紹了electron多標簽頁模式更像客戶端,通過創(chuàng)建和管理多個網(wǎng)頁視圖或使用現(xiàn)成組件來實現(xiàn)類似Web瀏覽器的標簽頁功能,具有一定的參考價值,感興趣的可以了解一下
    2024-11-11
  • JavaScript Uploadify文件上傳實例

    JavaScript Uploadify文件上傳實例

    這篇文章主要為大家詳細介紹了Uploadify文件上傳小實例,一個簡單的jsp上傳小功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • JavaScript圖片url地址轉base64簡單示例

    JavaScript圖片url地址轉base64簡單示例

    這篇文章主要給大家介紹了關于JavaScript圖片url地址轉base64的相關資料,圖片URL轉Base64是把圖片URL轉化為一個以base64編碼的字符串格式,使得圖片可以直接在HTML或CSS中使用,需要的朋友可以參考下
    2023-10-10
  • uniapp頁面?zhèn)鲄⒌娜N方式實例總結

    uniapp頁面?zhèn)鲄⒌娜N方式實例總結

    在進行頁面的跳轉的時候,往往需要我們將一些參數(shù)攜帶著傳遞過去這里的class樣式,下面這篇文章主要給大家介紹了關于uniapp頁面?zhèn)鲄⒌娜N方式,需要的朋友可以參考下
    2022-11-11
  • pace.js頁面加載進度條插件

    pace.js頁面加載進度條插件

    在頁面中引入 Pace.js 和您所選擇主題的 CSS 文件,就可以讓你的頁面擁有漂亮的加載進度和 Ajax 導航效果。不需要掛接到任何代碼,自動檢測進展。您可以選擇顏色和多種效果,有簡約,閃光燈,MAC OSX,左側填充,頂部填充,計數(shù)器和彈跳等等。
    2015-09-09
  • javascript多行字符串的簡單實現(xiàn)方式

    javascript多行字符串的簡單實現(xiàn)方式

    之前我們給大家講訴過javascript多行字符串的7種解決辦法,今天來給大家分享一個更簡單的方法,非常的實用,大家一定要仔細看看哦。
    2015-05-05
  • JavaScript中Location.search處理使用方法

    JavaScript中Location.search處理使用方法

    本文主要介紹了JavaScript中Location.search處理使用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • postMessage及webSocket跨域方案詳解

    postMessage及webSocket跨域方案詳解

    這篇文章主要為大家介紹了postMessage及webSocket跨域方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • style、 currentStyle、 runtimeStyle區(qū)別分析

    style、 currentStyle、 runtimeStyle區(qū)別分析

    style、 currentStyle、 runtimeStyle區(qū)別分析,需要的朋友可以參考下。
    2010-08-08
  • JavaScript輸入郵箱自動提示實例代碼

    JavaScript輸入郵箱自動提示實例代碼

    這篇文章主要介紹了JavaScript輸入郵箱自動提示實例代碼,有需要的朋友可以參考一下
    2014-01-01

最新評論

渝北区| 武义县| 张家港市| 抚松县| 海原县| 泰顺县| 高平市| 潍坊市| 汨罗市| 卓资县| 酒泉市| 塔城市| 马关县| 乐安县| 东乡族自治县| 东海县| 南投市| 阿瓦提县| 昌乐县| 石阡县| 宜章县| 阆中市| 嘉善县| 将乐县| 德昌县| 达州市| 旅游| 磐石市| 庐江县| 宜黄县| 巴里| 安龙县| 青铜峡市| 平谷区| 祁东县| 汤阴县| 大冶市| 托克托县| 曲周县| 云和县| 剑川县|