1. 程式人生 > >webpack打包優化之外部擴充套件externals的實際應用

webpack打包優化之外部擴充套件externals的實際應用

目錄

前言

使用vue-cli建立專案,使用webpack打包。其中,有一個webpack優化webpack.optimize.CommonsChunkPlugin,它會將node_modules中的必需模組提取到vendor檔案中,專案開發中,增加第三方模組,比如element-uivue-echarts等,vendor的包都會增大。這個時候,就需要考慮減輕vendor包的大小,增加構建速度。我們可以使用webpack的外部擴充套件(externals)功能。

externals定義

externals配置選項,將指定的內容排除在構建的vendor中,但是,指定的內容需要出現在使用者環境中。
以上是我的理解。

官方解釋是:
The externals configuration option provides a way of excluding dependencies from the output bundles. Instead, the created bundle relies on that dependency to be present in the consumer's environment.
externals配置選項提供了「從輸出的 bundle 中排除依賴」的方法。相反,所建立的 bundle 依賴於那些存在於使用者環境(consumer's environment)中的依賴。

用法

防止將某些 import的包打包到bundle中,而是在執行時(runtime)再去外部獲取這些擴充套件依賴(external dependencies)
可以通過多種編寫方式實現:string,array,object,function,regex。這裡,我只說一些簡單的內容,詳細講解,我覺得這個解釋不錯。

module.exports = {
  // ...
  externals: [ // array形式
    { // object形式
      './a', 'a', // string形式
      jquery: 'jQuery', 
      vue: 'Vue',
    },
    function(context, request, callback) { // function形式
      if(request.substr(0, 1) !== '.') callback(null, 'commonjs ' + request)
      callback()
    },
    /^[a-z\-0-9]+$/, // regex形式
  ]
}

除了function形式,必須在array形式中,其他形式,都可以提升,直接作為externals屬性使用。比如string形式:

externals: {
    './a': 'a',
    jquery: 'jQuery'
}

string

屬性名稱是jquery,表示應該排除import $ from 'jquery'中的 jquery模組。為了替換這個模組,jquery的值將被用來檢索一個全域性的$變數。換句話說,當設定為一個字串時,它將被視為全域性的,我們需要在全域性變數中,找到$,才能使程式正確執行。

array

陣列內的每一個元素都可以是多種形式,包括object, regex, function, string四種:

object

object形式,可以直接作為externals的值,這種形式是絕大部分專案中的配置形式。它裡面一定是鍵值對(key: value)的形式。

function

function的使用,只能在array形式中作為一個元素傳入。

regex

正則匹配的形式,通過傳入正則表示式來實現匹配。這個可以放在陣列形式中,也可以直接作為externals的屬性。

實際案例

案例地址
以上說了如何配置的問題,在工作中,具體會是一個怎樣的表現呢。我挑選了一個常用的配置object形式,做了一些操作,對比下。

  • 第一種情況,完全不使用externals配置。
    第一種情況的截圖
    first build
    first browser load

  • 第二種情況,通過npm run build --report得出的報告,將一些不常修改的大包作為外部擴充套件。
    這需要做兩步操作:第一步修改webpack.base.conf.js檔案,第二步,將外部擴充套件的內容通過其他方式載入到window環境,這裡,我們通過<script>標籤,並使用cdn來完成。
    配置的檔案:webpack.base.conf.js
externals: {
  vue : 'Vue',
  "echarts": 'echarts',
  "element-ui": 'ELEMENT'
}

在模板檔案index.html中,新增<script>標籤

<script src="https://unpkg.com/[email protected]/dist/vue.min.js"></script>
<script src="https://unpkg.com/[email protected]/lib/index.js"></script>
<script src="https://unpkg.com/[email protected]/dist/echarts.min.js"></script>

第二種情況的截圖:
second build
second browser load

這兩種情況,我們主要從打包的時間,打包之後包的大小,實際瀏覽器中載入時長三個方面來做比較。

打包時間

打包時間,由原來的38s縮短至18s,大大減少了打包時間。

打包之後包的大小

主要看vendor包的大小,由原來的1.45M縮小至41.3k,縮小的內容,我們使用cdn,使其存在於外部環境。
由於externals屬性,是將依賴排除,本該將node_modules中依賴包打入到vendor bundle中,變成外部擴充套件。

瀏覽器載入

使用externals屬性,外部擴充套件,會增加請求數,由原來的6個請求變成了9個請求。由於是使用CDN,非首次請求,會使用快取中的資料,所以載入時間不受太大影響。
截圖所示時間不同,這個和多方面因素有關。你在相同的環境,每次重新整理得到的結果都不一樣。

需要注意

如果發現問題,可以通過以下幾個方向查詢:

  1. script的先後順序
  2. cdn的地址路徑是否正確
  3. 瀏覽器的window屬性值,是否和你的externals屬性的value相對應。可以在console控制檯輸出看看。
  4. externals的打包支援什麼型別的,就和output.libraryTargetoutput.library 這兩個屬性有關係了。唐霜講的清楚點,可以看看

參考

相關推薦

webpack打包優化外部擴充套件externals實際應用

目錄 前言 使用vue-cli建立專案,使用webpack打包。其中,有一個webpack優化webpack.optimize.CommonsChunkPlugin,它會將node_modules中的必需模組提取到vendor檔案中,專案開發中,增加第三方模組,比如element-ui、vue-echart

[轉] Webpack 打包優化體積篇

使用 無奈 絲毫 utili -m n) 保存 影響 ast 談及如今欣欣向榮的前端圈,不僅有各類框架百花齊放,如Vue, React, Angular等等,就打包工具而言,發展也是如火如荼,百家爭鳴;從早期的王者Browserify, Grunt,到後來贏得寶座的 Gul

Webpack 打包優化速度篇

  在前文 Webpack 打包優化之體積篇中,對如何減小 Webpack 打包體積,做了些探討;當然,那些法子對於打包速度的提升,也是大有裨益。然而,打包速度之於開發體驗和及時構建,相當重要;所以有必要對其做更為深入的研究,以便完善工作流,這就是本

Webpack 打包優化體積篇

談及如今欣欣向榮的前端圈,不僅有各類框架百花齊放,如Vue, React, Angular等等,就打包工具而言,發展也是如火如荼,百家爭鳴;從早期的王者Browserify, Grunt,到後來贏得寶座的 Gulp, 以及獨樹一幟的 fis3, 以及下一代打包神器 Rol

基於CommonsChunkPlugin,webpack打包優化

affect emp epc ace extract 前端 創建 ring 關聯關系 前段時間一直在基於webpack進行前端資源包的瘦身。在項目中基於路由進行代碼分離,http://www.cnblogs.com/legu/p/7251562.html。但是打包的文件

webpack打包優化並開啟gzip

2.x too 分享圖片 交流 mage 左右 bpa 靜態資源 resion 應用場景:項目使用webpack2.x進行打包,打包後靜態資源通過nginx轉發配置: 問題:webpack打包後的資源文件特別,特別大,沒打包之前頁面一個頁面js有2M左右(其中已經抽離了cs

webpack打包優化

1.減小檔案搜尋範圍 配置resolve.modules Webpack的resolve.modules配置模組庫(即 node_modules)所在的位置,在 js 裡出現 import ‘vue’ 這樣不是相對、也不是絕對路徑的寫法時,會去 node_modules 目錄下找

webpack打包優化的解決方案

一、DLL方式 DLL方式就是通過配置,告訴webpack指定庫在專案中的位置,從而直接引入,不將其打包在內 DLL方式就是指定包在的專案中,build的時候不在打包對應的包,使用的時候引入。 webpack通過webpack.DllPlugin與webpack.DllReferenc

Webpack打包優化:使用外鏈與拆包模式

一、發現問題 這是一個基於 vue-cli 的管理後臺專案,由於依賴較多,打包結果如下 二、查詢原因 為什麼 vendor 體

webpack 打包優化的四種方法(多程序打包,多程序壓縮,資源 CDN,動態 polyfill)

如今,webpack 毫無疑問是前端構建領域裡最耀眼的一顆星,無論你前端走哪條路線,都需要有很強的webpack 知識。webpack 的基本用法這裡就不展開講了。主要探討一下如何提高 webpack 的打包速度。 這篇文章以 vue cli3.0+,webpack4.0+,nodejs10.0+ 這幾個版

【electron-playground系列】打包優化

> 作者:[樑棒棒](https://juejin.im/user/1662117310636238) ## 簡介 electron打包工具有兩個:[electron-builder](https://www.electron.build/),[electron-packager](https:/

vue+webpack專案打包優化,從60s到17s的優化

有的 Vue 專案比較大.或者說專案中引入了許多第三方庫,那麼在執行 npm run build 構建專案的時候會極其的慢.比如我現在的專案就每次打包就要大概60s的樣子。可能大家也會遇到如下同樣的問題

webpack打包效能優化

效能優化的路沒有窮盡,只有更快。開啟頁面越快越好,點選響應越快越好。在當今這個以快為主的時代,快才是王道。閒話扯完,說正事!!! 該優化方案以最近做的一個hybrid webapp為例項演示。 路由懶載入 (1)vue-router檔案中的router使用懶載入方式。如下圖所示 (2

webpack踩坑路 (2)——圖片的路徑與打包

img url rom file filename png 一起 類型 emp webpack踩坑之路 (2)——圖片的路徑與打包 剛開始用webpack的同學很容易掉進圖片打包這個坑裏,比如打包出來的圖片地址不對或者有的圖片並不能打包進我們的目標文件夾裏(bund

webpack打包速度優化

logs compress nts spl 壓縮 clas true 線程 uglifyjs 打包速度優化 Webpack 默認提供的 UglifyJS 插件,由於采用單線程壓縮,速度頗慢 ;推薦采用 webpack-parallel-uglify-plugin 插件,其做

webpack優化code splitting

common try bpa 有一個 出了 循環引用 head 請求 too 作為當前風頭正盛的打包工具,webpack風靡前端界。確實作為引領了一個時代的打包工具,很多方面都帶來了顛覆性的改進,讓我們更加的感受到自動化的快感。不過最為大家詬病的一點就是用起來太難了。 要想

如何做到在webpack打包vue項目後,在外部動態修改配置文件

打包 測試 contex 我們 pro nbsp assets bpa gen 在我們做完vue項目後,只需要執行 npm run dist 就可以輕松進行打包轉測試,可是如果我們臨時需要修改一些配置文件比如域名,這時候我們就有點懵逼了,那就修改了再重新打一次包? NO N

vue打包體積優化

文檔 .org out jquer ntp comm 代碼 pre image webpack 與 vue 在使用vue開發時,遇到打包後單個文件太大,因而需要分包,不然加載時間太久。雖然盡可能減少請求次數,但是單個包太大也不是好事 思路 組件按需加載 vue-rou

前端架構師必備Vue專案打包優化

前幾天聽老師講過前端架構師必備之Vue專案打包優化的課之後,有感而發利用空閒時間寫了一下。 大佬路過請留步知道一下, 使用vue-cli部署生產包時,發現資源包很大,打包後的vendor.js達到了1.4M,這已經很大了,而且會影響到首屏載入。那麼,怎麼優化呢? 1.元件按需載入

vue打包優化

最近寫專案,4個平臺的專案由一個程式碼庫管理,超過50個.vue檔案,導致程式碼量過大,每次構建打包速度都很慢, 下面是針對vue打包構建優化的一些測試結果: 第一次npm run dev : 第一次npm run dev   第一次npm