VUE项目优化策略

一. 生成打包报告

二. 第三方库启用CDN

三. Element-UI组件按需导入

四. 首页内容定制

五. 路由懒加载


一、 生成打包报告
  1. 打包时,为了直观地发现项目中存在的问题,可以生成打包报告,方式有两种:

① 通过命令参数的形式生成报告

// 通过 vue-cli 的命令选项可以生成打包报告
// --report  选项可以生成 report.html 以帮助分析内容
vue-cli-service buil --report

② 通过可视化UI面板直接查看报告


可视化UI面板.png
  1. 通过vue.config.js 修改 webpack 的默认配置项

通过 vue-cli 3.0 工具生成的项目,默认隐藏了所有 webpack 的配置项,目的是为了屏蔽项目的配置过程,让程序员把工作的重心,放到具体功能和业务逻辑的实现上。

如果程序员需要修改 webpack ,可以在项目的根目录中,创建vue.config.js 配置文件,从而对项目的打包过程做自定义的配置

  1. 为开发模式与发布模式指定不同的打包入口

默认情况下,vue项目的开发模式与发布模式,共用同一个打包的入口文件。为了将项目的开发过程与发布过程分离,我们可以为两种模式,各自指定打包的入口文件,即:

  • 开发模式的入口文件为 src/main-dev.js
  • 发布模式的入口文件为 src/main-prod.js
  1. confitureWebpack 和 chainWebpack

在 vue.config.js 到处的配置对象中,新增 configureWebpack 或 chainWebpack 节点,来定义 webpack 的打包配置。两者作用相同,不同点再配置方式上的不同:

  • chainWebpack 通过链式编程的形式,来修改默认的webpack 配置
  • configureWebpack 通过操作对象的形式,来修改默认的webpack 配置
二、 第三方库启用CDN
  1. 通过chainWebpack 自定义打包入口
module.exports = {
  lintOnSave: false,
  chainWebpack:config=>{
    //生产环境
    config.when(process.env.NODE_ENV === 'production',config=>{
    //注意main-prod.js是已经存在的文件
      config.entry('app').clear().add('./src/main-prod.js')
    })
    //开发环境
    config.when(process.env.NODE_ENV === 'development',config=>{
    //注意main-dev.js是已经存在的文件
      config.entry('app').clear().add('./src/main-dev.js')
    })
  }
}
  1. 通过 externals 加载外部CDN 资源

默认情况下,通过import语法导入的第三方依赖包,最终会被打包合并到同一个文件中,从而导致打包后,单文件体积过大的问题。

为了解决上述问题,可以通过webpack 的 externals 节点,来配置并加载外部的CDN 资源。凡是声明在externals中的第三方依赖包,都不会被打包,通过设置externals这个节点,指定哪些包直接去window上去查找使用,而不会将这些指定的包再次打包起来,这样就可以减小最终生成的js的文件体积。具体配置代码如下:

config.set('externals',{
        vue:'Vue',
        'vue-router':'VueRouter',
        axios:'axios',
        lodash:'_',
        echarts:'echarts',
        nprogress:'NProgress',
        'vue-quill-editor':'VueQuillEditor'
      })
    })
三、 Element-UI组件按需导入
  1. 通过CDN 优化 ElementUI 的打包

组件按需加载后包的体积还是很大的时候,可以通过CDN 的形式来加载,具体操作流程如下:

  • 在main-prod.js 中,注释掉 element-ui 按需加载的代码
  • 在index.html 的头部区域,通过CDN加载element-ui 的js 和 css
四、 首页内容定制
  1. 首页内容定制

不同的打包环境下,首页内容可能会有所不同。我们可以通过插件的方式进行定制,插件配置如下:

module.exports = {
  lintOnSave: false,
  chainWebpack:config=>{
    //生产环境
    config.when(process.env.NODE_ENV === 'production',config=>{
      config.plugin('html').tap(args => {
          args[0].isProd = true
          return args
        })
    })
    //开发环境
    config.when(process.env.NODE_ENV === 'development',config=>{
      config.plugin('html').tap(args => {
          args[0].isProd = false
          return args
        })
    })
  }
}

在 index.html 首页中,可以根据isProd 的值,来决定如何渲染页面结构:

<!-- 按需渲染页面的标题 -->
<title><%= htmlWebpackPlugin.options.isProd ? '' : 'dev - ' %>电商后台</title>

<!-- 按需加载外部的 CDN 资源 -->
<% if(htmlWebpackPlugin.options.isProd) { %>
<!-- 通过 externals 加载的外部 CDN 资源 -->
<% } %>
五、 路由懒加载
  1. 路由懒加载
    当项目打包构建的时候,js包会变得非常巨大,影响页面加载,如果我们能够把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应的组件,这样就更加高效了
  • 安装@bable/plugin-syntax-dynamic-import包

  • 在babel.config.js配置文件中声明该插件

  • 将路由改为按需加载的形式

const Login = () => import(/* webpackChunkName: "login_home_welcome" */ '../components/Login.vue')
const Home = () => import(/* webpackChunkName: "login_home_welcome" */ '../components/Home.vue')
const Welcome = () => import(/* webpackChunkName: "login_home_welcome" */ '../components/Welcome.vue')
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容