天天看點

一篇關于vue-cli3打包優化的文章

在開發過程中vue項目打包是需要做一些性能優化的,這裡寫了關于我知道的要做的優化的部分,廢話不多說直接上代碼了,僅供參考 歡迎提出意見

const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
const path = require('path')
// 開啟Gzip需要的依賴 yarn add compression-webpack-plugin -D
const CompressionWebpackPlugin = require('compression-webpack-plugin')
function resolve(dir) {
    return path.join(__dirname, dir)
}
// 标記是否是生産環境
const isPruction = process.env.NODE_ENV === "production" 
const devNeedCdn = false // 标記本地是否需要cdn引入
// cdn配置
// CDN的本質上是将媒體資源,動靜态圖檔(Flash),HTML,CSS,JS等等内容緩存到距離你更近的IDC,
// 進而讓使用者進行共享資源,實作縮減站點間的響應時間等等需求,而網遊加速器的本質則是通過建立高帶寬機房,
// 架設多節點伺服器來為使用者進行加速。我們可以将一些大體積的子產品,讓cdn幫我們提供相應的資源,
// 這樣就可以緩解我們自己的伺服器的壓力,同時提供更快更好的資源響應

const cdn = {
    // 子產品名稱和作用域名(對應的是window裡面的全局變量名)
    external: {
        vuex: 'Vuex',
        'vue-router': 'VueRouter'
    },
    //cdn的css連結
    css: [],
    //cdn的js連接配接 這裡的資源位址請根據自己的連接配接
    js: [
        'https://cdn.staticfile.org/vuex/3.0.2/vuex.min.js', 
        'https://cdn.staticfile.org/vue-router/3.0.2/vue-router.min.js'
    ]
}
module.exports = {
    // devServer : {
    //     proxy: 'localhost:8080'
    // },
    productionSourceMap: false, // 上線後不生成map檔案
    chainWebpack: (config) => {
        // 配置路徑别名
        config.resolve.alias
        .set('@', resolve('src'))
        .set('components', resolve('src/components'))
        .set('assets', resolve('src/assets'))
        .set('api', resolve('src/api'))
        .set('views', resolve('src/views'))
        // 上線壓縮圖檔 首先要安裝 image-webpack-loader 指令 yarn add image-webpack-loader -D
        config.module.rule('images')
        .use('image-webpack-loader')
        .loader('image-webpack-loader')
        .options({bypassOnDebug:true})
        .end()

        // 注入cdn 
        config.plugin('html').tap(args => {
            // console.log(args)
            //  生産環境或本地需要cdn時,才注入cdn
            if(isPruction || devNeedCdn) {
                if (isPruction || devNeedCdn) {
                    args[0].cdn = cdn
                } 
            }
            return args
        })
    },

    configureWebpack: config => {
        // 用cdn方式引入,則建構時要忽略相關資源
        if (isPruction || devNeedCdn) {
            config.externals = cdn.externals
        } 
        if(isPruction) { // 判斷是否是生産環境
            config.mode = "production";
            // 上線關閉console和debugger
            // 代碼壓縮
            config.optimization.minimizer = [
                new UglifyJsPlugin({
                    uglifyOptions: {
                        compress: {
                            warnings: false, // 如果打包産生錯誤 可注釋掉這裡
                            drop_console: true,
                            drop_debugger: true,
                            pure_funcs: ['console.log']
                        }
                    }
                })
            ]
            // 打封包件大小配置
            config["performance"] = {
                "maxEntrypointSize": 10000000, // 此選項根據入口起點的最大體積,控制 webpack 何時生成性能提示 機關是(bytes)
                "maxAssetSize": 3000000 // 此選項根據單個資源體積,控制 webpack 何時生成性能提示 機關是(bytes)
            }

            // gzip壓縮
            const productionGzipExtensions = ['html', 'js', 'css']
            config.plugins.push({
                filename:'[path].gz[query]',
                algorithm: 'gzip',
                test: new RegExp( // 進行壓縮的檔案類型
                    '\\.(' + productionGzipExtensions.join('|') + ')$'
                ),
                threshold: 10240, // 定義隻有大小大于該值的資源會被處理
                minRatio: 0.7, // 隻有壓縮率小于這個值的資源被處理
                deleteOriginalAssets: false // 删除原檔案
            })

            // 公共代碼抽離
            config.optimization.splitChunks = {
                cacheGroups: {
                    vendor: {
                        chunks: 'all',
                        test: /node_modules/,
                        name: 'vendor',
                        minChunks: 1,
                        maxInitialRequests: 5,
                        minSize: 0,
                        priority: 100
                    },
                    common: {
                        chunks: 'all',
                        test: /[\\/]src[\\/]js[\\/]/,
                        name: 'common',
                        minChunks: 2,
                        maxInitialRequests: 5,
                        minSize: 0,
                        priority: 60
                    },
                    styles: {
                        name: 'styles',
                        test: /\.(sa|sc|c)ss$/,
                        chunks: 'all',
                        enforce: true
                    },
                    runtimeChunk: {
                        name: 'manifest'
                    }
                }
            }
        } else {
            config.mode = 'development'
        }
    }
}
           

cdn配置如果添加了那麼html檔案也要做相應的修改,這裡是修改後的html檔案

<!DOCTYPE html>
<html lang="">
  <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">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <!-- 使用CDN的CSS檔案 -->
    <% for (var i in htmlWebpackPlugin.options.cdn &&
    htmlWebpackPlugin.options.cdn.css) { %>
    <link
        href="<%= htmlWebpackPlugin.options.cdn.css[i] %>"
        rel="stylesheet"
    />
    <% } %>
    <title><%= htmlWebpackPlugin.options.title %></title>
  </head>
  <body>
    <noscript>
      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> 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>
     <% } %>
  </body>
</html>

           

————————————————

版權聲明:本文為CSDN部落客「

木頭人

」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。

原文連結:https://blog.csdn.net/wjw0125/article/details/115010520