在咱們的平常開發中,咱們常常須要引入各類各樣的第三方模塊來幫助咱們提高開發速度。可是有時候這些模塊裏面又包含了許多咱們用不到的模塊,在打包的時候又一併打包進去了,這就形成了不必的帶寬浪費。這裏以Vue項目爲例。html
這時咱們就要掏出咱們的Vue項目利器 —— Vue cli 3vue
在 CLI 服務中的 vue-cli-service build的文檔中能夠看到:node
--report 和 --report-json 會根據構建統計生成報告,它會幫助你分析包中包含的模塊們的大小。webpack
在一個 Vue CLI 項目中,@vue/cli-service 安裝了一個名爲 vue-cli-service 的命令。你能夠在 npm scripts 中以 vue-cli-service、或者從終端中以 ./node_modules/.bin/vue-cli-service 訪問這個命令。git
所以咱們在build
項目的時候就能夠這麼作:github
vue-cli-service build --report
複製代碼
./node_modules/.bin/vue-cli-service build --report
複製代碼
這兩種方式均可以幫咱們生成報告,運行其中一個命令(第一個命令不行的小夥伴能夠直接運行第二個命令)後咱們能夠看到dist
目錄下多出了一個report.html
文件:web
這樣,咱們只要直接在瀏覽器中打開report.html就能看到模塊分析了,以下圖:vue-router
Angular
項目的ng-cli
一樣有相似的功能,咱們只須要在編譯時加上--stats-json
選項便可。而後再經過webpack.github.io/analyse/對生成的json
文件進行分析,或者使用webpack-bundle-analyzer
插件。vue-cli
若是是其它用戶,則須要安裝webpack-bundle-analyzer
npm
# NPM
npm install --save-dev webpack-bundle-analyzer
# Yarn
yarn add -D webpack-bundle-analyzer
複製代碼
webpack 配置:
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
module.exports = {
plugins: [
new BundleAnalyzerPlugin()
]
}
複製代碼
編譯完成後一樣能夠生成分析報告。
在項目中,咱們可能不會用到全部的 echart 模塊,只會用到個別圖表或組件,這樣咱們就能夠只引入用到的,能有效減小資源的加載時間。
咱們先新建一個專門的 echart 配置文件來引入相關代碼:
// 路徑:@/lib/echarts.js
// 引入主模塊
const echarts = require('echarts/lib/echarts');
// 引入柱狀圖
require('echarts/lib/chart/bar');
// 引入相關組件
require("echarts/lib/component/dataZoom");
export default echarts
複製代碼
固然也可使用import
:
// 路徑:@/lib/echarts.js
// 引入主模塊
import echarts from 'echarts/lib/echarts'
// 引入柱狀圖
import 'echarts/lib/chart/bar'
// 引入相關組件
import 'echarts/lib/component/dataZoom'
export default echarts
複製代碼
具體有哪些選項,能夠直接查看node_modules
目錄下的echarts/index.js
import echarts from '@/lib/echarts'
複製代碼
若是這個圖表僅僅針對這個組件,或者說用戶使用到頻率很低,咱們可使用懶加載的方式進一步優化,等到用戶使用到這個組件的時候纔去加載echart
圖表:
methods: {
init() {
import("../../lib/echarts").then(Echarts => {
// ...
}
}
}
複製代碼
這時咱們再經過vue-cli
工具來從新build
項目,打開report.html
分析對比優化先後的echart
大小:
結果一目瞭然。
除了echart
可使用這種方式,別的第三方庫也能使用這些方法來加載。
咱們常常會這樣使用:
import crypto from 'crypto-js'
// ...
crypto.HmacSHA1()
// ...
複製代碼
上面這種方式會引入整個crypto-js
顯然除了HmacSHA1
方法以外,咱們不會使用到別的方法,那樣就很是得不償失了,所以咱們能夠像下面這樣作:
import HmacSHA1 from 'crypto-js/hmac-sha1'
// 若是要引入 Base64
import Base64 from 'crypto-js/enc-base64'
複製代碼
具體有哪些能夠單獨引入的,能夠直接查看node_modules
目錄下的crypto-js
目錄
如今,咱們再build
來看看優化後的對比:
簡直天差地別。
若是咱們爲了快速開發一些公司內部的後臺項目,或者是本身想作點東西來玩玩,可是不想寫一些重複的樣式,咱們就會採用一些UI庫。一些知名的UI庫都是十分完善的,幾乎包含全部平常所需的組件,所以它們的體積也是十分龐大的。若是咱們只用到部分組件,但引入了全部組件,這樣就不值得了。
以Element-ui
爲例,UI框架經過藉助babel-plugin-component來按需引入組件。這裏我就再也不如何進行按需引入了,官方文檔已經寫得十分詳細了,Element-ui官方文檔。
上面echarts
優化中就已經使用過懶加載了,相信各位熟悉Vue
的小夥伴都知道這種加載方式,咱們能夠在使用到該組件的時候再把組件下載下來。依個人經驗來講,通常不經常使用的、單獨的模塊可使用這種方式,經過import
引入。注意,這其實是由webpack
提供的方法,而非Vue
自身提供的方法。
Vue Router
路由懶加載:
import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router)
const AsyncComponent = () => import('components/async-component/async-component')
export default new Router({
routes: [
{
path: '/',
component: 'AsyncComponent'
},
]
})
複製代碼
異步組件:
components: {
AsyncComponent: () => import('./async-component')
}
複製代碼
經常使用的日期處理類庫Moment.js
竟然有540.76kb
,真是讓人難以置信。見下圖:
它如此巨大的緣由是由於有不少語言資源文件,用於轉化能成多國時間格式,見GitHub issue。大多數狀況下,咱們並不須要用到這麼多的格式,可是咱們不能像上面的echart
和crypto
那樣按需加載,所以咱們須要藉助IgnorePlugin。
在Vue根目錄下新建vue.config.js
文件,而後在裏面添加配置:
const webpack = require('webpack')
module.exports = {
configureWebpack: {
plugins: [
new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/)
]
}
}
複製代碼
這時咱們就能夠按需引入語言包:
const moment = require('moment');
require('moment/locale/zh-cn');
moment.locale('zh-cn');
複製代碼
這時咱們再來看看它的大小:
經過上面的例子,我想你們也能感覺到許多第三方庫由於要照顧到絕大部分狀況,所以會比較大,可是咱們能夠經過一些方式只獲取咱們須要的部分。上面的對比圖也顯而易見了,減肥的效果是很是明顯的,經過上面的方式,可以較大的提高用戶體驗,減小項目加載時間。