Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >前端性能优化——包体积压缩82%、打包速度提升65%

前端性能优化——包体积压缩82%、打包速度提升65%

作者头像
@超人
发布于 2023-05-12 05:15:09
发布于 2023-05-12 05:15:09
2.7K00
代码可运行
举报
文章被收录于专栏:Vue中文社区Vue中文社区
运行总次数:0
代码可运行

压缩项目打包后的体积大小、提升打包速度,是前端性能优化中非常重要的环节,笔者结合工作中的实践总结,梳理出一些 常规且有效 的性能优化建议

项目背景

技术栈:vue-cli3 + vue2 + webpack4 主要插件:elementUI + echarts + axios + momentjs

目标: 通过一系列的优化方案,对比打包体积和速度的前后变化,来验证方案的有效性

项目初始体积与速度

  • 初始体积 2.25M

originalSize.png

vue 项目可以通过添加--report命令:"build": "vue-cli-service build --report",打包后 dist 目录会生成 report.html 文件,用来分析各文件的大小

或者通过安装 webpack-bundle-analyzer 插件来分析,步骤如下:

1)安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install webpack-bundle-analyzer -D
复制代码

2)vue.config.js中 引入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
module.exports = {
  configureWebpack: {
      plugins: [
         new BundleAnalyzerPlugin()
      ]
  }
}
复制代码

3)npm run serve运行后,在浏览器打开http://127.0.0.1:8888/ 可以看到分析页面

  • 初始打包速度 25386ms

totalTime.png

开始优化 ✈︎

1、externals 提取项目依赖

从上面的打包分析页面中可以看到,chunk-vendors.js 体积为 2.21M,其中最大的几个文件都是一些公共依赖包,那么只要把这些依赖提取出来,就可以解决 chunk-vendors.js 过大的问题

可以使用 externals 来提取这些依赖包,告诉 webpack 这些依赖是外部环境提供的,在打包时可以忽略它们,就不会再打到 chunk-vendors.js 中

1)vue.config.js 中配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module.exports = {
  configureWebpack: {
    externals: {
      vue: 'Vue',
      'vue-router': 'VueRouter',
      axios: 'axios',
      echarts: 'echarts'
    }
}
复制代码

2)在 index.html 中使用 CDN 引入依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  <body>
    <script src="http://lib.baomitu.com/vue/2.6.14/vue.min.js"></script>
    <script src="http://lib.baomitu.com/vue-router/3.5.1/vue-router.min.js"></script>
    <script src="http://lib.baomitu.com/axios/1.2.1/axios.min.js"></script>
    <script src="http://lib.baomitu.com/echarts/5.3.2/echarts.min.js"></script>
  </body>
复制代码

验证 externals 的有效性:

重新打包,最新数据如下:

打包体积:1.12M

externalsSize.png

打包速度:18879ms

externalsTime.png

使用 externals 后,包体积压缩50%、打包速度提升26%

2、组件库的按需引入

为什么没有使用 externals 的方式处理组件库呢?

externals缺点:直接在html内引入的,失去了按需引入的功能,只能引入组件库完整的js和css

组件库按需引入的原理:最终只引入指定组件和对应的样式

elementUI 需要借助 babel-plugin-component[1] 插件实现,插件的作用如下:

如按需引入 Button 组件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { Button } from 'element-ui'

Vue.component(Button.name, Button)
复制代码

编译后的文件(自动引入 button.css):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import _Button from "element-ui/lib/button";
import _Button2 from "element-ui/lib/theme-chalk/button.css";
// base.css是公共的样式
import "element-ui/lib/theme-chalk/base.css";

Vue.component(_Button.name, _Button);
复制代码

通过该插件,最终只引入指定组件和样式,来实现减少组件库体积大小

1)安装 babel-plugin-component

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install babel-plugin-component -D
复制代码

2)babel.config.js中引入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module.exports = {
  presets: ['@vue/app'],
  plugins: [
    [
      'component',
      {
        libraryName: 'element-ui',
        styleLibraryName: 'theme-chalk'
      }
    ]
  ]
};
复制代码

验证组件库按需引入的有效性:

重新打包,最新数据如下:

打包体积:648KB

babel-plugin-componentSize.png

打包速度:15135ms

babel-plugin-componentTime.png

组件库按需引入后,包体积压缩72%、打包速度提升40%

同时 chunk-vendors.css 的体积也有了明显的减少,从206KB降到了82KB

原始体积:

originalCss.png

按需引入后:

babelCss.png

3、减小三方依赖的体积

