编译时宏
ReactLynx 的编译插件(@lynx-js/react-rsbuild-plugin,基于 @lynx-js/react-webpack-plugin)会在编译你的应用时替换一组编译时宏。每个宏都是一个全局标识符,编译期会被替换成一个常量。一旦变成常量,被取值为 false 的宏所守卫的分支会被作为死代码移除,因此它们不产生运行时开销,也不增加包体积:
@lynx-js/react 把每个宏都声明成了 TypeScript 全局变量,所以你可以直接用它们,不会报 Cannot find name '__DEV__'。
线程宏
ReactLynx 会把你的代码分别打包到主线程和后台线程两份产物中(参见 ReactLynx 编程思想)。这些宏标记一段代码属于哪个线程,好让另一个线程的产物把它删掉。
大多数时候你不用手写这两个宏。编译器会自动把事件处理器(bindtap 等)、Effect(useEffect 等)、ref,以及标了 'background only' 指令的代码当作后台专属,不会打进主线程产物:
真正需要手写的是另一种情况:一段在渲染期执行的代码(渲染会同时在两个线程上跑)要按线程访问不同的东西——比如某个值在后台线程是真正调用原生能力的实现、在主线程则换成空操作——这时用 __BACKGROUND__ / __MAIN_THREAD__ 显式分支,让每个线程的产物只保留对它有效的代码。built-in-macros 参考里有一个 __BACKGROUND__ 的完整例子;完整规则见 ReactLynx 编程思想。
模式宏
这些宏用来整体开关某一类开发期行为。它们在开发环境为 true、生产环境为 false,因此仅用于开发的代码不会被打进生产产物。
__DEV__
开发环境为 true,生产环境为 false(跟随构建模式 / NODE_ENV)。用它来包裹只在开发期需要的代码,比如 prop 校验、不变量断言、更友好的报错信息。if (__DEV__) { … } 里的内容在生产构建中都会被删掉。
__PROFILE__
开启性能插桩。开启后,运行时会用性能标记把关键阶段(hydration、渲染、生命周期事件)包起来,这些标记会出现在 Lynx 的 trace 里。参见 性能分析 和 运行时性能分析。开发环境默认开启,方便你本地分析;生产环境默认关闭,避免额外开销。开发环境可以用 REACT_PROFILE=false 关掉,也可以用插件的 profile 选项强制开启。
__REACT_DEVTOOL__
开启 Preact DevTools 需要的运行时钩子(比如 snapshot 到 element 的映射)。开发环境默认开启。如果想在生产构建里用 Preact DevTools,设置 REACT_DEVTOOL=true,它同时会保留你引入的 @lynx-js/preact-devtools,不让它被裁掉。
日志宏
ALog 是 Lynx 的原生日志通道。通过它打出来的日志会进入平台的原生日志,即使在 console.log 看不到的环境也能看到。下面两个宏默认都关着,因为输出很啰嗦;需要时自己设置环境变量打开。
__ALOG__
开启后,运行时会在两个线程上打出详细的 [ReactLynxDebug] 诊断日志,方便你追踪框架在做什么。用 REACT_ALOG=true 开启。
__ALOG_ELEMENT_API__
更细一层:它会记录每一次 Element PAPI 调用,也就是框架在主线程上执行的底层 create / append / update 操作,让你看清元素树到底是怎么搭起来的。输出非常多。用 REACT_ALOG_ELEMENT_API=true 开启。
插件选项宏
这些宏来自 ReactLynx 的插件选项,而不是环境变量,大多是框架内部使用:
环境变量
有几个宏由构建时读取的环境变量决定: