:::info 你不改我不改,深夜加班无人睬 :::

背景

前后端全部自动化部署后,构建速度就变成运维小伙伴日常吐槽的点,上个月优化了后端镜像脚本,将构建时间缩短到7s以内,接下来就轮到你了,小前端

找问题

前端的构建脚本其实很简单,先把大象从冰箱里拿出来

  • Clone: 拉取代码 git clone
  • Install: 安装依赖 npm install
  • Build: 构建 npm run build
  • Upload: 上传 dist 到云端服务器

为了方面查看每一步的执行耗时,我使用了time命令(粗略统计),在执行命令前添加time即可,举个🌰

  1. time npm install

然后构建项目,没有任何处理的总构建时间是1分43秒

16365251041467.jpg

install 18.472s

15929092198459.jpg

build 41.27s

15929092704296.jpg

upload 26.787s

15929093018984.jpg

因为代码拉取直接使用的Jenkins,用总时长减去上面三项剩下就是clone的耗时 —— 16.47s(其实中间还有其他耗时啦,但咱就不分这么细了)

逐个击破

Clone

git clone 命令会拉取所有历史版本的代码,对于像这种指定版本的构建来说并不需要这些历史,随着迭代代码量越来越多,拉取代码的时间也就会越来越久。

所以第一步,修改拉取配置,改为浅克隆,克隆深度为1

设置步骤如下:
源码管理 - Additional Behaviours - Advanced clone behaviours(高级克隆) - Shallow clone(浅克隆)
15929241230411.jpg
修改后总构建时间缩短 7s 👏🏻
15929265683736.jpg

Install

改用 yarn 做依赖管理

  1. # 安装 yarn
  2. npm install -g yarn

使用缓存

  1. # 配置 yarn 的缓存路径和全局安装路径,注意将路径改成自己的目录
  2. yarn config set cache-folder /data/jenkins/yarn/cache
  3. yarn config set global-folder /data/jenkins/yarn/global
  4. # 优先使用缓存数据
  5. yarn --prefer-offline
  6. # 清理缓存命令
  7. # npm cache clean --force
  8. # yarn cache clean
  • --prefer-offline 则优先使用缓存数据,如果没有匹配的缓存数据,则从远程仓库下载。
  • --prefer-online 则优先使用网络数据,忽略缓存数据,这种模式可以及时获取最新的模块。

屏蔽非必要打印

当设置 progresstrue 时, 时将会显示进度条,把它设置为 false 可小幅提高 的速度

  1. # npm set progress=false && npm run build
  2. yarn build --no-progress

15929258477449.jpg

install 时间从18s缩短到10s

15929266712962.jpg

最终优化 - node_modules 复用

其实完全可以将 node_modules复用,因为依赖库并不是经常更新,完全可以需要时再选择性更新,这样的话 install 的时间可以全部节省出来,但具体怎么实现还没想好 🤔

Build

检查项目依赖

  1. 项目里不再使用依赖不删等着过年?
  2. 明确依赖使用的环境,开发依赖不要放到生产里,比如各种css预编译

关闭 SourceMap

  1. /**
  2. * Source Maps
  3. */
  4. productionSourceMap: false,
  5. // https://webpack.js.org/configuration/devtool/#production
  6. devtool: 'eval',

关闭调试

  1. const isDebug = process.env.NODE_ENV !== 'production'
  2. Vue.config.debug = isDebug
  3. Vue.config.devtools = isDebug
  4. Vue.config.productionTip = isDebug

提取不常变动的第三方库

使用 webpack 的插件 DllReferencePlugin

Upload

图片压缩

该压缩压缩,该雪碧图雪碧图,你的一小步,我的一大步

代码检查

在本地构建后发现多数大文件都是本地测试功能使用的,生产根本不用 🤦🏻‍♀️
同样的js依赖,没有提成公共文件,每个功能文件夹下都有一份 🤦🏻‍♀️
还有一些奇葩处理,我就不说了,哎,论走查的重要性 🤦🏻‍♀️
16365268123017.jpg

修改后 upload 时间从26s缩短到9s,总构建时间缩短 17s 👏🏻

16365317886536.jpg16365397405013.jpg

优化结果

步骤 优化前 优化后
Clone 16.74s 9s
Install 18.47s 10.26s
Build 41.27s 32.55s
Upload 26.79s 9.64s
Total 103.27s 61.45s

优化了近 40% 👏🏻 ,当然还有继续优化的空间~~~,朋友们,我们下次再见 👋