继续分析打包文件,项目中使用了 momentjs,发现打包后有很多没有用到的语言包

momentJs.png

使用 moment-locales-webpack-plugin 插件,剔除掉无用的语言包

1)安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install moment-locales-webpack-plugin -D
复制代码

2)vue.config.js 中引入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const MomentLocalesPlugin = require('moment-locales-webpack-plugin');

module.exports = {
  configureWebpack: {
     plugins: [
       new MomentLocalesPlugin({localesToKeep: ['zh-cn']})
     ]
  }
}
复制代码

验证插件的有效性:

重新打包,最新数据如下:

打包体积:407KB

momentJsSize.png

打包速度:10505ms

momentJsTime.png

减小三方依赖体积后,包体积压缩82%、打包速度提升59%

4、HappyPack 多线程打包

由于运行在 Node.js 之上的 webpack 是单线程模型的,我们需要 webpack 能同一时间处理多个任务,发挥多核 CPU 电脑的威力

HappyPack 就能实现多线程打包,它把任务分解给多个子进程去并发的执行,子进程处理完后再把结果发送给主进程,来提升打包速度

1)安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install HappyPack -D
复制代码

2)vue.config.js 中引入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const HappyPack = require('happypack');
const os = require('os');
// 开辟一个线程池,拿到系统CPU的核数,happypack 将编译工作利用所有线程
const happyThreadPool = HappyPack.ThreadPool({ size: os.cpus().length });

module.exports = {
  configureWebpack: {
     plugins: [
       new HappyPack({
        id: 'happybabel',
        loaders: ['babel-loader'],
        threadPool: happyThreadPool
      })
     ]
  }
}
复制代码

验证 HappyPack 的有效性:

重新打包,最新数据如下:

打包速度:8949ms

happyPackTime.png

使用HappyPack后,打包速度进一步提升了65%

由于测试项目较小,打包时间缩短的不算太多。实测发现越是复杂的项目,HappyPack 对打包速度的提升越明显

5、Gzip压缩

线上的项目,一般都会结合构建工具 webpack 插件或服务端配置 nginx,来实现 http 传输的 gzip 压缩,目的就是把服务端响应文件的体积尽量减小,优化返回速度

html、js、css资源,使用 gzip 后通常可以将体积压缩70%以上

这里介绍下使用 webpack 进行 gzip 压缩的方式,使用 compression-webpack-plugin 插件

1)安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install compression-webpack-plugin -D
复制代码

2)vue.config.js 中引入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const CompressionPlugin = require('compression-webpack-plugin');

module.exports = {
  configureWebpack: {
     plugins: [
      new CompressionPlugin({
        test: /\.(js|css)(\?.*)?$/i, //需要压缩的文件正则
        threshold: 1024, //文件大小大于这个值时启用压缩
        deleteOriginalAssets: false //压缩后保留原文件
      })
     ]
  }
}
复制代码

验证插件的有效性:

重新打包,原来 407KB 的体积压缩为 108KB

gZip.png

6、DllPlugin 动态链接库

DllPlugin 与 externals 的作用相似,都是将依赖抽离出去,节约打包时间。区别是 DllPlugin 是将依赖单独打包,这样以后每次只构建业务代码,而 externals 是将依赖转化为 CDN 的方式引入

当公司没有很好的 CDN 资源或不支持 CDN 时,就可以考虑使用 DllPlugin ,替换掉 externals

DllPlugin 配置流程大致分为三步:

1)创建 dll.config.js 配置文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { DllPlugin } from "webpack";

export default {
    // 需要抽离的依赖
    entry: {
        vendor: ["vue", "vue-router", "axios", "echarts"]
    },
    mode: "production",
    optimization: {
        splitChunks: {
            cacheGroups: {
                vendor: {
                    chunks: "all",
                    name: "vendor",
                    test: /node_modules/
                }
            }
        }
    },
    output: {
        filename: "[name].dll.js", // 输出路径和文件名称
        library: "[name]", // 全局变量名称:其他模块会从此变量上获取里面模块
        path: AbsPath("dist/static") // 输出目录路径
    },
    plugins: [
        new DllPlugin({
            name: "[name]", // 全局变量名称:减小搜索范围,与output.library结合使用
            path: AbsPath("dist/static/[name]-manifest.json") // 输出目录路径
        })
    ]
};
复制代码

2)package.json 配置脚本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"build:dll": "webpack --config ./dll.config.js",
复制代码

