【问题标题】:Is there a way to run a Next.js site with webpack (or `next dev`) without using node?有没有办法在不使用节点的情况下使用 webpack(或`next dev`)运行 Next.js 站点?
【发布时间】:2021-10-16 07:54:10
【问题描述】:

问题

为了澄清这个问题,如果我运行next dev,我有这个代码:

window.localStorage.getItem('myCat')

我会收到如下错误:

ReferenceError: window is not defined

我想运行 一些 种实时重新加载的开发环境。

在 prod 中解决,但在 dev 中没有解决

this problem 的可行生产解决方案是:

  1. 避免getStaticProps/getStaticPaths
  2. next build && next export
  3. 使用nginx重写规则将/some/route重写为->/some/[dynamic].html
  4. Next.js 为我们处理剩下的事情,即使我们完全静态地为网站提供服务(动态路由 @ 运行时,耶!)

总结

这个问题只是该问题的开发版本:我们如何才能获得实时重新加载 + 静态 Next.js 站点?我知道这并没有得到官方的支持......但是自从我们让它在 prod 中工作后,我认为具有更多 webpack 知识的人可能能够在这里为我指明正确的方向。

我尝试过的

我想我可以结合使用这些工具:

【问题讨论】:

  • 问题只是关于获取本地存储的访问权限吗?如果是这样,它应该在没有窗口的情况下工作,只需使用 localStorage.getItem() 等。
  • 不,如果令人困惑,抱歉,这是关于在 dev 中运行仅前端的静态 Next.js 站点

标签: javascript webpack next.js


【解决方案1】:

Next.js 在服务器上运行,所以它需要节点。

它在服务器上预渲染页面。当您尝试在服务器上运行的代码中访问window API 时,您会收到错误消息。

解决方案是仅在客户端运行客户端代码。你可以使用 React 的 useEffect 钩子。或者(作为一种快速解决方法)只需检查 window 是否已定义。

如果这段代码应该渲染,你可以在服务器上渲染 null 或一些占位符,在客户端渲染实际内容。

这是一篇很好的文章:https://www.joshwcomeau.com/react/the-perils-of-rehydration/

【讨论】:

  • 我知道这不是官方支持的,但我们让它在产品中工作!所以我希望 webpack 向导可能对如何实时重新加载仅客户端版本有一些答案。我们能够在构建时使用 webpack-strip-blocks 解决一些问题,但希望我们不必用这些来装饰整个代码库(我们只是使用它们来删除仅 SSR 的 fns)。
猜你喜欢
  • 2021-10-01
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
  • 2022-07-13
  • 2017-11-08
  • 2017-11-28
相关资源
最近更新 更多