Vue 打包 chunk-vendors.js 文件過大導(dǎo)致頁面加載緩慢解決方案

1颜说、路由懶加載
在 Webpack  中,我們可以使用動(dòng)態(tài) import語法來定義代碼分塊點(diǎn) (split point): import('./Foo.vue') // 返回 Promise

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

結(jié)合這兩者击费,這就是如何定義一個(gè)能夠被 Webpack 自動(dòng)代碼分割的異步組件拢蛋。

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

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

const router = new VueRouter({
  routes: [
    { path: '/foo', component: Foo }
  ]
})
 
2蔫巩、服務(wù)器和webpack打包同時(shí)配置Gzip
Gzip是GNU zip的縮寫谆棱,顧名思義是一種壓縮技術(shù)。它將瀏覽器請(qǐng)求的文件先在服務(wù)器端進(jìn)行壓縮圆仔,然后傳遞給瀏覽器垃瞧,瀏覽器解壓之后再進(jìn)行頁面的解析工作。在服務(wù)端開啟Gzip支持后坪郭,我們前端需要提供資源壓縮包个从,通過Compression-Webpack-Plugin插件build提供壓縮  

// 安裝插件

cnpm i --save-dev compression-webpack-plugin
 
// 在vue-config.js 中加入
const CompressionWebpackPlugin = require('compression-webpack-plugin');
const productionGzipExtensions = ['js', 'css'];
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
   }))
  }
 }
}
3、優(yōu)化打包c(diǎn)hunk-vendor.js文件體積過大
 當(dāng)我們運(yùn)行項(xiàng)目并且打包的時(shí)候歪沃,會(huì)發(fā)現(xiàn)chunk-vendors.js這個(gè)文件非常大信姓,那是因?yàn)閣ebpack將所有的依賴全都?jí)嚎s到了這個(gè)文件里面,這時(shí)我們可以將其拆分绸罗,將所有的依賴都打包成單獨(dú)的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('@', '')}`
            }
          }
        }
      }
    };
  }
 }
}
// 至此,你會(huì)發(fā)現(xiàn)原先的vender文件沒有了珊蟀,同時(shí)多了好幾個(gè)依賴的js文件  
4菊值、啟用CDN加速
用Gzip已把文件的大小減少了三分之二了外驱,但這個(gè)還是得不到滿足。那我們就把那些不太可能改動(dòng)的代碼或者庫分離出來腻窒,繼續(xù)減小單個(gè)chunk-vendors昵宇,然后通過CDN加載進(jìn)行加速加載資源。
// 修改vue.config.js 分離不常用代碼庫
// 如果不配置webpack也可直接在index.html引入
module.exports = {
 configureWebpack: config => {
  if (isProduction) {
   config.externals = {
    'vue': 'Vue',
    'vue-router': 'VueRouter',
    'moment': 'moment'
   }
  }
 }
}
// 在public文件夾的index.html 加載
<!-- CND -->
<script src="https://cdn.bootcss.com/vue/2.5.17-beta.0/vue.runtime.min.js"></script>
<script src="https://cdn.bootcss.com/vue-router/3.0.1/vue-router.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.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)
}

// 項(xiàng)目部署基礎(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',
            //入口起點(diǎn)的最大體積
            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, // 端口號(hào)
    hotOnly: false,
    https: false, // https:{type:Boolean}
    open: true, //配置自動(dòng)啟動(dòng)瀏覽器
    proxy:null // 配置跨域處理,只有一個(gè)代理

  },
  // 如果你不需要使用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'))
  },
  // 打包時(shí)不生成.map文件
  productionSourceMap: false
  // 這里寫你調(diào)用接口的基礎(chǔ)路徑,來解決跨域愉适,如果設(shè)置了代理犯助,那你本地開發(fā)環(huán)境的axios的baseUrl要寫為 '' ,即空字符串
  // devServer: {
  //   proxy: 'localhost:3000'
  // }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末维咸,一起剝皮案震驚了整個(gè)濱河市剂买,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌癌蓖,老刑警劉巖瞬哼,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異租副,居然都是意外死亡坐慰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門附井,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人两残,你說我怎么就攤上這事永毅。” “怎么了人弓?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵沼死,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我崔赌,道長(zhǎng)意蛀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任健芭,我火速辦了婚禮县钥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘慈迈。我一直安慰自己若贮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著谴麦,像睡著了一般蠢沿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上匾效,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天舷蟀,我揣著相機(jī)與錄音,去河邊找鬼面哼。 笑死野宜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的精绎。 我是一名探鬼主播速缨,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼代乃!你這毒婦竟也來了旬牲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤搁吓,失蹤者是張志新(化名)和其女友劉穎原茅,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體堕仔,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡擂橘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了摩骨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片通贞。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖恼五,靈堂內(nèi)的尸體忽然破棺而出昌罩,到底是詐尸還是另有隱情,我是刑警寧澤灾馒,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布茎用,位于F島的核電站,受9級(jí)特大地震影響睬罗,放射性物質(zhì)發(fā)生泄漏轨功。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一容达、第九天 我趴在偏房一處隱蔽的房頂上張望古涧。 院中可真熱鬧,春花似錦花盐、人聲如沸蒿褂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽啄栓。三九已至娄帖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間昙楚,已是汗流浹背近速。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留堪旧,地道東北人削葱。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像淳梦,于是被迫代替她去往敵國(guó)和親析砸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容