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

Webpack優(yōu)化配置縮小文件搜索范圍

 更新時間:2017年12月25日 11:34:20   作者:吳浩麟  
這篇文章主要介紹了Webpack優(yōu)化-縮小文件搜索范圍的相關知識,文中較詳細的給大家介紹了可以優(yōu)化的途徑,需要的朋友可以參考下

Webpack 啟動后會從配置的 Entry 出發(fā),解析出文件中的導入語句,再遞歸的解析。

在遇到導入語句時 Webpack 會做兩件事情:

1.根據(jù)導入語句去尋找對應的要導入的文件。例如 require('react') 導入語句對應的文件是 ./node_modules/react/react.js , require('./util') 對應的文件是 ./util.js 。

2.根據(jù)找到的要導入文件的后綴,使用配置中的 Loader 去處理文件。例如使用 ES6 開發(fā)的 JavaScript 文件需要使用 babel-loader 去處理。

以上兩件事情雖然對于處理一個文件非??欤钱旐椖看罅艘院笪募繒兊姆浅6?,這時候構建速度慢的問題就會暴露出來。

雖然以上兩件事情無法避免,但需要盡量減少以上兩件事情的發(fā)生,以提高速度。

接下來一一介紹可以優(yōu)化它們的途徑。

優(yōu)化 loader 配置

由于 Loader 對文件的轉換操作很耗時,需要讓盡可能少的文件被 Loader 處理。

在 2-3 Module 中介紹過在使用 Loader 時可以通過 test 、 include 、 exclude 三個配置項來命中 Loader 要應用規(guī)則的文件。

為了盡可能少的讓文件被 Loader 處理,可以通過 include 去命中只有哪些文件需要被處理。

以采用 ES6 的項目為例,在配置 babel-loader 時,可以這樣:

module.exports = {
 module: {
  rules: [
   {
    // 如果項目源碼中只有 js 文件就不要寫成 /\.jsx?$/,提升正則表達式性能
    test: /\.js$/,
    // babel-loader 支持緩存轉換出的結果,通過 cacheDirectory 選項開啟
    use: ['babel-loader?cacheDirectory'],
    // 只對項目根目錄下的 src 目錄中的文件采用 babel-loader
    include: path.resolve(__dirname, 'src'),
   },
  ]
 },
};

