You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"
});

验证修改效果

  1. 重新执行Rollup打包,检查是否还存在renderer/Logger.ts有副作用的提示
  2. 确认依赖该模块的文件被正常合并(符合experimentalMinChunkSize配置)
  3. 测试应用日志功能,确保Logger实例正常工作、日志输出符合预期

内容的提问来源于stack exchange,提问作者Gajus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 21:15:15