vue性能優(yōu)化之build后包體積太大

基于vue-cli3.0構(gòu)建項目宫仗,npm引入多個第三方包。build之后旁仿,包體積太大導(dǎo)致首屏過長藕夫。----毫無體驗感!?莞浴毅贮!

實踐的項目喜歡搗鼓可以clone下來

項目地址: vue-fiction

只總結(jié)了親測效果明顯的幾種方案,解決方案大多來自于日吵咀啵總結(jié)及各路大佬滩褥,如有不足,請大佬補充~

1炫加、路由懶加載

在 Webpack中瑰煎,我們可以使用動態(tài) import語法來定義代碼分塊點 (split point): import('./About.vue') // 返回 Promise 

如果您使用的是 Babel,你將需要添加 syntax-dynamic-import 插件俗孝,才能使 Babel 可以正確地解析語法酒甸。

結(jié)合這兩者,這就是如何定義一個能夠被 Webpack 自動代碼分割的異步組件赋铝。

const About = () => import('./About.vue')

在路由配置中什么都不需要改變插勤,只需要像往常一樣使用 About:

const router = new VueRouter({
  routes: [
    { path: '/about', name:'About', component: About }
  ]
})

2、nginx和webpack打包同時配置Gzip

gzip是GNU zip的縮寫革骨,顧名思義是一種壓縮技術(shù)农尖。它將瀏覽器請求的文件先在服務(wù)器端進行壓縮,然后傳遞給瀏覽器苛蒲,瀏覽器解壓之后再進行頁面的解析工作卤橄。在服務(wù)端開啟Gzip支持后,我們前端需要提供資源壓縮包臂外,通過Compression-Webpack-Plugin插件build提供壓縮

// 安裝插件
cnpm i --save-dev compression-webpack-plugin
// 在vue-config.js 中加入
const CompressionWebpackPlugin = require('compression-webpack-plugin');
const isProduction = process.env.NODE_ENV === 'production'; 
module.exports = {
 // 配置webpack
 configureWebpack: config => {
  if (isProduction) {
   // 開啟gzip壓縮
   config.plugins.push(new CompressionWebpackPlugin({
    algorithm: 'gzip',
    test: /\.js$|\.html$|\.json$|\.css/,
    threshold: 10240,
    minRatio: 0.8
   }))
  }
 }
}

nginx配置

//nginx.conf文件里
server {
    listen 80;
    server_name  localhost;
    gzip on; #開啟
    gzip_proxied any;
    gzip_types
        text/css
        text/javascript
        text/xml
        text/plain
        image/x-icon
        application/javascript
        application/x-javascript
        application/json; #接受那些類型文件
}

3窟扑、優(yōu)化打包chunk-vendor.js文件體積過大

當(dāng)我們運行項目并且打包的時候,會發(fā)現(xiàn)chunk-vendors.js這個文件非常大漏健,那是因為webpack將所有的依賴全都壓縮到了這個文件里面嚎货,這時我們可以將其拆分,將所有的依賴都打包成單獨的js蔫浆。

// 在vue-config.js 中加入
module.exports = {
 // 配置webpack
 configureWebpack: config => {
  if (isProduction) {
    // 開啟分離js
    config.optimization = {
      runtimeChunk: 'single',
      splitChunks: {
        chunks: 'all',
        maxInitialRequests: Infinity,
        minSize: 20000,
        cacheGroups: {
          vendor: {
            test: /[\\/]node_modules[\\/]/,
            name (module) {
              // get the name. E.g. node_modules/packageName/not/this/part.js
              // or node_modules/packageName
              const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1]
              // npm package names are URL-safe, but some servers don't like @ symbols
              return `npm.${packageName.replace('@', '')}`
            }
          }
        }
      }
    };
  }
 }
}
// 至此殖属,你會發(fā)現(xiàn)原先的vender文件沒有了,同時多了好幾個依賴的js文件 

4瓦盛、啟用CDN加速

  • 加快打包速度洗显。分離公共庫以后外潜,每次重新打包就不會再把這些打包進 vendors 文件中。
  • CDN減輕自己服務(wù)器的訪問壓力挠唆,并且能實現(xiàn)資源的并行下載处窥。瀏覽器對 src 資源的加載是并行的(執(zhí)行是按照順序的)。
// 修改vue.config.js 分離不常用代碼庫
module.exports = {
 configureWebpack: config => {
  if (isProduction) {
   config.externals = {
    'vue': 'Vue',
    'vue-router': 'VueRouter'
   }
  }
 }
}
// 在public文件夾的index.html 加載
<!-- CND -->
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.11/dist/vue.runtime.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue-router@3.1.6/dist/vue-router.min.js"></script>

5玄组、完整vue.config.js代碼

const path = require('path')
// 在vue-config.js 中加入
// 開啟gzip壓縮
const CompressionWebpackPlugin = require('compression-webpack-plugin');
// 判斷開發(fā)環(huán)境
const isProduction = process.env.NODE_ENV === 'production';

const resolve = dir => {
  return path.join(__dirname, dir)
}

// 項目部署基礎(chǔ)
// 默認(rèn)情況下滔驾,我們假設(shè)你的應(yīng)用將被部署在域的根目錄下,
// 例如:https://www.my-app.com/
// 默認(rèn):'/'
// 如果您的應(yīng)用程序部署在子路徑中,則需要在這指定子路徑
// 例如:https://www.foobar.com/my-app/
// 需要將它改為'/my-app/'
// iview-admin線上演示打包路徑: https://file.iviewui.com/admin-dist/
const BASE_URL = process.env.NODE_ENV === 'production'
  ? '/'
  : '/'

module.exports = {
  //webpack配置
  configureWebpack:config => {
    // 開啟gzip壓縮
    if (isProduction) {
      config.plugins.push(new CompressionWebpackPlugin({
        algorithm: 'gzip',
        test: /\.js$|\.html$|\.json$|\.css/,
        threshold: 10240,
        minRatio: 0.8
      }));
      // 開啟分離js
      config.optimization = {
        runtimeChunk: 'single',
        splitChunks: {
          chunks: 'all',
          maxInitialRequests: Infinity,
          minSize: 20000,
          cacheGroups: {
            vendor: {
              test: /[\\/]node_modules[\\/]/,
              name (module) {
                // get the name. E.g. node_modules/packageName/not/this/part.js
                // or node_modules/packageName
                const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1]
                // npm package names are URL-safe, but some servers don't like @ symbols
                return `npm.${packageName.replace('@', '')}`
              }
            }
          }
        }
      };
      // 取消webpack警告的性能提示
      config.performance = {
        hints:'warning',
            //入口起點的最大體積
            maxEntrypointSize: 50000000,
            //生成文件的最大體積
            maxAssetSize: 30000000,
            //只給出 js 文件的性能提示
            assetFilter: function(assetFilename) {
          return assetFilename.endsWith('.js');
        }
      }
    }
  },
  // Project deployment base
  // By default we assume your app will be deployed at the root of a domain,
  // e.g. https://www.my-app.com/
  // If your app is deployed at a sub-path, you will need to specify that
  // sub-path here. For example, if your app is deployed at
  // https://www.foobar.com/my-app/
  // then change this to '/my-app/'
  publicPath: BASE_URL,
  // tweak internal webpack configuration.
  // see https://github.com/vuejs/vue-cli/blob/dev/docs/webpack.md
  devServer: {
    host: 'localhost',
    port: 8080, // 端口號
    hotOnly: false,
    https: false, // https:{type:Boolean}
    open: true, //配置自動啟動瀏覽器
    proxy:null // 配置跨域處理,只有一個代理

  },
  // 如果你不需要使用eslint俄讹,把lintOnSave設(shè)為false即可
  lintOnSave: true,
  css:{
    loaderOptions:{
      less:{
        javascriptEnabled:true
      }
    },
    extract: true,// 是否使用css分離插件 ExtractTextPlugin
    sourceMap: false,// 開啟 CSS source maps
    modules: false// 啟用 CSS modules for all css / pre-processor files.
  },
  chainWebpack: config => {
    config.resolve.alias
      .set('@', resolve('src')) // key,value自行定義哆致,比如.set('@@', resolve('src/components'))
      .set('@c', resolve('src/components'))
  },
  // 打包時不生成.map文件
  productionSourceMap: false
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市患膛,隨后出現(xiàn)的幾起案子摊阀,更是在濱河造成了極大的恐慌,老刑警劉巖剩瓶,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驹溃,死亡現(xiàn)場離奇詭異,居然都是意外死亡延曙,警方通過查閱死者的電腦和手機豌鹤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來枝缔,“玉大人布疙,你說我怎么就攤上這事≡感叮” “怎么了灵临?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長趴荸。 經(jīng)常有香客問我儒溉,道長,這世上最難降的妖魔是什么发钝? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任顿涣,我火速辦了婚禮,結(jié)果婚禮上酝豪,老公的妹妹穿的比我還像新娘涛碑。我一直安慰自己,他們只是感情好孵淘,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布蒲障。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪揉阎。 梳的紋絲不亂的頭發(fā)上庄撮,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音余黎,去河邊找鬼重窟。 笑死,一個胖子當(dāng)著我的面吹牛惧财,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扭仁,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼垮衷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了乖坠?” 一聲冷哼從身側(cè)響起搀突,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎熊泵,沒想到半個月后仰迁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡顽分,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年徐许,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卒蘸。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡雌隅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缸沃,到底是詐尸還是另有隱情恰起,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布趾牧,位于F島的核電站检盼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏翘单。R本人自食惡果不足惜吨枉,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望县恕。 院中可真熱鬧东羹,春花似錦、人聲如沸忠烛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至冤议,卻和暖如春斟薇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背恕酸。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工堪滨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蕊温。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓袱箱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親义矛。 傳聞我的和親對象是個殘疾皇子发笔,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344