vue首屏加載慢的解決方案


單頁面應用首次進入時加載的文件較多,導致首屏渲染速度很慢。以下總結了一些解決單頁面應用首屏渲染慢的方式。

1、路由懶加載

a)、require

/* vue異步組件技術 */
{
  path: '/home',
  name: 'home',
  component: resolve => require(['@/components/home'],resolve)
},{
  path: '/index',
  name: 'Index',
  component: resolve => require(['@/components/index'],resolve)
}

b)、import

// 下面2行代碼,沒有指定webpackChunkName,每個組件打包成一個js文件。
const Index = () => import('@/components/index')
const About = () => import('@/components/about') */
// 下面2行代碼,指定了相同的webpackChunkName,會合並打包成一個js文件。 把組件按組分塊
const Home =  () => import(/* webpackChunkName: 'ImportFuncDemo' */ '@/components/home'))

c)、require.ensure(dependencies: String[], callback: function(require), chunkName: String)   多個路由指定相同的chunkName,會合並打包成一個js文件。

/* 組件懶加載方案三: webpack提供的require.ensure() */
{
  path: '/home',
  name: 'home',
  component: r => require.ensure([], () => r(require('@/components/home')), 'demo')
}, {
  path: '/index',
  name: 'Index',
  component: r => require.ensure([], () => r(require('@/components/index')), 'demo')
}

2、多入口

vue多入口: https://www.jianshu.com/p/00b51e4e2b2e

3、壓縮代碼並移除console

使用UglifyJsPlugin 插件來壓縮代碼和移除console。

new webpack.optimize.UglifyJsPlugin({
    compress: {
        warnings: false,
        drop_console: true,
        pure_funcs: ['console.log']
    },
    sourceMap: false
})    

4、使用cdn引入第三方庫、靜態資源oss減小服務器壓力

Vue 全家桶以及 ElementUI 仍然占了很大一部分 vendors 體積,這部分代碼是不變的,但會隨着每次 vendors 打包改變 hash 重新加載。我們可以使用 CDN 剔除這部分不經常變化的公共庫。我們將vue,vue-router,vuex,axios,jquery,underscore,使用CDN資源引入。國內的CDN服務推薦使用https://www.bootcdn.cn/

首先我們要在 index.html 中, 添加 CDN 的相關代碼

<html>
...
<link href="https://cdn.bootcss.com/element-ui/2.7.2/theme-chalk/index.css" rel="stylesheet">
  </head>
  <body>
    <div id="app"></div>
    <script src="https://cdn.bootcss.com/vue/2.6.10/vue.min.js"></script>
    <script src="https://cdn.bootcss.com/vuex/3.1.0/vuex.min.js"></script>
    <script src="https://cdn.bootcss.com/vue-router/3.0.4/vue-router.min.js"></script>
    <script src="https://cdn.bootcss.com/axios/0.18.0/axios.min.js"></script>
    <script src="https://cdn.bootcss.com/element-ui/2.7.2/index.js"></script>
    <script src="https://cdn.bootcss.com/jquery/3.4.0/jquery.min.js"></script>
    <script src="https://cdn.bootcss.com/underscore.js/1.9.1/underscore-min.js"></script>
  </body>
</html>

在 vue.config.js 中加入 webpack 配置代碼

configureWebpack: {
  externals: {
    'vue': 'Vue', // 左側vue是我們自己引入時候要用的,右側是開發依賴庫的主人定義的不能修改
    'vue-router': 'VueRouter',
    'vuex': 'Vuex',
    'element-ui': 'ELEMENT',
    'axios': 'axios',
    'underscore' : {
      commonjs: 'underscore',
      amd: 'underscore',
      root: '_'
    },
    'jquery': {
      commonjs: 'jQuery',
      amd: 'jQuery',
      root: '$'
    }
  },
}

去除 vue.use() 相關代碼

需要注意的是,通過 CDN 引入,在使用 VueRouter Vuex ElementUI 的時候要改下寫法。CDN會把它們掛載到window上,因此不再使用Vue.use(xxx)

也不在需import Vue from ‘vue’, import VueRouter from ‘vue-router’ 等。

剔除全家桶和Element-ui等只有,剩下的需要首次加載 vendors 就很小了。

使用 CDN 的好處有以下幾個方面

(1)加快打包速度。分離公共庫以后,每次重新打包就不會再把這些打包進 vendors 文件中。

(2)CDN減輕自己服務器的訪問壓力,並且能實現資源的並行下載。瀏覽器對 src 資源的加載是並行的(執行是按照順序的)。

5、開啟gzip

  • 首先打開 config/index.js ,找到 build 對象中的 productionGzip ,改成 true
  • 打開 productionGzip: true 之前,先要安裝依賴 compression-webpack-plugin ,官方推薦的命令是:
    npm install --save-dev compression-webpack-plugin 
    //(此處有坑) 如果打包報錯,應該是版本問題 ,先卸載之前安裝的此插件 ,然后安裝低版本 
    npm install --save-dev compression-webpack-plugin@1.1.11
  • 3.等安裝好了,重新打包 npm run build ,此時打包的文件會 新增 .gz 文件。是不是比原來的js文件小很多呢,之后項目訪問的文件就是這個.gz文件

6、關閉sourceMap

即在config/index.js中將productionSourceMap的值修改為false,就可以在編譯時不生成.map文件了

7、使用更輕量級的工具庫

moment是處理時間的標桿,但是它過於龐大,我們可以使用day.js替代。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM