为什么 react-router 在 vercel 上不起作用?
Why does react-router not works at vercel?
我正在尝试将无服务器网络发布到 Vercel。
我想使用 react-router,这在我的电脑上运行良好,但是当我部署它时它不起作用
有人可以帮助我吗?
(我想做无服务器)
// My main code
import React from 'react'
import { BrowserRouter, Switch, Route } from 'react-router-dom'
import Main from './routes/Main'
import Tos from './routes/Tos'
import Privacy from './routes/Privacy'
import NotFound from './routes/NotFound'
import Recruit from './routes/Recruit'
const App = () => {
return (
<BrowserRouter>
<Switch>
<Route exact path = '/' component = {Main} />
<Route exact path = '/recruit' component = {Recruit} />
<Route exact path = '/tos' component = {Tos} />
<Route exact path = '/privacy' component = {Privacy} />
<Route component = {NotFound} />
</Switch>
</BrowserRouter>
)
}
export default App
也许您需要服务器将所有请求重定向到 index.html。如果是 Apache 那么你可以使用 mod_rewrite 并且你需要这样的代码:
RewriteCond %{REQUEST_URI} !^/index\.html
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^/.*$ /index.html [L,PT]
听起来 Vercel 在错误的地方查找您的文件。检查 package.json
中的 "homepage"
字段;我发现它们很挑剔,有时使用 localhost
时有效的方法在 Vercel 部署中不起作用。如果您没有“主页”字段,请先添加
"name": "my-app",
"homepage": ".",
...
在 package.json
中。这通常对我有用,但如果不行,请尝试部署的实际 url,即 https://something.vercel.app
。对于某些设置,我不得不这样做。
如果仍然不起作用,请检查开发工具中的“网络”选项卡并找到您的请求,然后检查 url 它实际上在寻找资源。这可能会给你一些线索。
在项目的根目录添加一个vercel.json
文件,并使用“rewrites”重写所有传入路径以引用您的索引路径。
例如:
{
"rewrites": [
{"source": "/(.*)", "destination": "/"}
]
}
点击这里了解更多信息:https://vercel.com/docs/configuration#project/rewrites
指定每条路线
为了使 React Router 在 Vercel 中工作,我必须在 vercel.json
文件中指定每个路由,如 中所述。 (顺便说一句,我使用这个解决方案已经有一段时间了)
{
"routes": [
{ "src": "/", "dest": "/" },
{ "src": "/recruit", "dest": "/" }
{ "src": "/tos", "dest": "/" }
// ....
]
}
但这可能不是最佳选择,具体取决于您的应用程序有多少路由,老实说,有时我会忘记添加新路由。
Vercel 中的“全部匹配”正则表达式问题
我尝试了“匹配所有”正则表达式作为源路由 [{ "src": "/*", "dest": "/" }]
,就像我以前在其他托管服务中所做的那样,但由于某些原因,Vercel 服务器对所有请求都使用此路由,即使 [{ "src": "/*", "dest": "/" }]
=14=] 需要请求像 bundle.js
这样的文件,破坏了应用程序。
解决方案:匹配路由但忽略文件
我找到的解决方案是使用匹配所有路由的正则表达式,但包含点 (.) 的路由除外,这些路由通常是文件,例如 bundle.js
。然后你可以请求一个 url 像 /recruit
并且它被路由到 /
因为它没有点。
正则表达式是 /[^.]+
(在 Vercel 上变成 ^/[^.]+$
)。
Please note that this is a very simple Regex and may not cover all cases, however, I haven't got any issues with it to the moment of this comment.
所以我的 vercel.json
文件看起来像这样:
{
"routes": [{ "src": "/[^.]+", "dest": "/", "status": 200 }]
}
希望对你有用!
只需将此添加到您的 vercel.json,这会将您的所有路由路由到 index.html,js 文件
除外
{
"routes": [
{
"src": "/[^.]+",
"dest": "/"
}
]
}
在 Vercel 托管服务中,您可以通过 selecting 框架预设中的 create-react-app 来部署整个项目:
或者您可以在通过 运行 npm run build
和 select 构建项目后仅部署构建文件夹 其他作为框架预设:
注意
如果你将 react-router-dom 与 BrowserRouter 一起使用,你应该在项目文件夹或构建文件夹的根目录下有 vercel.json 文件:
{
"rewrites": [
{
"source": "/((?!api/.*).*)",
"destination": "/index.html"
}
]
}
此配置将防止您的 Web 应用程序在您刷新页面或打开其他路由时出现 404 错误。
希望对您有所帮助。
我正在使用 Create React App 和 react-scripts 构建项目,我遇到了类似的问题。问题是当我在 vercel 部署的站点上单击浏览器刷新时 sub-routes 内容没有加载,但在本地它工作正常。
例如。如果你直接去这个子路线它会失败
https://mysite/top/second
事实证明问题出在我的 package.json 我有 "homepage": "."
我只是通过更改它来修复它 "homepage": ""
(删除点)
react-scripts build
将读取 package.json
homepage
属性 并将 homepage
中的值附加到链接 js 和 css捆绑代码。
我正在尝试将无服务器网络发布到 Vercel。 我想使用 react-router,这在我的电脑上运行良好,但是当我部署它时它不起作用 有人可以帮助我吗?
(我想做无服务器)
// My main code
import React from 'react'
import { BrowserRouter, Switch, Route } from 'react-router-dom'
import Main from './routes/Main'
import Tos from './routes/Tos'
import Privacy from './routes/Privacy'
import NotFound from './routes/NotFound'
import Recruit from './routes/Recruit'
const App = () => {
return (
<BrowserRouter>
<Switch>
<Route exact path = '/' component = {Main} />
<Route exact path = '/recruit' component = {Recruit} />
<Route exact path = '/tos' component = {Tos} />
<Route exact path = '/privacy' component = {Privacy} />
<Route component = {NotFound} />
</Switch>
</BrowserRouter>
)
}
export default App
也许您需要服务器将所有请求重定向到 index.html。如果是 Apache 那么你可以使用 mod_rewrite 并且你需要这样的代码:
RewriteCond %{REQUEST_URI} !^/index\.html
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^/.*$ /index.html [L,PT]
听起来 Vercel 在错误的地方查找您的文件。检查 package.json
中的 "homepage"
字段;我发现它们很挑剔,有时使用 localhost
时有效的方法在 Vercel 部署中不起作用。如果您没有“主页”字段,请先添加
"name": "my-app",
"homepage": ".",
...
在 package.json
中。这通常对我有用,但如果不行,请尝试部署的实际 url,即 https://something.vercel.app
。对于某些设置,我不得不这样做。
如果仍然不起作用,请检查开发工具中的“网络”选项卡并找到您的请求,然后检查 url 它实际上在寻找资源。这可能会给你一些线索。
在项目的根目录添加一个vercel.json
文件,并使用“rewrites”重写所有传入路径以引用您的索引路径。
例如:
{
"rewrites": [
{"source": "/(.*)", "destination": "/"}
]
}
点击这里了解更多信息:https://vercel.com/docs/configuration#project/rewrites
指定每条路线
为了使 React Router 在 Vercel 中工作,我必须在 vercel.json
文件中指定每个路由,如
{
"routes": [
{ "src": "/", "dest": "/" },
{ "src": "/recruit", "dest": "/" }
{ "src": "/tos", "dest": "/" }
// ....
]
}
但这可能不是最佳选择,具体取决于您的应用程序有多少路由,老实说,有时我会忘记添加新路由。
Vercel 中的“全部匹配”正则表达式问题
我尝试了“匹配所有”正则表达式作为源路由 [{ "src": "/*", "dest": "/" }]
,就像我以前在其他托管服务中所做的那样,但由于某些原因,Vercel 服务器对所有请求都使用此路由,即使 [{ "src": "/*", "dest": "/" }]
=14=] 需要请求像 bundle.js
这样的文件,破坏了应用程序。
解决方案:匹配路由但忽略文件
我找到的解决方案是使用匹配所有路由的正则表达式,但包含点 (.) 的路由除外,这些路由通常是文件,例如 bundle.js
。然后你可以请求一个 url 像 /recruit
并且它被路由到 /
因为它没有点。
正则表达式是 /[^.]+
(在 Vercel 上变成 ^/[^.]+$
)。
Please note that this is a very simple Regex and may not cover all cases, however, I haven't got any issues with it to the moment of this comment.
所以我的 vercel.json
文件看起来像这样:
{
"routes": [{ "src": "/[^.]+", "dest": "/", "status": 200 }]
}
希望对你有用!
只需将此添加到您的 vercel.json,这会将您的所有路由路由到 index.html,js 文件
除外{
"routes": [
{
"src": "/[^.]+",
"dest": "/"
}
]
}
在 Vercel 托管服务中,您可以通过 selecting 框架预设中的 create-react-app 来部署整个项目:
或者您可以在通过 运行 npm run build
和 select 构建项目后仅部署构建文件夹 其他作为框架预设:
注意
如果你将 react-router-dom 与 BrowserRouter 一起使用,你应该在项目文件夹或构建文件夹的根目录下有 vercel.json 文件:
{
"rewrites": [
{
"source": "/((?!api/.*).*)",
"destination": "/index.html"
}
]
}
此配置将防止您的 Web 应用程序在您刷新页面或打开其他路由时出现 404 错误。
希望对您有所帮助。
我正在使用 Create React App 和 react-scripts 构建项目,我遇到了类似的问题。问题是当我在 vercel 部署的站点上单击浏览器刷新时 sub-routes 内容没有加载,但在本地它工作正常。
例如。如果你直接去这个子路线它会失败
https://mysite/top/second
事实证明问题出在我的 package.json 我有 "homepage": "."
我只是通过更改它来修复它 "homepage": ""
(删除点)
react-scripts build
将读取 package.json
homepage
属性 并将 homepage
中的值附加到链接 js 和 css捆绑代码。