时间线: 5 月 23 日,Remix.js 发布了 React Router v6.4.0-pre.2(https://github.com/remix-run/react-router/releases/tag/v6.4.0-pre.2)。 5 月 24 日,Next.js 发布了 Layouts RFC(https://nextjs.org/blog/layouts-rfc)。
5 月 24 日早上,Remix 作者 Ryan Florence 在其 Twitter 上怒斥 Next.js,称其在没有打招呼也没有致谢声明的情况下,在最新发布的 Layouts RFC 里面抄袭了 Remix 的功能。Remix 团队对于此事的态度是:“Remix 觉得无所谓,我们的目光专注在帮助 React Router SPA 从服务器处受益。至于 Next.js 会不会逐渐变成 Remix,这对我们来说无关紧要。我只是认为,他们(Next 团队)可以承认我们取得的共同进步。”
并且,他还炮轰了现在的 React 团队:“我说真的,现在 React 真的有多开放?在我看来,它就应该被转移到一个基金会。”
与此同时,Next.js 官宣 Layouts RFC 发布的推文下面,也同样有人提出质疑——这完全就是 Remix!Next.js 把路由文件夹的名字命名为 app,就是在欲盖弥彰。
Alex @agctyz: lmao this is literally @remix_run , even calling the new routes folder "app"
Remix 与 Next.js 互为竞争对手,较劲已久。数月前,Remix 作者 Ryan Florence 还曾发布一篇题为《Remix vs Next.js》的文章,他在文中称,Remix 是要胜过 Next.js 的。因此,这两个框架前后脚发布新版本并不稀奇,但出乎意料之外的是,此次更新,竟然引发了一场“抄袭风波”。
文章地址:
Ryan Florence 发文中提到的“沙皇”,正是去年刚从 Meta 离职加入 Vercel 的 Sebastian Markbåge,他也是被外界熟知的 React 团队的灵魂人物。
对于本次事件,Sebastian Markbåge 回应称,Layouts RFC 的原型并不是 Remix,甚至它的第一个原型是在 Remix 可用之前开始的。它的灵感更多地来自于带有 React Router 的传统服务器路由技术(比如 FB),这一点和 Next.js 有些不谋而合,“因此,在这种情况下,我认为这更多的是一种趋同进化。”
Sebastian Markbåge 列出了一系列证据(详见:https://twitter.com/sebmarkbage/status/1528864452522971136),大致意思为:原来每次导航都要从根组件开始做树形遍历更新,后来他想做成只针对更改的数据做局部更新,加上其他一些必要的但当时还缺失的功能。最开始原型是由 React.js 核心开发 Dan Abramov 和他一起制作的。而当他加入 Next.js 团队之后,则与 Tim Neutkens、Delba Oliveira、Lee Robinson、@shuding_、@huozhi 等人一起合作,对 RSC 做了一些修正和迭代,最后才在 Next.js 里面支持了 RSC。
但有吃瓜网友反驳称,并没有看见 Next.js 在致谢声明里提到 React router。
随后,Vercel 的开发者关系负责人 Lee Robinson 发文表示,已经更新了 RFC,感谢 Relay、React Router、Ember、SvelteKit 以及 @cassidoo 给早期的 Layout RFC 带来的启发。
在双方对阵的间隙,吃瓜网友纷纷现身,部分热评如下。
jaykay.eth@jkcorrea_:相反,Next.js 过于臃肿,你只能在 Next.js 中找到一堆概念。在加上“受 Remix 激发”的 API 之前,他们需要进一步扩展。但即便如此,他们也会让大量想要 SSG/ISR 的用户感到不安(Remix 就不存在这个困扰)。说了这么多,对 Vercel 来说这确实有点烦人,但请继续关注 Remix 的独特之处,最终功劳将归于它应去之处。
Andy Ingram @andrewingram:第一部分并不完全正确。你总是能够对回应做任何你想做的事情,他们只是从来没有大声疾呼,这是一种耻辱。但多年来(至少 3 年)我一直在用 Next 做状态码甚至缓存 Header。
Christian de Botton @cdebotton:在 Remix 之前,Sapper 就支持了嵌套路由,你可能也有类似的实现,但是你能说一下你又在哪里致谢了它(毕竟它为你铺平了道路)吗?此外,在 React 还没有出现之前,我就在 Ember 中编写了显示子路由内容的组件。
其中,一位名为 Antonio Sarcevic 的开发者吸引了我们的注意。他认为,谁做得早不重要,谁做得好才重要。
事实上,概念和思路的雷同,很难被判定为抄袭,除非代码一模一样。那么,对于此事,你是怎么看的?
最后,感谢郝稼力、赵洋老师对本文的贡献。