一个叫 Octane 的新框架上线了,自称是十年前 Inferno 的继任者,给自己贴的标签是"React 编程模型的编译版"。承诺很直白:不用手写依赖数组,不用管 hooks 规则,不用虚拟 DOM,但写法还是你熟悉的那套 hooks、Suspense、actions。
这类"比 React 快"的项目,过去十年出现过不止一个。Octane 有意思的地方不在于又多了一个,而在于它选的赛道,恰好和 Meta 自己正在做的事撞了车。
Octane 到底做了什么
用一句话说清楚:新增 .tsrx 文件后缀,组件写法和 React 几乎一样,但编译器会在编译期分析代码里用到了哪些变量,自动推断 useEffect、useMemo 该依赖谁——不用你手写依赖数组,hooks 也可以放在条件语句里、放在提前 return 之后,不再受"hooks 规则"约束。
不用虚拟 DOM,模板直接编译成克隆节点和 DOM 写操作。官网给出的数字是 11,500+ 次测试执行(核心套件 3,900+ 独立用例)、53 个第一方生态绑定,还给 React Three Fiber 出了个技术预览版 @octanejs/three。
迁移路径上,OctaneCompat 能把编译好的 Octane 组件当岛屿,塞进现有 React 19 应用里逐个替换,SSR 和 hydration 都能用,唯一不支持的是 React Server Components。
真正的对手不是虚拟 DOM,是 Meta 自己
官网把自己摆在 Solid、Svelte 这批 signals 框架旁边比性能,但这个框架真正在解决的问题——干掉手写依赖数组、干掉 hooks 规则——Meta 官方的 React Compiler(原 React Forget)已经在做,而且不需要你换文件后缀、换语法。
两条路径本质是同一道题的两种解法:一个让编译器直接读懂你现有的 .tsx,代价是不动虚拟 DOM,提速空间有限;一个另起一套 .tsrx 语法,让编译器连 DOM 编译一起管,代价是新语法带来的迁移成本和生态断层。这才是 Octane 该被拿来对照的对象。
跑分好看,但裁判是自己
官网基准页给出的 geomean 数字里,Octane 作为 1× 基准,React 19 慢 2.9 倍,Preact 10 慢 2.7 倍,Svelte 5 慢 1.3 倍,Solid 2.0 beta 慢 1.1 倍,Vue Vapor 3.6 beta 反而更快(0.86×)。
数字本身没毛病,问题是出题、裁判、发榜是同一个项目。11,500+ 测试执行、53 个绑定、"Inferno 继任者"这层血缘,目前都只在官网文案和自家仓库里,还没有独立跑分机构、非关联开发者或知名生产项目做过交叉验证。
十年前的 Inferno 同样打着"比 React 快"的旗号出道,声量不小,后来慢慢没了动静。Octane 会不会重走一遍,现在下结论太早,但至少说明"自称快"和"公认快"之间,历来隔着一段没人愿意先迈的路。
自证的跑分从不撒谎,但也从不替你验真伪。
编译期的错误,不报错,只降级
Octane 自己承认一个特性:因为提前编译,配置错误往往不报错,只是悄悄变慢或部分失效。同一棵组件树里混进两份 Octane 运行时,hooks 和 context 状态会因为按运行时实例分 key 而悄悄错乱;直接用 tsc 编译 .tsrx 文件,或者写了个 declare module '*.tsrx' 兜底声明,类型检查形同虚设——代码照样能跑,类型全变成 any。
为此项目配了个 octane doctor,给出 20 项检查外加一键修复。这是编译期框架特有的风险:运行时框架崩了会立刻报错,你能马上发现;编译期框架配错了,应用往往还能跑,只是悄悄变慢或者悄悄不安全。
- 风险.配置错误不报错而是性能或类型悄然降级,生产环境很难第一时间察觉
谁该现在跟,谁该再等等
如果团队已经被依赖数组和 hooks 规则折腾够了,又不想大改心智模型,Octane 和 React Compiler 是两条平行选项,值得同时列进候选名单里比一比迁移成本。
如果纠结的是"敢不敢现在就上生产",维护者是谁、独立跑分有没有人复现、有没有叫得上号的项目已经在用——这三件事目前都没有答案。答案出来之前,观望比冒进划算。
