请教一个 React SSR 和自定义元素互操作的问题

2023-12-07 14:17:41 +08:00
 594mantou

背景:我将自定义元素导出成了 React 组件,让 React 项目轻松使用自定义元素。

但问题是,如果使用 SSR ,React 在进行水合时并不会为自定义元素设置 Properties ,这导致自定义元素不能正常工作,例如: https://nextjs-learn-phi-henna.vercel.app/ce-test

点击 “← Back to home” 回到首页再点击 “Custom Element Test” 回到这个页面时,自定义元素正常工作了,因为这时候使用了客户端渲染。

我尝试在 hydrateInstance 中添加 setInitialProperties 可以解决这个问题:

function hydrateInstance(instance, type, props, hostContext, internalInstanceHandle, shouldWarnDev) {
  ...

  // 水合时立即为自定义元素设置 properties
  if (isCustomElement(type)) {
    setInitialProperties(instance, type, props);
  }
}

这是适合的解决方案吗(我没有通篇阅读 React 源代码)?如果可以的话我应该去哪个 React 社区提这个建议,因为我使用的是 react@experimental,并不是 React 正式版。

865 次点击
所在节点    React
7 条回复
594mantou
2023-12-07 14:20:49 +08:00
theprimone
364 天前
之前我有想法尝试 custom element ,但是想想会不会 SSR 问题不小,所以 OP 解决 SSR 问题了吗?
594mantou
359 天前
@theprimone 没有,在等 React 更新 19 。另外,我生成 React 组件的时候添加了一些代码解决了水合的问题。

https://duoyun-ui.gemjs.org/zh/guide/integrate#react

在 SSR 项目中使用自定义元素应该也是可以的,基本布局都是 div ,只有一些按钮、弹窗之类的组件不会破坏布局。

依赖 `:defined` 伪类也能保证不会破坏页面

如果整个页面都是自定义元素(有 ShadowDOM ),还想要 SSR 的话只能依赖声明式 ShadowDOM 自己做了,市面上应该有预渲染之类的方案,用 jsdom 模拟生成 ShadowDOM 理论上也行。
594mantou
359 天前
theprimone
359 天前
@594mantou #3 那我怎么有个印象好像很早的 React 文档就在说 custom element 的问题了,意思是以前一直都只是支持客户端渲染而已吗 😂
594mantou
357 天前
594mantou
335 天前
@0.0.0-experimental-feed8f3f9-20240118 似乎修复了。

所以真要等 19 正式发布。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/998353

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX