一般項目比較大的時候,這個時候如果不優化項目,h5項目就會加載很慢。這裏提供一些優化技巧,其實一般項目都可以這樣做,引入cdn,壓縮代碼,圖片懶加載,splitChunk分割代碼,去掉console.log下面代碼示例。
1.使用cdn
vue.config.js
const isProduction = process.env.NODE_ENV !== 'development' // 開發和測試環境一樣的配置
let devNeedCdn = false // 本地是否需要注入cdn
// 聲明cdn的配置
const cdn = {
css: ['https://cdn.jsdelivr.net/npm/[email protected]/lib/index.css'],
js: [
'https://cdn.jsdelivr.net/npm/vue/dist/vue.min.js',
'https://cdn.jsdelivr.net/npm/[email protected]/lib/vant.min.js',
'https://cdn.bootcss.com/vue-router/3.1.3/vue-router.min.js',
'https://cdn.bootcss.com/axios/0.19.0/axios.min.js',
'https://cdn.bootcss.com/vuex/3.1.1/vuex.min.js',
// 'https://cdn.bootcss.com/echarts/4.3.0/echarts-en.common.min.js'
],
// cdn:模塊名稱和模塊作用域命名(對應window裏面掛載的變量名稱)
externals: {
vue: 'Vue',
'vue-router': 'VueRouter',
axios: 'axios',
lodash: '_',
// echarts: 'echarts',
vant: 'vant',
},
}
module.exports = {
configureWebpack: config => {
if (isProduction || this.devServer) {
// 使用externals設置排除項
config.externals = cdn.externals
}
},
chainWebpack(config) {
// 生產環境和測試環境注入cdn
config.plugin('html').tap(args => {
if (isProduction || devNeedCdn) args[0].cdn = cdn
return args
})
}
}
上面的vue.config.js配置好了之後就需要在public/index.html裏配置自動引入cdn文件
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta
name="viewport"
content="width=device-width,initial-scale=1.0,user-scalable=0,viewport-fit=cover"
/>
<link rel="icon" href="<%= BASE_URL %>favicon.ico" />
<title></title>
<!-- 使用CDN的CSS文件 -->
<% for (var i in htmlWebpackPlugin.options.cdn &&
htmlWebpackPlugin.options.cdn.css) { %>
<link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" rel="stylesheet" />
<% } %>
<!-- 使用CDN的CSS文件 -->
</head>
<body>
<noscript>
<strong
>We're sorry but mixedh5 doesn't work properly without JavaScript
enabled. Please enable it to continue.</strong
>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
<!-- 使用CDN的JS文件 -->
<% for (var i in htmlWebpackPlugin.options.cdn &&
htmlWebpackPlugin.options.cdn.js) { %>
<script src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"></script>
<% } %>
<!-- 使用CDN的JS文件 -->
</body>
</html>
2.添加文件壓縮
1)先安裝compression-webpack-plugin插件
yarn add compression-webpack-plugin -D
2)在vue.config.js中配置下面以下代碼
vue.config.js
// 引入webpack compression插件
const CompressionPlugin = require('compression-webpack-plugin')
module.exports = {
...
chainWebpack(config) {
/* 非開發環境 */
config.when(process.env.NODE_ENV !== 'development', config => {
.....
// 文件壓縮
config.plugin('compressionPlugin').use(
new CompressionPlugin({
test: /\.js$|\.html$|.\css/, // 匹配文件名
threshold: 10240, // 對超過10k的數據壓縮
deleteOriginalAssets: false, // 不刪除源文件
})
)
})
}
}
最後使用yarn build試驗一下文件壓縮了不小
3.代碼分割
vue-cli4.0可以直接在chainWebpack配置優化項optimization,splitChunk最大的作用就是將資源分拆成一小塊小塊,避免vendor.js文件過大,網絡請求加載靜態資源的時候就很慢。
vue.confg.js中
module.exports = {
chainWebpack(config) {
config.when(process.env.NODE_ENV !== 'development', config => {
config.optimization.splitChunks({
chunks: 'all',
cacheGroups: {
vendor: {
name(module) {
const packageName = module.context.match(
/[\\/]node_modules[\\/](.*?)([\\/]|$)/
)[1]
return `npm.${packageName.replace('@', '')}`
},
test: /[\\/]node_modules[\\/]/,
minChunks: 1,
maxInitialRequests: 5,
minSize: 0,
priority: 100,
chunks: 'initial', // only package third parties that are initially dependent
},
styles: {
name: 'styles',
test: /\.(sa|sc|c)ss$/,
chunks: 'all',
enforce: true,
},
vantUI: {
name: 'chunk-vantUI', // split vantUI into a single package
priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
test: /[\\/]node_modules[\\/]_?vant(.*)/, // in order to adapt to cnpm
},
commons: {
name: 'chunk-commons',
test: resolve('src/components'), // can customize your rules
minChunks: 3, // minimum common number
priority: 5,
reuseExistingChunk: true,
},
},
})
config.optimization.runtimeChunk('single')
config.optimization.minimize(true)
})
}
}
查看自己生產靜態資源文件每一塊的大小,可以vue-cli-service build --report
生成一個report.html的報告文件,注意它是在dist目錄下生成report.html文件,別找錯地方。
可以比對下配置之前和之後報告結果。就會看到明顯的區別。
4.使用terser去掉生產環境中的console.log
vue.config.js
module.exports = {
chainWebapck(config) {
/* 生產環境 */
config.when(process.env.NODE_ENV === 'production', config => {
// 刪除生產環境的console.log註釋
config.optimization.minimizer('terser').tap(args => {
args[0].terserOptions.compress.drop_console = true
return args
})
})
}
}
5.圖片懶加載
1)首先安裝vue-lazyload
yarn add vue-lazyload -D
2)在main.js中引入
main.js
import VueLazyload from 'vue-lazyload'
// 懶加載需要使用到的靜態文件
import LoadingImg from '@/assets/img/lazyload_img.jpg'
// 圖片懶加載
Vue.use(VueLazyload, {
loading: LoadingImg,
attempt: 1,
})
3)在vue文件中使用
<div class="img-box">
<img v-lazy="https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1586966508&di=415347371bcb7e05c74ebe10a4c7f352&src=http://bbs.jooyoo.net/attachment/Mon_0905/24_65548_2835f8eaa933ff6.jpg" alt="" />
</div>
基本優化這幾項,項目的加載速度就會提升很快