你可以適當?shù)恼{整項目的目錄結構,以方便在配置 Loader 時通過 include 去縮小命中范圍。

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

在 2-4 Resolve 中介紹過 resolve.modules 用于配置 Webpack 去哪些目錄下尋找第三方模塊。

resolve.modules 的默認值是 ['node_modules'] ,含義是先去當前目錄下的 ./node_modules 目錄下去找想找的模塊,如果沒找到就去上一級目錄 ../node_modules 中找,再沒有就去 ../../node_modules 中找,以此類推,這和 Node.js 的模塊尋找機制很相似。

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

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

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

在 2-4 Resolve 中介紹過 resolve.mainFields 用于配置第三方模塊使用哪個入口文件。

安裝的第三方模塊中都會有一個 package.json 文件用于描述這個模塊的屬性,其中有些字段用于描述入口文件在哪里, resolve.mainFields 用于配置采用哪個字段作為入口文件的描述。

可以存在多個字段描述入口文件的原因是因為有些模塊可以同時用在多個環(huán)境中,準對不同的運行環(huán)境需要使用不同的代碼。

以 isomorphic-fetch 為例,它是 fetch API 的一個實現(xiàn),但可同時用于瀏覽器和 Node.js 環(huán)境。

它的 package.json 中就有2個入口文件描述字段:

{
 "browser": "fetch-npm-browserify.js",
 "main": "fetch-npm-node.js"
}

isomorphic-fetch 在不同的運行環(huán)境下使用不同的代碼是因為 fetch API 的實現(xiàn)機制不一樣,在瀏覽器中通過原生的 fetch 或者 XMLHttpRequest 實現(xiàn),在 Node.js 中通過 http 模塊實現(xiàn)。

resolve.mainFields 的默認值和當前的 target 配置有關系,對應關系如下:

  • 當 target 為 web 或者 webworker 時,值是 ["browser", "module", "main"]
  • 當 target 為其它情況時,值是 ["module", "main"]

以 target 等于 web 為例,Webpack 會先采用第三方模塊中的 browser 字段去尋找模塊的入口文件,如果不存在就采用 module 字段,以此類推。

為了減少搜索步驟,在你明確第三方模塊的入口文件描述字段時,你可以把它設置的盡量少。

由于大多數(shù)第三方模塊都采用 main 字段去描述入口文件的位置,可以這樣配置 Webpack:

module.exports = {
 resolve: {
  // 只采用 main 字段作為入口文件描述字段,以減少搜索步驟
  mainFields: ['main'],
 },
};

使用本方法優(yōu)化時,你需要考慮到所有運行時依賴的第三方模塊的入口文件描述字段,就算有一個模塊搞錯了都可能會造成構建出的代碼無法正常運行。

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

在 2-4 Resolve 中介紹過 resolve.alias 配置項通過別名來把原導入路徑映射成一個新的導入路徑。

在實戰(zhàn)項目中經(jīng)常會依賴一些龐大的第三方模塊,以 React 庫為例,安裝到 node_modules 目錄下的 React 庫的目錄結構如下:

├── dist
│   ├── react.js
│   └── react.min.js
├── lib
│   ... 還有幾十個文件被忽略
│   ├── LinkedStateMixin.js
│   ├── createClass.js
│   └── React.js
├── package.json
└── react.js

可以看到發(fā)布出去的 React 庫中包含兩套代碼:

  • 一套是采用 CommonJS 規(guī)范的模塊化代碼,這些文件都放在 lib 目錄下,以 package.json 中指定的入口文件 react.js 為模塊的入口。
  • 一套是把 React 所有相關的代碼打包好的完整代碼放到一個單獨的文件中,這些代碼沒有采用模塊化可以直接執(zhí)行。其中 dist/react.js 是用于開發(fā)環(huán)境,里面包含檢查和警告的代碼。 dist/react.min.js 是用于線上環(huán)境,被最小化了。

默認情況下 Webpack 會從入口文件 ./node_modules/react/react.js 開始遞歸的解析和處理依賴的幾十個文件,這會時一個耗時的操作。

通過配置 resolve.alias 可以讓 Webpack 在處理 React 庫時,直接使用單獨完整的 react.min.js 文件,從而跳過耗時的遞歸解析操作。

相關 Webpack 配置如下:

module.exports = {
 resolve: {
  // 使用 alias 把導入 react 的語句換成直接使用單獨完整的 react.min.js 文件,
  // 減少耗時的遞歸解析操作
  alias: {
   'react': path.resolve(__dirname, './node_modules/react/dist/react.min.js'),
  }
 },
};

除了 React 庫外,大多數(shù)庫發(fā)布到 Npm 倉庫中時都會包含打包好的完整文件,對于這些庫你也可以對它們配置 alias。
但是對于有些庫使用本優(yōu)化方法后會影響到后面要講的 使用 Tree-Shaking 去除無效代碼 的優(yōu)化,因為打包好的完整文件中有部分代碼你的項目可能永遠用不上。

一般對整體性比較強的庫采用本方法優(yōu)化,因為完整文件中的代碼是一個整體,每一行都是不可或缺的。

但是對于一些工具類的庫,例如 lodash ,你的項目可能只用到了其中幾個工具函數(shù),你就不能使用本方法去優(yōu)化,因為這會導致你的輸出代碼中包含很多永遠不會執(zhí)行的代碼。

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

在導入語句沒帶文件后綴時,Webpack 會自動帶上后綴后去嘗試詢問文件是否存在。

在 2-4 Resolve 中介紹過 resolve.extensions 用于配置在嘗試過程中用到的后綴列表,默認是:

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

也就是說當遇到 require('./data') 這樣的導入語句時,Webpack 會先去尋找 ./data.js 文件,如果該文件不存在就去尋找 ./data.json 文件,如果還是找不到就報錯。

如果這個列表越長,或者正確的后綴在越后面,就會造成嘗試的次數(shù)越多,所以 resolve.extensions 的配置也會影響到構建的性能。

在配置 resolve.extensions 時你需要遵守以下幾點,以做到盡可能的優(yōu)化構建性能:

  • 后綴嘗試列表要盡可能的小,不要把項目中不可能存在的情況寫到后綴嘗試列表中。
  • 頻率出現(xiàn)最高的文件后綴要優(yōu)先放在最前面,以做到盡快的退出尋找過程。
  • 在源碼中寫導入語句時,要盡可能的帶上后綴,從而可以避免尋找過程。例如在你確定的情況下把 require('./data') 寫成 require('./data.json') 。

相關 Webpack 配置如下:

module.exports = {
 resolve: {
  // 盡可能的減少后綴嘗試的可能性
  extensions: ['js'],
 },
};

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

在 2-3 Module 中介紹過 module.noParse 配置項可以讓 Webpack 忽略對部分沒采用模塊化的文件的遞歸解析處理,這樣做的好處是能提高構建性能。

原因是一些庫,例如 jQuery 、ChartJS, 它們龐大又沒有采用模塊化標準,讓 Webpack 去解析這些文件耗時又沒有意義。

在上面的 優(yōu)化 resolve.alias 配置 中講到單獨完整的 react.min.js 文件就沒有采用模塊化,讓我們來通過配置 module.noParse 忽略對 react.min.js 文件的遞歸解析處理,

相關 Webpack 配置如下:

const path = require('path');
module.exports = {
 module: {
  // 獨完整的 `react.min.js` 文件就沒有采用模塊化,忽略對 `react.min.js` 文件的遞歸解析處理
  noParse: [/react\.min\.js$/],
 },
};

注意被忽略掉的文件里不應該包含 import 、 require 、 define 等模塊化語句,不然會導致構建出的代碼中包含無法在瀏覽器環(huán)境下執(zhí)行的模塊化語句。

總結

以上所述是小編給大家介紹的Webpack優(yōu)化配置縮小文件搜索范圍,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關文章

  • uni-app開發(fā)微信小程序之H5壓縮上傳圖片的問題詳解

    uni-app開發(fā)微信小程序之H5壓縮上傳圖片的問題詳解

    這次項目中做了一個圖片上傳,要求是大于2MB的就壓縮成2MB一下的再上傳,下面這篇文章主要給大家介紹了關于uni-app開發(fā)微信小程序之H5壓縮上傳圖片的問題,需要的朋友可以參考下
    2023-03-03
  • 微信小程序JSON配置文件詳細講解作用

    微信小程序JSON配置文件詳細講解作用

    JSON是一種數(shù)據(jù)格式,在實際開發(fā)中,JSON總是以配置文件的形式出現(xiàn)。小程序項目中也不例外:通過不同的Json配置文件,可以對小程序項目進行不同級別的配置
    2022-10-10
  • JS實現(xiàn)控制表格只顯示行邊框或者只顯示列邊框的方法

    JS實現(xiàn)控制表格只顯示行邊框或者只顯示列邊框的方法

    這篇文章主要介紹了JS實現(xiàn)控制表格只顯示行邊框或者只顯示列邊框的方法,涉及javascript使用表格對象的rules屬性的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • jquery form表單獲取內容以及綁定數(shù)據(jù)

    jquery form表單獲取內容以及綁定數(shù)據(jù)

    這篇文章主要介紹了jquery form表單獲取內容以及form表單綁定數(shù)據(jù),獲取表單的數(shù)據(jù)保存到數(shù)據(jù)庫,或者將數(shù)據(jù)綁定到form表單,感興趣的小伙伴們可以參考一下
    2016-02-02
  • 基于JS制作一個簡單的網(wǎng)頁版地圖

    基于JS制作一個簡單的網(wǎng)頁版地圖

    本文將利用JS實現(xiàn)一個簡單的網(wǎng)頁版地圖,這個簡單的網(wǎng)頁版地圖能根據(jù)城市名進行位置查詢。文中的示例代碼講解詳細,感興趣的可以了解一下
    2022-05-05
  • 小程序和web畫三角形實現(xiàn)解析

    小程序和web畫三角形實現(xiàn)解析

    這篇文章主要介紹了小程序和web畫三角形實現(xiàn)解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • JS返回只包含數(shù)字類型的數(shù)組實例分析

    JS返回只包含數(shù)字類型的數(shù)組實例分析

    這篇文章主要介紹了JS返回只包含數(shù)字類型的數(shù)組實現(xiàn)方法,結合實例形式分析了循環(huán)遍歷數(shù)組及正則匹配兩種實現(xiàn)技巧,需要的朋友可以參考下
    2016-12-12
  • 在原生不支持的舊環(huán)境中添加兼容的Object.keys實現(xiàn)方法

    在原生不支持的舊環(huán)境中添加兼容的Object.keys實現(xiàn)方法

    下面小編就為大家?guī)硪黄谠恢С值呐f環(huán)境中添加兼容的Object.keys實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • 利用原生的JavaScript實現(xiàn)簡單拼圖游戲

    利用原生的JavaScript實現(xiàn)簡單拼圖游戲

    拼圖游戲是我們大家都玩過的一款小游戲,下面這篇文章主要給大家介紹了關于如何利用原生的JavaScript實現(xiàn)簡單拼圖游戲的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-11-11
  • 原生JS實現(xiàn)實時鐘表

    原生JS實現(xiàn)實時鐘表

    這篇文章主要為大家詳細介紹了原生JS實現(xiàn)實時鐘表,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08

最新評論

公安县| 寿阳县| 鸡东县| 昭苏县| 临汾市| 敦化市| 英德市| 象州县| 六盘水市| 二手房| 麦盖提县| 临汾市| 潼关县| 福贡县| 广水市| 荥经县| 巴东县| 土默特左旗| 宜州市| 富源县| 上栗县| 利津县| 遂昌县| 丰宁| 渝中区| 竹山县| 沧州市| 琼海市| 泰顺县| 神木县| 弋阳县| 临夏县| 修文县| 太原市| 揭西县| 南和县| 沙河市| 突泉县| 遂溪县| 临朐县| 泸西县|