我正在开发我的第一个 NextJS 应用程序。当我运行“npm run dev”或“npm run start”时,它会将我的应用程序部署到
http://host:port/
当我导航到一个页面时,url 变为
http://host:port/page1
我需要有自己的特定网址,例如
http://host:port/my-test-application/path-for-my-app/
http://host:port/my-test-application/path-for-my-app/page1
此外,我的应用程序有很多元素可以链接到应用程序的其他区域,我需要这些元素也可以使用 basePath 转到 URL,而不仅仅是转到根路径。
我还将把这个应用程序 depolying 到具有不同 basePaths 的不同服务器,因此这不能在我的应用程序中进行硬编码。
我怎样才能做到这一点?
对于 react/vue/angular/native JS 等其他应用程序,我只需构建我的应用程序并将构建代码放在我服务器上的“my-test-application/path-for-my-app”文件夹中。
我用我的 NextJS 应用程序试过这个,但我收到一个错误,说找不到“.next”文件夹。
我用谷歌搜索,可以找到一些关于使用“assetPrefix”或使用“Zones”的参考资料。但是我真的不明白我应该做什么。
如何将我的应用程序部署到特定的 URL
解决方案 1:重组“页面”- 不允许我部署到具有不同 basePaths 的不同服务器
我可以在我的“页面”目录中创建文件夹结构并更改我的所有元素以使用此文件夹结构。
|- pages
|- my-test-application
|- path-for-my-app
|- index.js
|- page1.js
<Link href="/my-test-application/path-for-my-app/page1" >
我不喜欢这个解决方案,因为 basePath 被硬编码到我的应用程序中,与部署设置相对应。
如果我想在具有不同 basePaths(即下面)的 2 个服务器上部署我的应用程序,我将必须有 2 个版本的代码。
http://host:port/my-test-application_1/path-for-my-app/page1
http://host:port/my-test-application_2/diff-path-for-my-app/page1
更新:我在 3 月 5 日更新了这个问题,以包括我对 s 工作的需求和一个我不喜欢的解决方案。
原文由 se22as 发布,翻译遵循 CC BY-SA 4.0 许可协议
我找到了一个使用 NGINX 来反向代理具有基本路径的 URL 的解决方案。
有用的链接
申请变更
依赖关系
下一步.config.js
在应用程序的根目录添加一个“next.config.js”文件,以便您可以指定“assetPrefix”和“publicRuntimeConfig.basePath”
例子
静态图片
使用“next-images”导入图像并在 的 src 标签中引用导入的对象
更改对静态图像(/public 文件夹中的那些)的任何引用以具有基本路径前缀。例如我的“页脚”组件具有以下内容
注意:我尝试使用 publicRuntimeConfig.basePath 作为 src URL 的前缀(如下所示),但这在我的部署环境中不起作用(见下文)
链接
更改您的链接以使用基本路径前缀,例如在我的“标题”组件中我有以下内容
注意:在博客 https://levelup.gitconnected.com/deploy-your-nextjs-application-on-a-different-base-path-ie-not-root-1c4d210cce8a 中,它包含一个“Link.tsx”为您添加前缀,因此您只需使用该链接组件(从“./Link.tsx”导入链接;)而不是 nextJS 版本(从“下一个/链接”导入链接;)。但是,当我的链接 URL 中有变量时,“Link.tsx”对我不起作用。
运行你的 nextjs 应用程序
当您不需要基本路径时在本地运行您的应用程序时,您可以运行
由于没有指定 BASE_PATH,你的应用程序应该可以从“ http://localhost:3000 ”访问,你的 src 值应该是“/image_name1.png”,当你将鼠标悬停在你的 s 上时,你会看到链接是“ http://本地主机:3000/页面名称“
当您想使用基本路径运行时,请执行以下操作
_注意:出于某种原因,在我的环境中,如果我指定“export BASEPATH=/a/b”(/ 在路径的开头),我会在路径的开头添加一个文件夹目录。因此,我在没有开始 / 的情况下指定它,如果需要,next.config.js 中的代码会添加开始 / 。
您无法通过“ http://localhost:3000 ”访问您的应用程序,因为您设置了基本路径/assetPrefix/publicRuntimeConfig.basePath。现在你需要一个反向代理。
NGINX :反向代理
我发现最简单的设置是使用 NGINX docker 镜像。您需要使用包含重定向到 NextJS 应用程序的配置来运行 NGINX。
创建一个文件夹并在该文件夹中添加一个“default.conf”文件。确保您放入“位置”的路径与您在启动 nextjs 应用程序时为 BASE_PATH 指定的路径相同。
重要笔记:
例子
在该目录的命令提示符下运行 NGINX docker 映像,告诉它使用您的配置文件。
转到以下网址
NGINX 会将该 URL 重定向到“ http://localhost:3000 ”。因此,您的应用程序现在应该可以从具有基本路径的 URL 访问。单击 s 应该有效,链接应包含转到 NGINX 的基本路径,NGINX 重定向回应用程序,剥离基本路径,留下任何其他路径。
使用 Docker 的真实世界服务器部署
如果您将应用程序部署到服务器,而不是在本地运行,您可以构建您的应用程序,然后将相关文件/文件夹复制到服务器计算机。确保在构建和运行应用程序时设置了 BASE_PATH
然后在该服务器位置运行
注意:如果您在应用程序中引用了“public”中的图像,请使用“next-images”并导入图像,而不是使用 publicRuntimeConfig.basePath 作为前缀。当我做后者时,找不到图像。有关示例,请参阅有关图像的部分。