作為一個做 SPA 起家的框架,Vue 的開發學習曲線較為平緩,相對來說,開發體驗屬於上乘。但不少初學者會發現,自己的站點,隨隨便便打包檔案就有 10M !難以置信,其實這跟 Vue 的效能沒有太大關係,我們可以通過配置檔案來大大改善這一情況。
減少打包後檔案體積的方法:
- 採用懶載入
- 啟用 Gzip 壓縮
- 將依賴庫掛到 CDN 上
- 減少不必要的庫依賴
準備知識:
懶載入
官網上對懶載入的解釋是這樣的:
當打包構建應用時,Javascript 包會變得非常大,影響頁面載入。如果我們能把不同路由對應的元件分割成不同的程式碼塊,然後當路由被訪問的時候才載入對應元件,這樣就更加高效了。
結合 Vue 的非同步元件和 Webpack 的程式碼分割功能,輕鬆實現路由元件的懶載入。
它的作用是實現延遲載入,避免一次性載入過大的檔案,增加首頁渲染時間,影響使用者體驗。
如何實現?
要實現懶載入很簡單,我們只需要改變元件的匯入方式:
before:
import Article from `@/components/Article`
複製程式碼
after:
const Article = () => import(`@/components/Article`)
複製程式碼
原理是什麼?
本質上,它是利用了 Promise,具體請見:非同步元件
啟用 Gzip 壓縮
vue 預設不啟用 Gzip 壓縮,但我們知道,壓縮後的檔案體積會大大減少,這適用於線上部署。
如何啟用也很簡單:
首先,在 config
中將 build.productionGzip
設定為 true
然後,確認 webpack.prod.conf.js
中有如下程式碼:
if (config.build.productionGzip) {
const CompressionWebpackPlugin = require(`compression-webpack-plugin`)
webpackConfig.plugins.push(
new CompressionWebpackPlugin({
asset: `[path].gz[query]`,
algorithm: `gzip`,
test: new RegExp(
`\.(` +
config.build.productionGzipExtensions.join(`|`) +
`)$`
),
threshold: 10240,
minRatio: 0.8
})
)
}
複製程式碼
如果有的話,下面只要使用 npm install --save-dev compression-webpack-plugin
安裝 webpack 外掛,這樣,你在 build 專案時,webpack 會幫你壓縮檔案。
如果沒有的話,你只要把上面程式碼複製到 webpack 配置檔案的 plugins
下即可。
如何方面檢視build之後的檔案大小呢?我們可以使用另外一個 webpack 外掛:webpack-bundle-analyzer
,如何使用呢?預設 Vue 會匯入這個外掛,我們只需要呼叫即可:在 package.json
檔案中增加以下命令:"analyzer": "NODE_ENV=production npm_config_report=true npm run build"
,執行 npm run analyzer
,等待一會,就可以看到整個專案的打包情況了。
將依賴庫掛到 CDN 上
如果你對首屏響應速度要求比較高,那麼,CDN 也不失為一種好方法。
它的原理是將一些依賴庫掛載到 CDN 上,通過在 html 檔案 script
便籤引入的方式進行載入,減少的打包檔案,從而縮小了體積。
以 element 為例:
首先,在 html 中引入庫:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>demo-vue-project</title>
<link rel="stylesheet" href="https://cdn.bootcss.com/element-ui/2.0.8/theme-chalk/index.css">
</head>
<body>
<div id="app"></div>
<!-- built files will be auto injected -->
<script src="https://cdn.bootcss.com/element-ui/2.0.7/index.js"></script>
</body>
</html>
複製程式碼
然後在 webpack.base.conf.js
中移除對這三個庫的依賴:
externals: {
`vue`: `Vue`,
`vue-router`: `VueRouter`,
`element-ui`: `ELEMENT`
},
複製程式碼
這樣我們就可以愉快地享受 CDN 了。
減少不必要的庫依賴
這一點就是見仁見智了。如果你使用了上面提到的 webpack-bundle-analyzer
,你會發現佔用你的包的大部分是你引用的一些庫,諸如:Element-ui、lodash、highlight 等等。不知道你們看到是什麼心情,反正我都想刪掉它們,自己寫需要的功能了,畢竟我只需要它們其中的一小部分功能,卻犧牲了大量的頻寬!
寫在最後
webpack 是一個強大的打包工具,這篇文章寫於 V3.4 的時候,現在 V4 已經出來了,配置檔案更加地簡單,值得一看!本文寫得粗糙,如果不對之處,歡迎批評指正!
本文參考連結: