本文同步更新于我的个人博客点击前往。如果对您有帮助,请为我点个小星星。首先说下我目前已经做的优化点,本文是在此基础上做的进一步优化:
- 配置路由懒加载,封装了异步组件引入的方法,接收一个地址做参数
/** * 返回异步组件 * @tips 请注意页面只能挂载在views文件下,非此路径请勿使用 */const AsyncComponentHook = (path: String): Function => (): any => { // 通过 webpack 的内联注释,设置模块名 let component = import(/* webpackChunkName: "view-[request]" */ `@/views/${path}.vue`); component.catch((e) => { console.error(e); }); return component;};复制代码
- 配置代码压缩
// 安装 npm install uglifyjs-webpack-plugin // 在vue.config.js文件中添加配置 configureWebpack: config => { if (process.env.NODE_ENV === 'production') { // 为生产环境修改配置... config.plugins.push( //生产环境自动删除console new UglifyJsPlugin({ uglifyOptions: { compress: { warnings: false, drop_debugger: true, drop_console: true, }, }, sourceMap: false, parallel: true, }) ); } },复制代码
- 配置引用别名
- 设置插件的按需引入,本文使用的是element-ui,点击查看详情
...
经过一些基础的配置后,我们来看下目前打包后的效果。
从下图可以看到,打包出来后最大的包有1.33M。然后再看下请求,哇,217个请求、首页下载需要3.2M。
![271160f9b350d0b7549b7be8a495bed0.png](https://i-blog.csdnimg.cn/blog_migrate/4d343345fce207d23d8bbd7c3fb2d895.jpeg)
![f2e0c262a554834d87c6d36f96170706.png](https://i-blog.csdnimg.cn/blog_migrate/d26997be5e9aff08e2681dfe3225dec6.jpeg)
...
好吧,开始折腾
1. 优化scss配置文件的引入
我们在搭建项目的过程中经常性的会将一些scss配置文件抽离出来,例如主题色等,然后在每个需要的组件中引入。这样会显得很繁琐,我们可以借助sass-loader帮我们进行预处理, 这样我们就不用在每一个页面都进行引入样式,就能直接引用。
例如我们的样式文件目录下有一个theme.scss,我们可以在vue.config.js中作如下处理
// vue.config.js 配置module.exports = { css: { // css预设器配置项 loaderOptions: { // pass options to sass-loader sass: { // 引入全局变量样式,@使我们设置的别名,执行src目录 data: ` @import "@/stylePath/theme.scss"; ` } }, },}复制代码
通过以上配置,就可以在组件模板中注释以下代码
复制代码
2. 针对请求数进行优化
我们发现请求数增多是因为我们页面预先渲染了其它组件,会在html页面中插入像这样的东西,这该怎么优化呢?
首先我们先看下vue.config.js的官方文档,点击前往。 官方说明: 是一种 resource hint,用来告诉浏览器在页面加载完成后,利用空闲时间提前获取用户未来可能会访问的内容。
所以我们添加如下配置
// vue.config.jsmodule.exports = { chainWebpack: config => { // 移除 prefetch 插件 config.plugins.delete('prefetch') // 移除 preload 插件 config.plugins.delete('preload'); }}复制代码
3. 公用代码提取,使用cdn加载
对于vue, vuex, vue-router,axios等我们可以利用wenpack的externals参数来配置,这里我们设定只需要在生产环境中才需要使用:
// vue.config.jsconst isProduction = process.env.NODE_ENV === 'production';const cdn = { css: [], js: [ 'https://cdn.bootcss.com/vue/2.5.17/vue.runtime.min.js', 'https://cdn.bootcss.com/vue-router/3.0.1/vue-router.min.js', 'https://cdn.bootcss.com/vuex/3.0.1/vuex.min.js', 'https://cdn.bootcss.com/axios/0.18.0/axios.min.js', ]}module.exports = { chainWebpack: config => { // 生产环境配置 if (isProduction) { // 生产环境注入cdn config.plugin('html') .tap(args => { args[0].cdn = cdn; return args; }); } }, configureWebpack: config => { if (isProduction) { // 用cdn方式引入 config.externals = { 'vue': 'Vue', 'vuex': 'Vuex', 'vue-router': 'VueRouter', 'axios': 'axios' } } },}复制代码
接着修改html文件,添加注入代码
We're sorry but eye-admin doesn't work properly without JavaScript enabled. Please enable it to continue. 复制代码
然后打包重启,我们再来看下目前的变化。
嗯,真香~从下图可以看到,打包出来后最大的包文件只有775kb。然后再看下请求,哇,43个请求、首页下载只需要1.4M。
可以看出,我们这一系列的操作后请求数减少了174个,首页渲染减少了1.8m,真是可喜可贺
![0c3717a7771113c98721eb17d8aa776c.png](https://i-blog.csdnimg.cn/blog_migrate/7bdfdcb029f74fa9c972e6a8ae0ac5e7.jpeg)
![d33e43b944265a367fcefe1f83f01251.png](https://i-blog.csdnimg.cn/blog_migrate/fb72a30608d35781228b067065501c5d.jpeg)
最后,附上完整的vue-config.js文件
const path = require("path");const UglifyJsPlugin = require('uglifyjs-webpack-plugin');const isProduction = process.env.NODE_ENV === 'production';const cdn = { css: [], js: [ 'https://cdn.bootcss.com/vue/2.5.17/vue.runtime.min.js', 'https://cdn.bootcss.com/vue-router/3.0.1/vue-router.min.js', 'https://cdn.bootcss.com/vuex/3.0.1/vuex.min.js', 'https://cdn.bootcss.com/axios/0.18.0/axios.min.js', ]}function resolve(dir) { return path.join(__dirname, dir)}module.exports = { // 基本路径 baseUrl: './', // 输出文件目录 outputDir: 'dist', // 放置生成的静态资源 (js、css、img、fonts) 的 (相对于 outputDir 的) 目录。 // assetsDir: "./