为什么我的客户端代码在节点后端被编译和运行?

Why is my client side code being compiled and ran on node backend?

我是 SSR 的新手,所以我不确定这个问题和我的解决方案是否是标准做法,但我无法想象。

我的目标是拥有一个允许用户 add/remove 页面上的项目的动态页面。我最初编写此组件的目的是将其仅用作客户端反应项目,但现在我想将其放在服务器上。现在,当我 运行 将我的代码添加到新项目时,我 运行 遇到了一些与我的后端有关的错误 运行在客户端成为 运行。

例如,我 运行 之前 遇到过这个问题,我能够使用 Janky 解决方案解决这个问题,我确保它正在传递客户端代码并停止执行从后端传递的代码。现在我不得不重构我的代码以不使用 fetch() 函数,因为它不是节点后端识别的函数,它现在抱怨我使用 document 对象,因为这不是节点。

我可以继续导入新模块来修复错误以防止我的网站崩溃,但我感觉我就像在一艘小船上用胶带修补新的漏洞,等待找到下一个漏洞。

如果需要的话,这是我的配置图片我在之前的堆栈溢出问题中也有其他图片(link 以上)

对于 bundle.js 问题,我不确定为什么会发生。

对于fetch的问题,我认为这是SSR的一个常见问题,如果你自己实现它,你需要在你的应用程序的不同地方处理条件:

if(!!window) {
  // do client-side stuff like accessing
  // window.document
}

基本上,SSR 最常见的用法是在服务器端处理应用程序的首次执行。这包括:

  • 路线解析
  • 正在获取数据(使用 nodejs http 模块)
  • Hydrating stores(如果你使用 redux 或其他数据库)
  • 渲染UI

执行完成后,您的服务器 returns 带有水化存储的捆绑 js 应用程序和 UI 以及 returns 到客户端。后续的请求或者路由更新都会在客户端执行,所以可以直接使用fetch或者react-router


做SSR的优点是:

  • 很棒的第一个内容
  • 非常适合 SEO
  • 客户端机器做更少的工作

有很多库可以帮助您处理 SSR 以及 nextjs, use-http

等框架