插件过滤与性能优化
插件性能优化需要精确过滤处理范围和合理使用缓存。
createFilter 过滤文件
JavaScript
import { createFilter } from '@rollup/pluginutils'
export default function myPlugin(options = {}) {
const filter = createFilter(
// include: 包含的文件
options.include || ['src/**/*.js'],
// exclude: 排除的文件
options.exclude || ['node_modules/**']
)
return {
name: 'my-plugin',
transform(code, id) {
// 只处理匹配的文件
if (!filter(id)) return null
return transformCode(code)
}
}
}
缓存转换结果
JavaScript
export default function cachePlugin() {
const cache = new Map()
return {
name: 'cache-plugin',
transform(code, id) {
// 检查缓存
const cached = cache.get(id)
if (cached && cached.code === code) {
return cached.result
}
// 执行转换
const result = transformCode(code)
cache.set(id, { code, result })
return result
}
}
}
持久化缓存
JavaScript
import fs from 'fs'
export default function persistentCachePlugin() {
const cacheFile = '.plugin-cache.json'
let cache = {}
// 加载缓存
if (fs.existsSync(cacheFile)) {
cache = JSON.parse(fs.readFileSync(cacheFile, 'utf-8'))
}
return {
name: 'persistent-cache',
buildEnd() {
// 保存缓存
fs.writeFileSync(cacheFile, JSON.stringify(cache))
},
transform(code, id) {
const hash = hashCode(code)
const cached = cache[id]
if (cached?.hash === hash) {
return cached.result
}
const result = transformCode(code)
cache[id] = { hash, result }
return result
}
}
}
注意:持久化缓存避免每次构建重新处理相同文件。
异步处理
JavaScript
export default function asyncPlugin() {
return {
name: 'async-plugin',
async transform(code, id) {
// 异步处理
const result = await asyncTransform(code)
return result
}
}
}
并行处理
JavaScript
export default function parallelPlugin() {
return {
name: 'parallel-plugin',
transform(code, id) {
// 避免阻塞主线程
return new Promise((resolve) => {
setImmediate(() => {
resolve(transformCode(code))
})
})
}
}
}
性能优化策略
| 策略 | 效果 | |
|---|---|---|
| createFilter | 减少不必要处理 | |
| 内存缓存 | 避免重复处理 | |
| 持久化缓存 | 加速二次构建 | |
| 异步处理 | 不阻塞主线程 |
要点总结
- createFilter 精确控制处理范围
- 缓存避免重复处理相同文件
- 持久化缓存加速二次构建
- 异步处理不阻塞主线程
📝 发现内容有误?点击此处直接编辑