【问题标题】:ReactDOM not rendering anything from separate js fileReactDOM 没有从单独的 js 文件中渲染任何东西
【发布时间】:2019-11-30 21:18:37
【问题描述】:

我使用“npx create-react-app testreact”来创建一个反应项目。在我的电脑上通过浏览器进行测试时,服务器返回一个空白页面,而不是预期的单词——“Learn React”。

这里发生了什么?如何解决?

命令顺序

  1. npx create-react-app testreact
  2. npm 安装
  3. npm 开始

环境信息
nodejs:v13.2.0
npm:6.13.1
系统:18.04.1-Ubuntu
反向代理服务器:nginx

代码信息
回购:https://github.com/nautilusshell/testreact.git
有一个名为node_modules的文件夹是由“npm install”创建的,我没有放入上面的repo,因为它太大了,不需要上传。

顺便说一句,其实我什么都没做

错误信息
访问http://52.130.83.55/image_editing
从浏览器我得到:

status等于404的.js文件都位于http://52.130.83.55/static/js/xxx.js。这条路径是由我的 chrome 浏览器告诉的,但我通过命令搜索了我的服务器 find / -name "0.chunk.js" 2>/dev/null才发现没有这样的文件

例如,http://52.130.83.55/static/js/0.chunk.js 在我的服务器上的任何地方都找不到。

Nginx 配置
回购:https://github.com/nautilusshell/nginx_config.git

【问题讨论】:

  • 你能检查一下你的网络标签吗?浏览器是否正确下载了 index.js 文件?
  • @ChaimFriedman 不,它会提示一些错误
  • 请发布任何错误。更好的是,发布一个 repo(如果您更改了标准 CRA 设置的任何内容,否则,没有必要)并提供您的 ngnix 配置。
  • 请将node.js 降级为^10.16.3 nvmnpm 最新版本没问题。
  • 史蒂夫,你确定失败的 URL 是 /static/* 而不是 /public/

标签: node.js reactjs nginx


【解决方案1】:

你的 nginx 配置有以下块:

location /image_editing {
   proxy_set_header Host $host;
   proxy_set_header  x-forwarded-for $remote_addr;
   proxy_set_header  X-Real-IP       $remote_addr;
   client_max_body_size 1000M;
   proxy_pass http://image_editing;
} 

这个块大概指向任何访问[hostname]/image_editing 的人都会显示你的 React 应用程序,但它不会重写路径。这意味着如果你访问localhost/image_editing,在浏览器中路径仍然是/image_editing

任何指向资产的路径,例如 CRA 默认使用的 /static/js/bundle.js(注意前导斜杠),都不会转到 Create React App 托管的网络服务器,而是会访问 Nginx 本身。您没有配置将向/static 的请求转发到与/image_editing 相同的服务器,因此所有这些请求都会失败。

换句话说,当您访问 yourdomain/image_editing 时,您的 React 应用程序的 index.html 会被发回,声明所有资产都位于 http://yourdomain/static。这个请求命中 Nginx 并且 Nginx 正确地服务于 404,因为它不知道这些资产。您需要配置您的 React 应用程序,使其“认为”资产实际上位于 http://yourdomain/image_editing/static/

要解决这个问题,你需要修改你项目的 webpack 配置的publicPath 属性。不幸的是,这将需要使用npm eject弹出您的 Create React App 配置。

您也可以使用子域在 Nginx 端解决此问题。例如,您可以在 image-editing.yourdomain.com 托管您的图像编辑应用程序,并且所有带有前导斜杠的 URL 都会正确解析。

【讨论】:

  • 能否请您详细介绍一下:1.如何通过npm方法解决? 2. 怎么用nginx的方法解决?我是 nodejs 和 react 的新手,在这个问题上花了很多时间。也许我需要有关如何执行此操作的详细步骤。当然,您的回答让我对这个问题有了很大的了解。
  • 您可以通过 npm 在控制台中输入 npm eject 来解决它。这会阻止你升级到 react-scripts 的未来版本,但你会完全控制你的 webpack 配置。从那里开始,这是一个相当简单的变化:webpack.js.org/guides/public-path
  • 使用 Nginx,你有两个选择。您可以使用新的location 块将所有请求转发到/statichttp://image_editing。您可以复制并粘贴此答案中的位置块并将location /image_editing 替换为location /static,它应该可以工作。但是,这会阻止您在此 nginx 配置中托管的任何其他应用程序使用 /static 路径。
  • 您的另一个选择是将您的图像编辑应用程序托管在子域上。这将要求您更改 DNS 服务器并在 nginx 中使用 server 块。您可以找到有关 here 的更多信息,尽管此解决方案比其他两个解决方案需要更多的 Nginx 知识。
  • 现在最简单的解决方案是在 nginx 中采用 location block 方法,只是为了让事情正常工作,但是您将来需要看看 subdomain 方法或 npm 弹出方法因为将所有/static 请求重定向到您的图像编辑反应应用程序可能会在以后导致难以诊断的问题。
猜你喜欢
  • 2017-01-22
  • 2014-06-01
  • 1970-01-01
  • 2015-06-29
  • 2017-10-08
  • 1970-01-01
  • 2016-12-10
  • 2012-12-17
  • 2019-01-04
相关资源
最近更新 更多