Rollup 条件编译:如何实现排除文件内指定代码行而非整个文件?
Rollup 行级条件编译实现方案
完全可以实现你需要的仅剔除指定代码行的需求,目前有两种成熟的常用方案:
方案1:@rollup/plugin-replace + Terser 死代码剔除(最通用)
这个方案不需要特殊语法,依托Rollup官方插件和压缩工具的默认能力即可实现:
- 第一步:安装官方替换插件
@rollup/plugin-replace和压缩插件@rollup/plugin-terser - 第二步:在rollup配置中配置全局常量替换,示例配置如下:
import replace from '@rollup/plugin-replace'; import terser from '@rollup/plugin-terser'; export default { // 其他配置省略 plugins: [ replace({ // 打包时把所有 process.env.DEBUG 替换为你指定的布尔值 'process.env.DEBUG': JSON.stringify(process.env.NODE_ENV === 'development'), preventAssignment: true }), // 压缩插件默认开启死代码剔除能力 terser() ] }
- 第三步:业务代码中直接用常规if判断包裹条件代码块即可:
if (process.env.DEBUG) { // 仅调试模式保留的代码 console.log('调试信息') debugReport() } else { // 仅生产模式保留的代码 initErrorMonitor() }
打包时Terser会自动识别永远不会执行的代码块直接删除,最终产物里不会包含被剔除的代码行。
方案2:rollup-plugin-preprocess 预处理指令(类C#语法)
如果你更习惯C#风格的预处理指令语法,可以用这个第三方插件实现完全一致的写法:
- 第一步:安装插件
rollup-plugin-preprocess - 第二步:在rollup配置中配置预定义变量:
import preprocess from 'rollup-plugin-preprocess'; export default { // 其他配置省略 plugins: [ preprocess({ context: { _DEBUG: process.env.NODE_ENV === 'development' } }) ] }
- 第三步:业务代码中用注释包裹预处理块即可:
/* @ifdef _DEBUG */ console.log('调试信息') debugReport() /* @else */ initErrorMonitor() /* @endif */
打包时插件会直接根据你配置的变量值删除对应代码块,不需要依赖压缩工具,更灵活。
注意:两种方案都不会剔除整个文件,只会针对你标记的代码块做行级的增删,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者geometer
相关产品推荐
相关产品推荐

