【问题标题】:React Router doesn't render components after build to ftp serverReact Router 在构建到 ftp 服务器后不渲染组件
【发布时间】:2020-10-16 13:03:19
【问题描述】:

我使用yarn build 构建了 React 应用程序。 为了让应用程序在我的服务器上运行,我在 package.json 文件中添加了 "homepage": "./"。 该应用程序存储在服务器上的一个文件夹中,我使用https://my-url.com/appname访问该应用程序

App.js 得到渲染,但我没有看到我的组件:

function App() {
  const [navigationState, setNavigationState] = useState(false);

  return (
    <div className="App">
      <Router>
        <Header
          showNavigation={navigationState}
          setShowNavigation={setNavigationState}
        />
        <Switch>
          <Route path="/" exact component={Home} />
          <Route path="/contact" exact component={Contact} />
        </Switch>
        <Footer />
      </Router>
      <div className="space"></div>
    </div>
  );
}

Header 组件中,我有类似的链接

<Link to="/">Home</Link>
<Link to ="/contact">Contact</Link>

当我点击Home 时,URL 切换到https://my-url.com/,我看到了 Home 组件。 点击Contact 后,URL 切换到https://my-url.com/contact,我看到了联系人。

我的 .htaccess 看起来像:

<IfModule mod_rewrite.c>

  RewriteEngine On
  RewriteBase /
  RewriteRule ^index\.html$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-l
  RewriteRule . /index.html [L]

</IfModule>

我需要做些什么来保留文件夹路径并在第一次调用时呈现主组件?

点击主页链接后,我得到 -https://my-url.com/ 显示 home 组件 之后点击联系链接,我得到 https://my-url.com/contact显示联系人组件

在两个网址上重新加载页面会得到404

这是我的package.json

{
  "name": "appname",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@testing-library/jest-dom": "^4.2.4",
    "@testing-library/react": "^9.3.2",
    "@testing-library/user-event": "^7.1.2",
    "react": "^16.13.1",
    "react-dom": "^16.13.1",
    "react-scripts": "3.4.3"
  },
  "scripts": {
    "start": "BROWSER=firefox PORT=2000 react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": "react-app"
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  },
  "homepage": "./"
}

【问题讨论】:

  • 导航到https://my-url.com/contact 时是否收到404
  • 是的,我收到了 404
  • 所以,您说您可以通过my-url.com/appname 访问您的应用程序,对吧?那么,my-url.com/appname/contact 会起作用吗?
  • 不,我也得到 404。 my-url.com/contact 是单击主页链接一次后的 URL。它显示组件。但是直接访问那个 URL 是行不通的
  • 我更新了网址,使其更加具体。

标签: javascript reactjs react-router-dom


【解决方案1】:

我在之前的项目中遇到过这个问题,因为它是带有 apache 的 GoDaddy Linux 主机,所以我添加了这一行

“主页”:“my-url.com” 到你的 package.json

然后我编辑了我的 .htaccess 文件,并在上面添加了我的主要路线

我使用的文件有这个内容

RewriteOptions inherit
RewriteEngine On
  RewriteBase /
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-l
  RewriteRule . / [L]

【讨论】:

  • 添加"homepage": "my-url.com" 根本不起作用。添加"homepage": "my-url.com/appname/"./ 完全相同。也许编辑.htaccess 是诀窍。你在那里做了什么?
  • 这是我使用的文件RewriteOptions inherit RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-l RewriteRule . / [L]
  • 不幸的是,这没有帮助
【解决方案2】:

我认为这可能与 react-router 处理客户端或服务器端渲染 (SSR) 渲染的方式有关。 请检查此文档片段以正确设置客户端 https://create-react-app.dev/docs/deployment/#serving-apps-with-client-side-routing

或者尝试将渲染的配置更改为SSR,应该可以的。

【讨论】:

    【解决方案3】:

    为了让它工作,我做了以下步骤:

    • .htaccess文件添加到public文件夹:
    Options -MultiViews
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.html [QSA,L]
    
    • 修改package.json并添加:
    "homepage": "http://my-url.com/foldername"
    
    • App.js 中将文件夹名称添加到&lt;Route path="&lt;&lt;here&gt;&gt;" /&gt;
    <Route path="/foldername/" exact component={Home} />
    <Route path="/foldername/contact" exact component={Contact} />
    

    【讨论】:

    • 嗨@T.Karter 你这里的文件夹名称是什么意思?特定组件所在的位置或其他东西?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    相关资源
    最近更新 更多