跳到主要内容

plugin-replace

2023年12月19日
柏拉文
越努力,越幸运

一、认识


plugin-replaceRollup 进行变量字符串的替换。思路为: transform 钩子也是非常常见的一个钩子函数,为 Async + Sequential 类型,也就是异步串行钩子,作用是对加载后的模块内容进行自定义的转换。

二、实现


import MagicString from 'magic-string';

export default function replace(options = {}) {
return {
name: 'replace',
transform(code, id) {
// 省略一些边界情况的处理
// 执行代码替换的逻辑,并生成最后的代码和 SourceMap
return executeReplacement(code, id);
},
renderChunk(code, chunk) {
const id = chunk.fileName;
// 省略一些边界情况的处理
// 拿到 chunk 的代码及文件名,执行替换逻辑
return executeReplacement(code, id);
},
}
}

function executeReplacement(code, id) {
const magicString = new MagicString(code);
// 通过 magicString.overwrite 方法实现字符串替换
if (!codeHasReplacements(code, id, magicString)) {
return null;
}

const result = { code: magicString.toString() };

if (isSourceMapEnabled()) {
result.map = magicString.generateMap({ hires: true });
}

// 返回一个带有 code 和 map 属性的对象
return result;
}

三、配置


// rollup.config.js
import replace from '@rollup/plugin-replace';

module.exports = {
input: 'src/index.js',
output: {
dir: 'output',
format: 'cjs'
},
plugins: [
// 将会把代码中所有的 __TEST__ 替换为 1
replace({
__TEST__: 1
})
]
};