3)使用 DllReferencePlugin 将打包生成的dll文件,引用到需要的预编译的依赖上来,并通过 html-webpack-tags-plugin 在打包时自动插入dll文件

vue.config.js 配置如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { DllReferencePlugin } from "webpack";
import HtmlTagsPlugin from "html-webpack-tags-plugin";

export default {
  configureWebpack: {
    plugins: [
      new DllReferencePlugin({
        manifest: AbsPath("dist/static/vendor-manifest.json") // manifest文件路径
      }),
      new HtmlTagsPlugin({
        append: false, // 在生成资源后插入
        publicPath: "/", // 使用公共路径
        tags: ["static/vendor.dll.js"] // 资源路径
      })
    ]
  }
};
复制代码

先运行 npm run build:dll 打包生成依赖文件,以后只用运行 npm run build 构建业务代码即可

优化总结

经过上面的一系列优化,可以看到:

  • 包体积由原来的 2.25M 减少到 407KB,压缩了82%
  • 打包速度由原来的 25386ms减少到 8949ms,提升了65%

这些方式虽然很常规,但确实可以有效地提升项目的性能

本文主要介绍的是 项目打包构建方面 的优化方式,下一篇聊一聊 业务代码层面 的性能优化,其中会有很多有趣的方案

参考资料

[1]

