如何在没有 Node.js 服务器的情况下部署 Next.js 应用程序?

Posted

技术标签:

【中文标题】如何在没有 Node.js 服务器的情况下部署 Next.js 应用程序?【英文标题】:How to deploy Next.js app without Node.js server? 【发布时间】:2021-04-15 00:31:47 【问题描述】:

我希望使用 Laravel API 部署 Next.js 应用程序。我使用 CRA 开发了 React 应用程序,在这些应用程序中,我使用 API 服务器将 CRA 的 index.html 作为应用程序的入口点。

但是在 Next.js 中,开发后我知道它需要一个 Node.js 服务器来提供服务(这是我的错,没有注意到)。有一个选项 next export 构建 Next.js 应用程序的静态表示,它有一个 index.html。我通过我的 Laravel API 将 index.html 作为应用程序的入口。它提供页面,但只是一些静态内容。

我希望知道的是,是否可以在没有任何节点服务器的情况下从单个 php 共享主机托管 aAPI 和 Next 应用程序?如果是这样,怎么做?如果不是这样,还有什么替代方案?

【问题讨论】:

【参考方案1】:

实际上接受的答案是完全错误的,当您执行 yarn build 并且您的 package.json 设置为 "build": "next build && next export", 时,您将获得一个 out 文件夹,其中所有项目都已使用在没有 node.js 服务器的情况下构建

现在由于您使用的是 laravel,并且您使用 out 文件夹,您将只加载一半页面,因为路由设置不正确。为此,您需要编辑 next.config.js 将其编辑为

module.exports = 
 distDir: '/resources/views',
 assetPrefix: '/resources/views',

这些会将根目录设置为 Laravel 中的根目录。现在这仅适用于 SPA(单页应用程序),仅适用于您需要与 out 文件夹中的每个视图文件匹配的动态路由

对于您拥有的每条路线,您需要在 laravel 中创建一个新的“获取”路线

Route::get('/', function () 
  return require resource_path('views/index.html');
);

Route::get('/contacts', function () 
  return require resource_path('views/contacts.html');
);

Route::get('/post/slug', function () 
  return require resource_path('views/post/[slug].html');
);

请注意,您可以为动态路由传递通配符,它​​们都可以工作。一旦你这样做并在 Laravel 的 /resources/views 中部署路由 out 文件夹,它就会工作

【讨论】:

【参考方案2】:

显然 nodejs 服务器没有替代品,目前这对我来说不是一个选项,所以很遗憾我不得不放弃 next.js 并创建一个 CRA 应用程序并尽可能多地使用 next.js。

【讨论】:

以上是关于如何在没有 Node.js 服务器的情况下部署 Next.js 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

与 webpack 捆绑时如何使 node.js 在没有 node_modules 的情况下工作?

是否可以在没有 Web dyno 的情况下将 Node.js 应用程序部署到 Heroku?

如何在没有客户端的情况下使用 facebook 的护照在 node.js 中构建 REST 服务?

Node.js热部署代码,实现修改代码后自动重启服务方便实时调试

在没有回调的情况下使用 Node.js 流

在没有 node.js 的情况下独立使用 socket.io