modern.js
modern.js copied to clipboard
SSG 文档小错误 —— 页面结果不会发生变化
链接: https://modernjs.dev/docs/guides/features/server-side/web/ssg#%E8%8E%B7%E5%8F%96%E6%95%B0%E6%8D%AE
文档写道:
执行 pnpm run dev,重复刷新页面,可以看到 /foo 页面的渲染结果不断发生变化,说明数据是在请求时获取的。
SSG 的原理应该是在构建的时候生成数据,刷新页面的时候结果是不会发生变化的,随机数是固定的。我测试了文档所给的例子,发现确实随机数在 build 的那一刻已经被生成好了:
dist/html/main/index.html:
...
</script>
<script>window._SSR_DATA = {"data":{"loadersData":{"\"foo\"":{"loading":false,"reloading":false,"data":{"message":0.19314048999421352},"error":null}},"storeState":{}},"context":{"request":{"params":{},"query":{},"pathname":"\u002F","headers":{"host":"localhost:8080"}}},"renderLevel":2}</script>
</body></html>
Next.js 的页面如果用 getStaticProps 的话,一次 dev (不修改源码触发重新 compile 的情况下)永远只会被执行一次,getServerSideProps 会在页面刷新的时候每次都做新的请求,重新执行一次。
另外有一个疑似 Bug 就是在 dev 模式下 useLoader 返回的数据是 undefined,这会导致 dev 和 build 的不一致,dev 页面拿不到数据:

Next.js 的 getStaticProps 在 dev 模式下应该也是会得到对应的 props 的。
目前在浏览器端渲染的时候,的确不会执行 static 的 useLoader。在文档中其实有提到,本地开发阶段时,可以打开 SSR 来完成 SSG 的调试。。另外 SSG 和 SSR 的混合渲染也正在调研中