背景
duangkey本周新作业第一天,等候体系注册之余,对上星期在老东家的最终一次优化做个记录。
公司产品是IOT项目,需要对接视频监控渠道以及各种的协议对接,因此项目体积不可避免的大。
为了更好的完结组件的保护作业,运用了verdaccio去管理组件库,项目中所运用的组件都是经过私有库进行安装引进的,组件许多,开源插件也安装了不少。
在没有进行构建优化之前,项目构建耗时有时会到达恐怖的300s,现磨咖啡都能磨四五杯了。
优化战略
项目运用渐进式结构vue进行搭建,版本是vue3,打包东西版本号是webpack5,低版本webpack请慎重参阅;
正常优化手段是借助相关plugin进行装备优化,比方TerserWebpackPlugin、CssMinimizerWebpackPlugin等等
TerserWebpackPlugin:js紧缩插件;
CssMinimizerWebpackPlugin:运用cssnano优化和紧缩CSS;
(详细装备和介绍可参阅官方文档⬆)
下面介绍本次的主角– esbuild-loader
Speed up your Webpack build withesbuild!
esbuildis a JavaScript bundler written in Go that supports blazing fast ESNext & TypeScript transpilation andJS minification.
esbuild-loaderlets you harness the speed of esbuild in your Webpack build by offering faster alternatives for transpilation (eg. babel-loader/ts-loader) and minification (eg. Terser)!
简单来说便是运用esbuild提高webpack构建速度,它是运用Go言语开发的一款JS Bundler,支持超快的ESNext和TS转译以及JS的紧缩;它可以使你利用它的速度去代替Terser和babel,也是Terser和babel进行性能优化的替代计划。
这说明我们只需要运用esbuild-loader,就可以完成Terser和babel的功用。
安装
npm i -D esbuild-loader
OR
yarn add esbuild-loader
vue.config.js的装备
引进esbuild-loader的EsbuildPlugin模块,并在chainWebpack中进行装备
const { EsbuildPlugin } = require('esbuild-loader');
const rule = config.module.rule('js'); // ①
rule.uses.clear(); // ②
rule.use('esbuild-loader').loader('esbuild-loader').options({
loader: 'jsx',// 3-1
target: 'es2015' // 3-2
}); // ③
config.optimization.minimizers.delete('terser'); // ④
config.optimization
.minimizer('esbuild')
.use(EsbuildPlugin, [{ target: 'es2015', css: true }]); // ⑤
- 运用esbuild编译js文件
- 清空webpack内置的babel-loader
- 增加esbuild-loader
- 删除底层terser, 改用esbuild-minimize-plugin
- 运用esbuild-loader进行css的紧缩
3-1. 运用esbuild-loader编译含有jsx语法的文件
3-2. 编译的方针是es2015标准的文件
问题
装备成功后,构建速度显着提高,看上去形似没什么问题了。但是,在vue3中如果运用h函数进行node的创立的话,会报react is not defined的过错,这说明此刻项目并不能正常解析含有h函数的文件,导致项目发动失败。
解决方法
在options中增加2行装备参数:
jsxFactory: 'h', //自定义jsx解析计划,此处运用h作为渲染函数
jsxFragment: 'Fragment' //默认为 React.Fragment , 换成对应的 Vue.Fragment
保存后重新发动项目,根本可以控制在磨一杯咖啡的时间内了。
【运用speechSynthesis完成文字转语音功用】