您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“vue-cli 3配置打包優化的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“vue-cli 3配置打包優化的示例分析”這篇文章吧。
配置路由懶加載,封裝了異步組件引入的方法,接收一個地址做參數
/** * 返回異步組件 * @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, }) ); } },
配置引用別名
設置插件的按需引入,本文使用的是element-ui,點擊查看詳情
經過一些基礎的配置后,我們來看下目前打包后的效果。
從下圖可以看到,打包出來后最大的包有1.33M。然后再看下請求,哇,217個請求、首頁下載需要3.2M。
好吧,開始折騰
1. 優化scss配置文件的引入
我們在搭建項目的過程中經常性的會將一些scss配置文件抽離出來,例如主題色等,然后在每個需要的組件中引入。這樣會顯得很繁瑣,我們可以借助sass-loader幫我們進行預處理,
這樣我們就不用在每一個頁面都進行引入樣式,就能直接引用。
例如我們的樣式文件目錄下有一個theme.scss,我們可以在vue.config.js中作如下處理
// 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>
2. 針對請求數進行優化
我們發現請求數增多是因為我們頁面預先渲染了其它組件,會在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'); } }
3. 公用代碼提取,使用cdn加載
對于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="external nofollow" rel="external nofollow" rel="preload" as="style"> <link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" rel="external nofollow" rel="external nofollow" rel="stylesheet"> <% } %> <!-- 使用CDN的JS文件 --> <% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.js) { %> <link href="<%= htmlWebpackPlugin.options.cdn.js[i] %>" rel="external nofollow" 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 } }, }
以上是“vue-cli 3配置打包優化的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。