本文同步更新於個人我的博客點擊前往。若是對您有幫助,請爲我點個小星星。首先說下我目前已經作的優化點,本文是在此基礎上作的進一步優化:css
/** * 返回異步組件 * @tips 請注意頁面只能掛載在views文件下,非此路徑請勿使用 */
const AsyncComponentHook = (path: String): Function => (): any => {
// 經過 webpack 的內聯註釋,設置模塊名
let component = import(/* webpackChunkName: "view-[request]" */ `@/views/${path}.vue`);
component.catch((e) => {
console.error(e);
});
return component;
};
複製代碼
// 安裝
npm install uglifyjs-webpack-plugin
// 在vue.config.js文件中添加配置
configureWebpack: config => {
if (process.env.NODE_ENV === 'production') {
// 爲生產環境修改配置...
config.plugins.push(
//生產環境自動刪除console
new UglifyJsPlugin({
uglifyOptions: {
compress: {
warnings: false,
drop_debugger: true,
drop_console: true,
},
},
sourceMap: false,
parallel: true,
})
);
}
},
複製代碼
配置引用別名html
設置插件的按需引入,本文使用的是element-ui
,點擊查看詳情vue
...webpack
通過一些基礎的配置後,咱們來看下目前打包後的效果。ios
從下圖能夠看到,打包出來後最大的包有1.33M
。而後再看下請求,哇,217
個請求、首頁下載須要3.2M
。git
...github
好吧,開始折騰web
咱們在搭建項目的過程當中常常性的會將一些scss配置文件抽離出來,例如主題色等,而後在每一個須要的組件中引入。這樣會顯得很繁瑣,咱們能夠藉助sass-loader幫咱們進行預處理, 這樣咱們就不用在每個頁面都進行引入樣式,就能直接引用。vue-router
例如咱們的樣式文件目錄下有一個theme.scss,咱們能夠在
vue.config.js
中做以下處理vuex
// vue.config.js 配置
module.exports = {
css: {
// css預設器配置項
loaderOptions: {
// pass options to sass-loader
sass: {
// 引入全局變量樣式,@使咱們設置的別名,執行src目錄
data: ` @import "@/stylePath/theme.scss"; `
}
},
},
}
複製代碼
經過以上配置,就能夠在組件模板中註釋如下代碼
<style lang="scss">
/* @import "@/stylePath/theme.scss"; */
</style>
複製代碼
咱們發現請求數增可能是由於咱們頁面預先渲染了其它組件,會在html頁面中插入像這樣的東西<link rel="prefetch">
,這該怎麼優化呢?
首先咱們先看下
vue.config.js
的官方文檔,點擊前往。 官方說明: 是一種 resource hint,用來告訴瀏覽器在頁面加載完成後,利用空閒時間提早獲取用戶將來可能會訪問的內容。
因此咱們添加以下配置
// vue.config.js
module.exports = {
chainWebpack: config => {
// 移除 prefetch 插件
config.plugins.delete('prefetch')
// 移除 preload 插件
config.plugins.delete('preload');
}
}
複製代碼
對於vue
, vuex
, vue-router
,axios
等咱們能夠利用wenpack
的externals
參數來配置,這裏咱們設定只須要在生產環境中才須要使用:
// vue.config.js
const isProduction = process.env.NODE_ENV === 'production';
const cdn = {
css: [],
js: [
'https://cdn.bootcss.com/vue/2.5.17/vue.runtime.min.js',
'https://cdn.bootcss.com/vue-router/3.0.1/vue-router.min.js',
'https://cdn.bootcss.com/vuex/3.0.1/vuex.min.js',
'https://cdn.bootcss.com/axios/0.18.0/axios.min.js',
]
}
module.exports = {
chainWebpack: config => {
// 生產環境配置
if (isProduction) {
// 生產環境注入cdn
config.plugin('html')
.tap(args => {
args[0].cdn = cdn;
return args;
});
}
},
configureWebpack: config => {
if (isProduction) {
// 用cdn方式引入
config.externals = {
'vue': 'Vue',
'vuex': 'Vuex',
'vue-router': 'VueRouter',
'axios': 'axios'
}
}
},
}
複製代碼
接着修改html
文件,添加註入代碼
<!DOCTYPE html>
<html lang="zh">
<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">
<!-- 使用CDN的CSS文件 -->
<% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.css) { %>
<link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" rel="preload" as="style">
<link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" rel="stylesheet">
<% } %>
<!-- 使用CDN的JS文件 -->
<% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.js) { %>
<link href="<%= htmlWebpackPlugin.options.cdn.js[i] %>" rel="preload" as="script">
<% } %>
</head>
<body>
<noscript>
<strong>We're sorry but eye-admin doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
<% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.js) { %>
<script src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"></script>
<% } %>
</body>
</html>
複製代碼
而後打包重啓,咱們再來看下目前的變化。
嗯,真香~從下圖能夠看到,打包出來後最大的包文件只有775kb
。而後再看下請求,哇,43
個請求、首頁下載只須要1.4M
。
能夠看出,咱們這一系列的操做後請求數減小了174
個,首頁渲染減小了1.8m
,真是可喜可賀
最後,附上完整的vue-config.js
文件
const path = require("path");
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
const isProduction = process.env.NODE_ENV === 'production';
const cdn = {
css: [],
js: [
'https://cdn.bootcss.com/vue/2.5.17/vue.runtime.min.js',
'https://cdn.bootcss.com/vue-router/3.0.1/vue-router.min.js',
'https://cdn.bootcss.com/vuex/3.0.1/vuex.min.js',
'https://cdn.bootcss.com/axios/0.18.0/axios.min.js',
]
}
function resolve(dir) {
return path.join(__dirname, dir)
}
module.exports = {
// 基本路徑
baseUrl: './',
// 輸出文件目錄
outputDir: 'dist',
// 放置生成的靜態資源 (js、css、img、fonts) 的 (相對於 outputDir 的) 目錄。
// assetsDir: "./",
// 指定生成的 index.html 的輸出路徑 (相對於 outputDir)。也能夠是一個絕對路徑
indexPath: './',
// eslint-loader 是否在保存的時候檢查
lintOnSave: true,
// webpack配置
// see https://github.com/vuejs/vue-cli/blob/dev/docs/webpack.md
chainWebpack: config => {
config
.entry('index')
.add('babel-polyfill')
.end();
// 配置別名
config.resolve.alias
.set("@", resolve("src"))
.set("@img", resolve("src/assets/images"))
.set("@css", resolve("src/assets/styles/css"))
.set("@scss", resolve("src/assets/styles/scss"));
// 生產環境配置
if (isProduction) {
// 刪除預加載
config.plugins.delete('preload');
config.plugins.delete('prefetch');
// 壓縮代碼
config.optimization.minimize(true);
// 分割代碼
config.optimization.splitChunks({
chunks: 'all'
})
// 生產環境注入cdn
config.plugin('html')
.tap(args => {
args[0].cdn = cdn;
return args;
});
}
},
configureWebpack: config => {
if (isProduction) {
// 用cdn方式引入
config.externals = {
'vue': 'Vue',
'vuex': 'Vuex',
'vue-router': 'VueRouter',
'axios': 'axios'
}
// 爲生產環境修改配置...
config.plugins.push(
//生產環境自動刪除console
new UglifyJsPlugin({
uglifyOptions: {
compress: {
warnings: false,
drop_debugger: true,
drop_console: true,
},
},
sourceMap: false,
parallel: true,
})
);
} else {
// 爲開發環境修改配置...
}
},
// 生產環境是否生成 sourceMap 文件
productionSourceMap: false,
// css相關配置
css: {
// 是否使用css分離插件 ExtractTextPlugin
extract: true,
// 開啓 CSS source maps?
sourceMap: false,
// css預設器配置項
loaderOptions: {
// pass options to sass-loader
sass: {
// 引入全局變量樣式
data: ` @import "@/stylePath/theme.scss; `
}
},
// 啓用 CSS modules for all css / pre-processor files.
modules: false,
},
// use thread-loader for babel & TS in production build
// enabled by default if the machine has more than 1 cores
parallel: require('os').cpus().length > 1,
devServer: {
port: 8888, // 端口
open: true, // 自動開啓瀏覽器
compress: false, // 開啓壓縮
overlay: {
warnings: true,
errors: true
}
},
}
複製代碼
以上就是我針對打包後作的優化處理,固然還有其它優化點,好比開啓gzip
壓縮,不過這個須要後臺服務器支持,因此暫不配置。若是你還有其它優化點,歡迎一塊兒討論!
本文做者: Echi
本文連接: juejin.im/user/585e36…
版權聲明: 本文章除特別聲明外,均採用 @BY-NC-SA 許可協議。轉載請註明出處!