文章开始之前,推荐一些别人写的很好的文章!感兴趣的也可以去读一下哦!
今日推荐:原生微信小程序+云开发,源码给你们多久能开流量主?
文章链接:https://cloud.tencent.com/developer/article/2466610
起初跟着这位朋友做拼图小程序还赚到了零花钱,现在看他又开拓新的疆土,表示应向其致敬和看齐。
言归正传,所有的优化都应有指标,前端的资源优化、打包优化也是如此:
但它们并不是绝对的指标,比如:打包总体积变小核心包变大、访问时长会变大;分包后访问时长变小、但响应时长会变大等。
所以,盲目追求优化数值并不能带来好的效果,需要根据实际情况进行取舍。
本文仅梳理优化手段,以 vite
项目为例,具体采用哪些手段需按你业务的实际情况来。
普遍脚手架打包结束时都会打印打包时长,
比如 vue.min.js
或 axios.min.js
这些需要全量引入又不需要打包的依赖,可以提取出来,以提高打包速率。
再比如 vconsole
等非业务型依赖,也不应打包。
比如 DllPlugin
或 cache-loader
等。
比如 happy-pack
或 thread-loader
等。
或者 terser-webpack-plugin
等插件自带 parallel
参数配置。
比如 swc
或 esbuild
等。
正式环境可以不导出 sourceMap
。
没必要 import Icon from '@/assets/icon.svg'
,直接使用 src="/public/icon.svg"
更佳。
但也分情况,比如你想做雪碧图或小图片 base64
化。
首先要学会利用 vite-plugin-visualizer
等脚手架插件分析依赖体积。
比如 lodash
会全量引入,但并未用到所有 api
,因此使用 lodash-es
来 tree-shaking
。
再比如 moment
的语言包会占用大量体积,实际要用到的语言去单独引入更佳。
再比如 element-plus
等组件库的 自动导入方案
再比如分包都引入了包被重复打包多次,提取公共代码。小程序主包体积比分包的珍贵,可另行考虑
再比如 echarts
和 three
被错误书写而全量引入。
再比如 import.meta.glob
等的错误使用,而将未使用的模块或资源也打包进来。
比如 dayjs
要比 moment
小很多
压缩 html
、css
、js
、svg
、json
代码。
比如代码 compression-webpack-plugin
等插件。
比如代码 terser-webpack-plugin
等插件自带 minify
参数配置。
再比如图片 image-webpack-loader
等插件自带 optimization
参数配置。
首先你需要熟悉从网址到显示这个过程都经历了哪些步骤。
给 <script>
打上 preload
prefetch
标签,让浏览器预加载。
给 <script>
打上 async
defer
标签,让浏览器异步加载。
比如异步路由 import(./page.vue)
,或者异步组件 const Component = () => import('./page.vue')
。
或者,用到的时机才 document.body.append(script)
注入。
给请求配上缓存相关的 request headers
Expires
和 Cache-Control
可以去设定过期时间。也即强缓存,后续两条为协商缓存Last-Modified
和 If-Modified-Since
可以对比变更时间来判断缓存是否更新。Etag
和 If-None-Match
可以对比变更文件的 md5
值来判断缓存是否更新。或者通过 service-worker
来缓存资源。
给请求配上压缩相关的 request headers
增加宽带,增加 CDN
服务,减少 cookie
使用。
牵扯到 LCP
、FCP
、CLS
等视觉方面的指标,以及 FID
等交互方面的指标,
因为主包不加载完成,后续脚本就无法执行,所以要控制主包体积。
比如全量引入的 jquery
核心依赖或 element-plus
组件库,都会卡住业务代码的执行。
或者通过 optimization.splitChunks
来避免主包体积过大。
再比如,抽离 CSS
代码到独立文件。
牵扯到资源数量,比如小体积包过多都浪费大量的时间在三次握手上。
且浏览器并行下载速率有限,请求太多会卡住后续请求。
再比如雪碧图,小图片 base64
化,等等。
比如在 router.beforeEach
判断用户权限要等待接口返回就阻塞了页面访问,可以改为先跳页再说。
一般是 <keep-alive>
或给元素设置 key
或 ref
,
比如,给异步脚本加 id
避免重复请求。
比如大量的 *
或者 !important
样式,会阻塞页面渲染。
当 DOM
数量过多会使页面卡顿。
比如避免使用 offsetWidth
触发重排,大量 display: none
等。
有频繁重排的元素,进行脱离文档流处理。
加上节流防抖机制。
优化动画,有动画的元素加 transform: translate3d(0, 0, 0)
。
比如弹窗内容存在渲染、计算耗时大的组件,可以先 v-if
等待弹窗开启后再渲染。
比如 shouldComponentUpdate
PureComponent
React.memo
等。
再比如 shallowRef
。
再比如拖拽等交互,使用 DOM
操作临时取代数据驱动。
邀请人:一起重学前端
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。