虽然喜欢不喜欢 next.js 是个人观点,其次楼上的各种说法其实都有些事实错误。
首先你只需要在顶层的组件中开启 use client ,所有子组件也会判断为 client side component 。你们遇到这个问题绝对是每次创建新 page.tsx 的时候没有写 use client ,当然你也可以说“在每个文件”……
其次我个人觉得“选择任何 UI 框架,Astro 给你自动做静态渲染”这个看起来很牛逼的 propaganda 实际上会出很明显的 edge case ,你无法保证所有你写的组件或者你用的依赖都是面向静态的,我认为这会造成很多未预料的事情……当然写博客这种写一次用一辈子的项目可能并不需要考虑这些事情,但我觉得这个事情本身和 Next.js 默认 server side 本质上没有任何区别。
混合框架会很明显的导致整个客户端包体积显著上升,当然你全写的是静态那是另说,但另外我觉得如果一个项目能混用这么多 web 框架,那这个项目本身其实就有点炫技的成分在里面,哪有真产品一下子什么框架都有。
不过 选择性水合( partial hydration )这个事情我倒是很赞同,我目前在一个 react framework 里面也推进了这个特性,不过我觉得群岛概念这个属于新瓶装旧酒,没什么新奇的,你只不过是本来多套一层组件变成了 props 里的保留关键字。
另外我仔细阅读这个文档的时候发现了一个逻辑错误,
https://docs.astro.build/zh-cn/guides/server-islands/#%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%BE%A4%E5%B2%9B%E7%BB%84%E4%BB%B6 这里头像回退 GenericAvatar 的 slot fallback 虽然没有写放在哪里,但是我假定是 Avatar 的一个 children ,但是问题来了,如果做到不运行 Avatar 里面的请求代码的同时把 GenericAvatar 插进去。