项目优化
项目优化策略:
1生成打包报告
2第三方库启用CDN
3Element-ui组件按需加载
4路由懒加载
5首页内容定
1——生成打包报告
打包时,为了直观地发现项目中存在的问题,可以在打包时生成报告,生成报告的方式有两种:
@1通过命令行参数的形式生成报告
//通过vue-cli 的命令选项可以生成打包报告
// --report 选项可以生成report.html 以帮助分析包内容
vue-cli-service build --report
@2 通过可视化的UI面板直接查看报告
在可视化的UI面板,通过控制台和分析面板,可以方便地看到项目中所存在的问题。
2——通过vue.config.js修改webpack的默认配置
通过vue-cli3.0工具生成的项目,默认隐藏了所有webpack的配置项,目的是为了屏蔽项目的配置过程,让程序员把工作重心放到具体功能和业务逻辑的实现上。
如果程序员有修改webpack默认 配置的需求 ,可以在项目根目录中,按需创建vue.config.js这个配置文件,从而对项目的打包发布过程做自定义的配置 https://cli.vuejs.org/zh/config/#vue-config-js 官方配置
//vue.config.js
//这个文件中,应该导出一个包含了自定义配置选项的对象 module.exports = { //选项 ... }
3——为开发模式与发布模式指定不同的打包入口
默认情况下,vue项目的开发模式与发布模式,共用一个打包的入口文件(即src/main.js)。为了将项目的开发过程与发布过程分离,我们可以为两种模式,各自指定打包的入口文件,即:
@1开发模式的入口文件为 src/main-dev.js
@2发布模式的入口文件为src/main-prod.js
4——configureWebpack和chainWebpack
在vue.config.js导出的配置对象中,新增configureWebpack或chainWebpack节点,来定义webpack的打包配置。
他们的作用相同,惟一的区别就是它们修改webpack配置的方式不同。
1chainWebpack通过链式编程的形式,来修改默认的webpack配置
2configureWebpack通过操作对象 的形式,来修改默认的webpack配置
两者具体的使用差异:https://cli.vuejs.org/zh/guide/webpack.html#%E7%AE%80%E5%8D%95%E7%9A%84%E9%85%8D%E7%BD%AE%E6%96%B9%E5%BC%8F
//vue.config.js module.exports = { //选项 chainWebpack: config => { config.when(process.env.NODE_ENV === 'production', config => { config .entry('app') .clear() .add('./src/main-prod.js') }) config.when(process.env.NODE_ENV === 'development', config => { config .entry('app') .clear() .add('./src/main-dev.js') }) } }
5——解决依赖单文件过大问题:
1@通过externals加载外部CDN资源
默认 情况下,通过import语法导入的第三方依赖包,最终会被 打包合并到同一个文件中,从而导致打包成功后,单文件体积过大的问题。
为了解决上述问题,可以通过webpack的externals节点,来配置并加载外部的CDN资源。凡是声明在externals中的第三方依赖包,都不会被打包。
配置方法: 效果显著
1 vue.config.js 发布模式
config.set('externals', { vue: 'Vue', 'vue-router': VueRouter, axios: 'axios', lodash: '_', echarts: 'echarts', nprogress: 'NProgress', 'vue-quill-editor': 'VueQuillEditor' })
2 public/index.html文件的头部,添加如下CDN资源引用 CSS文件的引用 http://www.staticfile.org/
3 public/index.html文件的头部,添加如下CDN资源引用 JS文件的引用 https://www.jsdelivr.com/
2@通过CDN优化ElementUi的打包
具体操作流程:
1在main-prod.js中,注释掉element-ui按需加载的代码
2在index.html的头部区域中,通过CDN加载element-ui的js和css样式
**************************首页内容定制
不同的打包环境下,首页内容可能会有所不同。我们可以通过插件的方式进行定制,插件配置如下:
//vue.config.js module.exports = { //选项 chainWebpack: config => { //产品发布阶段 config.when(process.env.NODE_ENV === 'production', config => { config .entry('app') .clear() .add('./src/main-prod.js') config.set('externals', { vue: 'Vue', 'vue-router': 'VueRouter', axios: 'axios', lodash: '_', echarts: 'echarts', nprogress: 'NProgress', 'vue-quill-editor': 'VueQuillEditor' }) config.plugin('html').tap(args => { args[0].isProd = true return args }) }) //产品开发阶段 config.when(process.env.NODE_ENV === 'development', config => { config .entry('app') .clear() .add('./src/main-dev.js') config.plugin('html').tap(args => { args[0].isProd = false return args }) }) } }
在public/index.html首页中,可以根据isProd的值,来决定如何渲染页面结构
<title><%= htmlWebpackPlugin.options.isProd ? '' :'dev -' %></title>
<% if(htmlWebpackPlugin.options.isProd) { %> <!-- 通过externals 加载的外部CDN资源 --> <% } %>
******************路由懒加载
当打包构建项目时,javascript包会变得非常大,影响页面加载。如果我们能把不同路由对应的组件分隔成不同的代码块,然后当路由被访问的时候才加载对应的组件,这样就更加高效嘞。
具体步骤: https://router.vuejs.org/zh/guide/advanced/lazy-loading.html#%E6%8A%8A%E7%BB%84%E4%BB%B6%E6%8C%89%E7%BB%84%E5%88%86%E5%9D%97
1安装@babel/plugin-syntax-dynamic-import包。
2在babel.config.js配置文件中声明该插件
3将路由改为按需加载的形式,示例代码如下:
webpackChunkName可以实现分组,同组的组件可以被打包到同一个文件中
const Foo = () => import(/* webpackChunkName: "group-foo" */ './Foo.vue') const Bar = () => import(/* webpackChunkName: "group-foo" */ './Bar.vue') const Baz = () => import(/* webpackChunkName: "group-foo" */ './Baz.vue')