https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2FQingWei-Li%2Fbabel-plugin-component: https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2FQingWei-Li%2Fbabel-plugin-component

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-04-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Vue中文社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Vue-Cli优化编译速度
Vue-Cli脚手架会有webpack的很多默认行为,因此我们得知道基于Vue-Cli的项目,当前的webpack都配置了啥,然后才能做针对性的分析与优化。
码客说
2022/09/27
3.7K0
Vue-Cli优化编译速度
前端性能优化篇一:webpack性能优化
当我们不用cli,而是自己搭建项目架子的时候,会用到webpack构建我们的项目,在用webpack构建项目的时候,过长的打包编译时间和庞大冗余的代码会让我们感到头疼。所以优化webpack性能成为了不可或缺的一部分。下面我们一起来探讨webpack性能优化细节。
用户6835371
2021/06/01
2.2K0
前端性能优化篇一:webpack性能优化
前端性能优化总结
最近花了一些时间在项目的性能优化上,背后做了很多工作,但是最后依然没有达到自己想要的结果,有些失望,但是还是记录下自己的执着。
前端迷
2020/07/02
1.2K0
总结几个 webpack 打包优化的方法,前端项目必备
1.3 对于一些插件,如果只是在个别组件中用的到,也可以不要在 main.js 里面引入,而是在组件中按需引入
夜尽天明
2023/03/15
2K0
总结几个 webpack 打包优化的方法,前端项目必备
浅入webpack4 高效简单的配置
在vue-cli3中已经将webpack等详细配置(config)去除,我们配置webpack只能在vue.config.js里进行配置,这里我个人总结了一套webpack的优化方案模板并且附有我个人的讲解(尚在研究中)。 总体优化这几个方面:
饼干_
2022/08/07
1K0
浅入webpack4 高效简单的配置
vue-cli3项目搭建配置以及性能优化
在之前的开发中主要用的是vue-cli2,最近空闲时间比较多,接下来有新项目,本着偷懒的本能,自己打算搭建一个基础包以备后期开发应用,并对其进行性能优化和配置
青梅煮码
2023/03/13
1.6K0
vue-cli3项目搭建配置以及性能优化
vue.config.js的优化配置(element-ui, echarts, lodash按需加载 )
“关注 前端开发社区 ,回复“ 1” 即可加入 前端技术交流群,回复 “ 2” 即可免费领取500G前端干货!
前端老道
2020/09/11
8.3K0
vue.config.js的优化配置(element-ui, echarts, lodash按需加载 )
【Vuejs】317- 提升90%加载速度——Vuecli下的首屏性能优化
作者:夜行风 链接:https://segmentfault.com/a/1190000019499007
pingan8787
2019/08/19
2.9K0
Vue打包优化
http1.1下面分割的chunk也不宜太多,因为在同一个域下面的资源并发下载的资源数量是有限的,比如chrome大约是6个资源同时下载,这6个资源中必须要有某个资源下载完毕后才会下载其他资源,但也不一定非要少于6个,因为某些资源可能直接读取内存,某些资源可以通过cdn从别的域中读取。
码客说
2023/04/27
1.1K0
重学webpack4之构建速度提升和体积优化
5.执行npm run build,发现那些被拆分的包,没有打进业务代码中,符合预期
疯狂的技术宅
2020/12/15
1.2K0
重学webpack4之构建速度提升和体积优化
vue-cli webpack2项目打包优化
减小文件搜索范围 配置 resolve.modules Webpack的resolve.modules配置模块库(即 node_modules)所在的位置,在 js 里出现 import 'vue' 这样不是相对、也不是绝对路径的写法时,会去 node_modules 目录下找。但是默认的配置,会采用向上递归搜索的方式去寻找,但通常项目目录里只有一个node_modules,且是在项目根目录,为了减少搜索范围,可以直接写明 node_modules 的全路径;同样,对于别名(`alias)的配置,亦当如此:
mcq
2018/06/20
1.3K0
【Vuejs】269- 提升90%加载速度——vuecli下的首屏性能优化
之前用 vuecli做了个博客,是一个单页面项目,大概有十个路由 直接 npm run build打包出来,有一个 1M的巨大 js文件
pingan8787
2019/07/25
1K0
【Vuejs】269- 提升90%加载速度——vuecli下的首屏性能优化
Vue webpack 压缩打包上线 首屏加载时间过长 优化方案
最近博客上线,但是在首次加载的时候,需要消耗很多时间,大概在50秒左右,就是说第一页登录页面,就需要用户等待50秒(服务器是最低配置也是一个原因),看了一下network,发现有两个文件加载的时间特别长,一个是vendor.js,一个是app.js,打包的时候,这两个文件也提示文件过大
Autooooooo
2020/11/09
1.8K0
Vue webpack 压缩打包上线 首屏加载时间过长 优化方案
性能优化篇---Webpack构建速度优化
const Jarvis = require("webpack-jarvis"); plugins: [ new Jarvis({ watchOnly: false, port: 3001 // optional: set a port }) ];
keyWords
2019/03/20
2.2K0
性能优化篇---Webpack构建速度优化
Webpack 打包优化之速度篇
在前文 Webpack 打包优化之体积篇中,对如何减小 Webpack 打包体积,做了些探讨;当然,那些法子对于打包速度的提升,也是大有裨益。然而,打包速度之于开发体验和及时构建,相当重要;所以有必要对其做更为深入的研究,以便完善工作流,这就是本文存在的缘由。 减小文件搜索范围 在使用实际项目开发中,为了提升开发效率,很明显你会使用很多成熟第三方库;即便自己写的代码,模块间相互引用,为了方便也会使用相对路劲,或者别名(alias);这中间如果能使得 Webpack 更快寻找到目标,将对打包速度产生很是积极的
晚晴幽草轩轩主
2018/03/27
1.6K0
webpack性能优化-构建速度
随着项目越来越复杂,可能你们会有同样的感触,上了趟厕所回来,项目还没构建完成。然而测试还一直在催命。或许这时候你就应该去考虑下,如何去优化我们的构建速度。
玖柒的小窝
2021/10/09
5440
5-10~11 webpack 性能优化(2)
然后我们修改一下 home.jsx 代码,增加一个三方库,lodash。我们装一下 lodash 然后引入:
love丁酥酥
2020/05/26
1.3K0
Vue typescript 如何极限压缩编译静态资源
记住,依赖一定要安装在 devDependencies 下,否则会增大你的打包体积
taixingyiji
2022/07/25
1.4K0
Vue typescript 如何极限压缩编译静态资源
前端成神之路-vue前端项目07
实现步骤: A.生成打包报告,根据报告优化项目 B.第三方库启用CDN C.Element-UI组件按需加载 D.路由懒加载 E.首页内容定制
海仔
2021/05/06
1.3K0
webpack优化解决项目体积大、打包时间长、刷新时间长问题!
在大家的日常开发中,特别是开发大型项目,大家有没有每次打包想要骂娘的冲动!反正我是很痛苦,每次打包20分钟起,这漫长的等待时间,让人非常焦虑,遇见一些特殊问题(比如测试微信分享),必须要打包部署,看效果,你会发现,一天时间全部浪费在打包上,真所谓改代码两分钟,打包代码两小时,于是闲暇之余,研究了一下webpck打包机制,并且通过几个小插件和一些技巧成功的减少公司项目的打包时间,虽然打包时间没有断崖式的减少,但是能少一分钟,是一分钟吧,下面我们一起来研究一下webpack的性能优化,以及体积优化!
用户7413032
2020/06/11
10.9K0
webpack优化解决项目体积大、打包时间长、刷新时间长问题!
推荐阅读
相关推荐
Vue-Cli优化编译速度
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验