前言
假如问你性能优化方案,答案是否还是千篇一律的八股文(异步加载、拆包、预加载、压缩代码体积)?
稍微有点规模的公司,前辈们肯定早就打好了基础。
不妨尝试从插件的角度来优化项目。
思想的核心在于:利用编译时的时间,换取运行时的时间。
怎么写?
const fileRegex = /\.(my-file-ext)$/
export default function myPlugin() {
return {
name: 'transform-file',
transform(src, id) {
if (fileRegex.test(id)) {
return {
code: compileFileToJS(src),
map: null // 如果可行将提供 source map
}
}
},
}
}
这是官方教程上的一段代码。
不知道大家有没有和我一样的疑问?
src
是啥?id
是啥?code
又是啥?
翻了几遍官方文档没有找到解释,只好上手打印一下。
id
根据控制台的打印结果,所料不差的话,id
表示带路径的文件名。
src
根据控制台的打印结果,src
表示文件内容。
code
结合id
和src
,以及官方示例,可以得到:code
表示处理后的内容。
写什么?
之前做海外项目的时候,项目组在多语言的获取方法内添加了一个敏感词的屏蔽逻辑。
海外项目的多语言获取方法是无处不在,使用频率极高的,这也意味着敏感词的屏蔽逻辑调取的非常频繁。
假如能在编译时屏蔽敏感词,就能节省出大量运行时的时间,从而提升用户体验。
export default function filterDangerPlugin() {
return {
name: 'filter-danger-plugin',
transform(src, id) {
if (/.json/.test(id)) {
return {
code: src.replace('六', '*')
}
}
}
}
}
这是一个简易版的插件,逻辑在于将json
文件中的六
替换为*
。
成果展示
结束语
突发奇想,写一个Vite
插件,复现以前写过的一个Webpack
插件,意外发现Vite
没有loader
的概念,一切皆plugin
。
谈及Webpack
,总是无法避免要回答loader
和plugin
的区别。
一本正经:loader
基于AST
实现文件类型转换,plugin
是loader
的补充。
心里话:不都是插件么?
之前光顾着研究Vite
为什么快了,整理了一番官方文档,不得不说Vite
追求开箱即用,以及抛弃loader
行为,非常值得称赞。
越来越喜欢Vite
了。
原文链接:https://juejin.cn/post/7353102996647706651 作者:木工师傅