服务端渲染
哪些东西不需要 DOM 就能渲染,以及角色怎样在任何 JavaScript 之前就进入 HTML。
两个入口
静态入口故意排除了动画运行时。它导出的任何东西都不碰 window、document 或 requestAnimationFrame,所以可以在 React Server Component、静态生成或 worker 里使用。
Next.js App Router
组件包带有 'use client' 标记,从服务端组件导入是安全的——边界已经声明过了。
在根 layout 里引入一次样式表:
能用静态入口就用静态入口
长列表、邮件或元数据里的角色不需要动画。使用静态入口可以把动画运行时完全排除在客户端包之外。
服务端渲染产出什么
组件渲染的是未施加动画的标记。角色以静止姿态出现,水合后引擎接管。因此没有布局偏移:服务端 SVG 占据的盒子,就是动画角色将要占据的盒子。
<svg xmlns="http://www.w3.org/2000/svg" class="aga2w6z" viewBox="-24 -24 277 277" fill="none" aria-hidden="true"><style>
.aga2w6z { --aga2w6z-ink: #28B06C; }
@media (prefers-color-scheme: dark) {
.aga2w6z { --aga2w6z-ink: #25A263; }
}
</style>
<g transform="translate(114.5 114.5) scale(1) translate(-114.5 -114.5)">
<path d="M114.5 9.678C116.086 9.678 117.671 9.682 119.257…深浅色墨水
静态 SVG 在 CSS 上是独立文档,读不到应用的主题 class。所以 renderStaticSvg 会把调色板墨水的浅色值和深色值都写进去,由 colorScheme 决定用什么来切换:
system 跟随操作系统,这正是隔离的图像能看到的东西。把它内联进读者可以切换主题的页面时,它会跟着系统而不是页面:系统是深色、站点是浅色,黑色墨水就会在浅色卡片上变成近白色。page 与你其余的 UI 一样跟随 color-scheme。默认输出不变。两种模式使用不同的类名,可以出现在同一个文档里。
Data URL
renderStaticSvgDataUrl 用百分号编码而不是 base64。输出更小,在开发者工具里也仍然可读。它替你处理的一个细节:SVG data URL 里的裸 # 会把它截成片段——这是内联 SVG 静默坏掉的经典原因。