1. 程式人生 > >vue-webpack 打包過大的問題

vue-webpack 打包過大的問題

使用 vue 的 webpack 模版開發專案時,我們習慣使用 npm install 安裝各種元件和依賴到本地,但引入的元件越來越多,打包時可能會導致 vendor.js 過大的問題,導致載入很慢。

首先我們瞭解一下vue在run build之後,dist裡面的檔案有哪些:

首先要理解為什麼會有以下三個檔案:

webpack應該是會在最後一個CommonsChunkPlugin產出的chunk注入webpackJsonp的定義,以及非同步載入相關的定義,而就是這個會涉及到所有entry及chunk的md5,所以會"經常變動",同時vue-cli預設的vendor是打包node_module下的所有依賴,會很大,在生產環境,過大的檔案要儘量利用快取來加快載入速度,但“經常變動”不利於快取,所以為了將entry(這裡可認為是app.js)的變動隔離在vendor之外,vue-cli在vendor之後

多做了一個manifest的chunk,這樣entry只要不引入新的node_modules裡的包就不會影響到vendor了.ps:所以其實跟編譯次數沒什麼關係,所有檔案每次打包都會再編譯一次的,重點是大檔案,快取,變動程式碼的拆分

app.js:基本就是你實際編寫的那個app.vue(.vue或.js?),沒這個頁面跑不起來

vendor.js::vue-cli全家桶預設配置裡面這個chunk就是將所有從node_modules/裡require(import)的依賴都打包到這裡,所以這個就是所有node_modules/下的被require(import)的js檔案

manifest.js: 最後一個chunk,被注入了webpackJsonp的定義及非同步載入相關的定義(webpack呼叫CommonsChunkPlugin處理後模組管理的核心,因為是核心,所以要第一個進行載入,不然會報錯).

從實際的專案開發中,也是發現vendor.js是最大的,在頻寬一定的情況下,非常影響載入速度,所以我們要利用引入 cdn 資源的方式,來減小vendor.js的大小:

1.webpack 配置項 externals(在 build/webpack.base.conf.js 中配置)

在module.exports = {}中新增如下資訊alias 是專案內使用時的元件名稱,ObjName 是某外部元件對外暴露的名稱。:

externals: {
    'vue': 'Vue',
    'vue-router': 'VueRouter',
    'alias': 'ObjName'
}

alias 是專案內使用時的元件名稱,ObjName 是某外部元件對外暴露的名稱。

例如:

vue 的 window 全域性名稱是 Vue

vue-router的 window 全域性名稱是 VueRouter

axios的 window 全域性名稱是 axios

2. 在專案 js 中引入:

# webpack 會檢測這些元件是否在 externals 中註冊
# 如果註冊則不會將其打包到 app.js 中
import Vue from 'vue'
import VueRouter from 'vue-router'
import $ from 'jquery'

 這樣配置的話 webpack 在 dev 執行或 build 打包時,就不會去本地元件包中查詢這些在 externals 中註冊的元件了(自然也不會將他們打包到一個 app.js 中去),而是會去 window 域下直接呼叫 Vue, VueRouter, $ 等物件。

3. index.html 模版配置如下

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title></title>

</head>

<body>

<div id="app">

</div>

<!-- built files will be auto injected -->

<script src="https://cdn.bootcss.com/vue/2.5.16/vue.min.js"></script>

<script src="https://cdn.bootcss.com/vue-router/3.0.1/vue-router.min.js"></script>

</body>

</html>