vue3项目首次打开页面加载慢优化

ppylox
·2/6/2023·0 阅读
AI 摘要模型根据正文自动生成,仅供参考

针对Vue3后台管理系统首次加载慢的问题,文章提出两方面优化:一是在index.html的#app容器内预置CSS loading动画,Vue渲染后自动覆盖,无需手动清除,提升加载体验;二是打包优化,将element-plus由全局引入改为按需引入(借助unplugin-auto-import与unplugin-vue-components),并通过Vite的manualChunks将vue、vue-router、echarts、axios等第三方库拆分独立打包,避免单一入口文件过大。同时建议开启服务器gzip压缩,可使文件体积降至约三分之一,进一步加快加载速度。

大家好我是图恩,最近发现后台管理系统首次打开比较慢,为了在页面没显示内容的时候让用户感觉到是在加载,为此做了一些优化。

因为最近代码更新相对比较频繁,在本地打完包后上传到服务器上,首次打开的时候发现页面一片空白,由于之前对打包也未作优化,导致页面在加载js跟css文件上面花了比较多的时间。

这次主要是对页面首次加载跟打包两个部分做了优化。

首次加载优化

页面首次加载的时候在id="app"的div中添加了一个loading,在vue实例未渲染之前会显示,渲染后会将页面代码写入到这个dom中间,就会把loading的代码覆盖掉,这样既不用手动去清除loading这部分代码又达到了体验优化的效果,以下代码供参考。

<body>\n  <div id="app">\n    <!-- 首次加载,文件未下载完成时显示一个loading -->\n    <style>\n      .el-loading-mask {\n        position: absolute;\n        z-index: 2000;\n        background-color: hsla(0, 0, 100%, ・9);\n        margin: 0;\n        top: 0;\n        right: 0;\n        bottom: 0;\n        left: 0;\n        transition: opacity .3s;\n      }\n\n      .el-loading-spinner {\n        top: 50%;\n        margin-top: -21px;\n        width: 100%;\n        text-align: center;\n        position: absolute;\n      }\n\n      .el-loading-spinner .circular {\n        height: 42px;\n        width: 42px;\n        animation: loding-rotate 2s linear infinite;\n      }\n\n      .el-loading-spinner .path {\n        animation: loading-dash 1.5s ease-in-out infinite;\n        stroke-dasharray: 90, 150;\n        stroke-dashoffset: 0;\n        stroke-width: 2;\n        stroke: #409eff;\n        stroke-linecap: round;\n      }\n\n      @keyframes loading-rotate {\n        100% {\n          transform: rotate (1turn);\n        }\n      }\n\n      @keyframes loading-dash {\n        0% {\n          stroke-dasharray: 1, 200;\n          stroke-dashoffset: 0;\n        }\n\n        50% {\n          stroke-dasharray: 90, 150;\n          stroke-dashoffset: -40px;\n        }\n\n        100% {\n          stroke-dasharray: 90, 150;\n          stroke-dashoffset: -120px;\n        }\n      }\n    </style>\n    <div class="el-loading-mask">\n      <div class="el-loading-spinner">\n        <svg class="circular" viewBox="0 0 50 50">\n          <circle class="path" cx="25" cy="25" r="20" fill="none"></circle>\n        </svg>\n      </div>\n    </div>\n  </div>\n  <script type="module" src="/src/main.ts"></script>\n</body>

打包优化

打包优化主要是对将之前element-plus的全局引入改为了按需引入方式了,其次就是将一些第三方库单独提出打包了,这样就不会像之前所有的文件都打成一个js入口文件中了,以下代码供参考。


import { defineConfig } from "vite";\nimport vue from "@vitejs/plugin-vue";\nimport vueJsx from "@vitejs/plugin-vue-jsx";\n// element-plus 按需导入\nimport AutoImport from 'unplugin-auto-import/vite'\nimport Components from 'unplugin-vue-components/vite'\nimport { ElementPlusResolver } from 'unplugin-vue-components/resolvers'\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n  plugins: [\n    vue(),\n    vueJsx(),\n    AutoImport({\n      resolvers: [ElementPlusResolver()],\n    }),\n    Components({\n      resolvers: [ElementPlusResolver()],\n    }),\n  ],\n  build: {\n    rollupOptions: {\n      output: {\n        manualChunks: {\n          'vue-router': ['vue-router'],\n          'vue': ['vue'],\n          'echarts': ['echarts'],\n          'countupjs': ['countup.js'],\n          'wangeditor': ['@wangeditor/editor'],\n          '@wangeditor-editorforvue': ['@wangeditor/editor-for-vue'],\n          'axios': ['axios'],\n          'element-plus': ['element-plus'],\n        },\n        entryFileNames: 'assets/js/[name]-[hash].js',\n        chunkFileNames: 'assets/js/[name]-[hash].js',\n        assetFileNames: 'assets/[ext]/[name]-[hash].[ext]',\n      }\n    }\n  }\n});


从上面的截图中可以看到目前最大的文件就是echarts库,其次就是编辑器库,不过由于服务器开启了gzip压缩,所以实际访问的时候是加载gzip文件的,截图中也显示vite在build的时候也会贴心的显示gzip文件大小,可以看到相比正常的文件gzip文件大小几乎只有原文件的三分之一,如果你的项目加载也比较慢,赶紧去试试开启gzip吧。




相关文章

评论 (0)

暂无评论,来写第一条吧