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

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

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

Webpack 啟動(dòng)后會(huì)從配置的 Entry 出發(fā),解析出文件中的導(dǎo)入語(yǔ)句,再遞歸的解析。

在遇到導(dǎo)入語(yǔ)句時(shí) Webpack 會(huì)做兩件事情:

1.根據(jù)導(dǎo)入語(yǔ)句去尋找對(duì)應(yīng)的要導(dǎo)入的文件。例如 require('react') 導(dǎo)入語(yǔ)句對(duì)應(yīng)的文件是 ./node_modules/react/react.js , require('./util') 對(duì)應(yīng)的文件是 ./util.js 。

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

以上兩件事情雖然對(duì)于處理一個(gè)文件非常快,但是當(dāng)項(xiàng)目大了以后文件量會(huì)變的非常多,這時(shí)候構(gòu)建速度慢的問(wèn)題就會(huì)暴露出來(lái)。

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

接下來(lái)一一介紹可以?xún)?yōu)化它們的途徑。

優(yōu)化 loader 配置

由于 Loader 對(duì)文件的轉(zhuǎn)換操作很耗時(shí),需要讓盡可能少的文件被 Loader 處理。

在 2-3 Module 中介紹過(guò)在使用 Loader 時(shí)可以通過(guò) test 、 include 、 exclude 三個(gè)配置項(xiàng)來(lái)命中 Loader 要應(yīng)用規(guī)則的文件。

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

以采用 ES6 的項(xiàng)目為例,在配置 babel-loader 時(shí),可以這樣:

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

你可以適當(dāng)?shù)恼{(diào)整項(xiàng)目的目錄結(jié)構(gòu),以方便在配置 Loader 時(shí)通過(guò) include 去縮小命中范圍。

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

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

resolve.modules 的默認(rèn)值是 ['node_modules'] ,含義是先去當(dāng)前目錄下的 ./node_modules 目錄下去找想找的模塊,如果沒(méi)找到就去上一級(jí)目錄 ../node_modules 中找,再?zèng)]有就去 ../../node_modules 中找,以此類(lèi)推,這和 Node.js 的模塊尋找機(jī)制很相似。

當(dāng)安裝的第三方模塊都放在項(xiàng)目根目錄下的 ./node_modules 目錄下時(shí),沒(méi)有必要按照默認(rèn)的方式去一層層的尋找,可以指明存放第三方模塊的絕對(duì)路徑,以減少尋找,配置如下:

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

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

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

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

可以存在多個(gè)字段描述入口文件的原因是因?yàn)橛行┠K可以同時(shí)用在多個(gè)環(huán)境中,準(zhǔn)對(duì)不同的運(yùn)行環(huán)境需要使用不同的代碼。

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

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

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

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

resolve.mainFields 的默認(rèn)值和當(dāng)前的 target 配置有關(guān)系,對(duì)應(yīng)關(guān)系如下:

  • 當(dāng) target 為 web 或者 webworker 時(shí),值是 ["browser", "module", "main"]
  • 當(dāng) target 為其它情況時(shí),值是 ["module", "main"]

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

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

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

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

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

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

在 2-4 Resolve 中介紹過(guò) resolve.alias 配置項(xiàng)通過(guò)別名來(lái)把原導(dǎo)入路徑映射成一個(gè)新的導(dǎo)入路徑。

在實(shí)戰(zhàn)項(xiàng)目中經(jīng)常會(huì)依賴(lài)一些龐大的第三方模塊,以 React 庫(kù)為例,安裝到 node_modules 目錄下的 React 庫(kù)的目錄結(jié)構(gòu)如下:

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

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

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

默認(rèn)情況下 Webpack 會(huì)從入口文件 ./node_modules/react/react.js 開(kāi)始遞歸的解析和處理依賴(lài)的幾十個(gè)文件,這會(huì)時(shí)一個(gè)耗時(shí)的操作。

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

相關(guān) Webpack 配置如下:

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

除了 React 庫(kù)外,大多數(shù)庫(kù)發(fā)布到 Npm 倉(cāng)庫(kù)中時(shí)都會(huì)包含打包好的完整文件,對(duì)于這些庫(kù)你也可以對(duì)它們配置 alias。
但是對(duì)于有些庫(kù)使用本優(yōu)化方法后會(huì)影響到后面要講的 使用 Tree-Shaking 去除無(wú)效代碼 的優(yōu)化,因?yàn)榇虬玫耐暾募杏胁糠执a你的項(xiàng)目可能永遠(yuǎn)用不上。

一般對(duì)整體性比較強(qiáng)的庫(kù)采用本方法優(yōu)化,因?yàn)橥暾募械拇a是一個(gè)整體,每一行都是不可或缺的。

但是對(duì)于一些工具類(lèi)的庫(kù),例如 lodash ,你的項(xiàng)目可能只用到了其中幾個(gè)工具函數(shù),你就不能使用本方法去優(yōu)化,因?yàn)檫@會(huì)導(dǎo)致你的輸出代碼中包含很多永遠(yuǎn)不會(huì)執(zhí)行的代碼。

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

在導(dǎo)入語(yǔ)句沒(méi)帶文件后綴時(shí),Webpack 會(huì)自動(dòng)帶上后綴后去嘗試詢(xún)問(wèn)文件是否存在。

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

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

也就是說(shuō)當(dāng)遇到 require('./data') 這樣的導(dǎo)入語(yǔ)句時(shí),Webpack 會(huì)先去尋找 ./data.js 文件,如果該文件不存在就去尋找 ./data.json 文件,如果還是找不到就報(bào)錯(cuò)。

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

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

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

相關(guān) Webpack 配置如下:

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

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

在 2-3 Module 中介紹過(guò) module.noParse 配置項(xiàng)可以讓 Webpack 忽略對(duì)部分沒(méi)采用模塊化的文件的遞歸解析處理,這樣做的好處是能提高構(gòu)建性能。

原因是一些庫(kù),例如 jQuery 、ChartJS, 它們龐大又沒(méi)有采用模塊化標(biāo)準(zhǔn),讓 Webpack 去解析這些文件耗時(shí)又沒(méi)有意義。

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

相關(guān) Webpack 配置如下:

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

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

總結(jié)

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    下面小編就為大家?guī)?lái)一篇在原生不支持的舊環(huán)境中添加兼容的Object.keys實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • 利用原生的JavaScript實(shí)現(xiàn)簡(jiǎn)單拼圖游戲

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

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

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

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

最新評(píng)論

宁蒗| 吴桥县| 会宁县| 连城县| 封丘县| 广宗县| 泌阳县| 铅山县| 家居| 商丘市| 区。| 宜昌市| 永年县| 于都县| 刚察县| 龙岩市| 临潭县| 亳州市| 措美县| 吉林省| 仙居县| 双流县| 洛川县| 文安县| 辽源市| 农安县| 延寿县| 丹东市| 阜阳市| 宜兴市| 林甸县| 芮城县| 景谷| 栾城县| 静宁县| 西城区| 杭锦旗| 阿尔山市| 郎溪县| 报价| 中卫市|