Rollup摇树优化副作用处理求助:Logger.ts标记问题及方案咨询
Rollup摇树优化中Logger模块副作用问题的解决方案
核心问题分析
Rollup标记renderer/Logger.ts存在副作用,是因为模块顶层的Roarr.child()调用属于模块加载时执行的代码。Rollup默认会将这类顶层函数调用判定为有副作用,从而阻止合并依赖该模块的文件——因为它担心合并chunk会改变副作用的执行时机或次数。
无需移动logger.child()到组件内部
把logger.child()移到组件函数内部会导致每次组件渲染都创建新的Logger实例,这既浪费资源,也不符合Logger实例应该是组件级单例的设计预期,因此不建议这么做。
正确的解决方法:使用@__PURE__或@__NO_SIDE_EFFECTS__标记
方案1:给单个Roarr.child()调用加@__PURE__标记
@__PURE__的作用是告诉Rollup:该函数调用没有副作用(不会修改全局状态、不会产生不可预测的外部影响),只要返回值被引用就会保留调用。由于你的Logger和组件内的logger都被后续代码引用,Rollup不会移除这些调用,同时会解除副作用标记,允许chunk合并。
修改Logger.ts:
import { Roarr } from "roarr"; // 标记该调用无副作用,返回值被引用时会保留 export const Logger = /*@__PURE__*/ Roarr.child({ application: "contra-web-app" });
修改组件文件(如Button.tsx):
import { Logger } from './Logger.ts'; // 同样标记组件级的child调用 const logger = /*@__PURE__*/ Logger.child({/* 你的组件日志配置 */}); export default function Button() {}
方案2:给整个Logger模块加@__NO_SIDE_EFFECTS__标记
如果Logger.ts的唯一“副作用”就是创建顶层Logger实例,且该实例的创建不会影响全局状态,可以在模块顶部添加注释,告诉Rollup整个模块无副作用:
/*@__NO_SIDE_EFFECTS__*/ import { Roarr } from "roarr"; export const Logger = Roarr.child({ application: "contra-web-app" });
验证修改效果
- 重新执行Rollup打包,检查是否还存在
renderer/Logger.ts有副作用的提示 - 确认依赖该模块的文件被正常合并(符合
experimentalMinChunkSize配置) - 测试应用日志功能,确保Logger实例正常工作、日志输出符合预期
内容的提问来源于stack exchange,提问作者Gajus
相关产品推荐
相关产品推荐

