很抱歉,我问了个菜鸟问题。
我想知道是否有人知道NextJS自托管的推荐部署流程(例如,docker或kubernetes)。我正在进行一次典型的构建,根据环境进行交付,同时更改环境变量以匹配环境,但保持映像相同。
由于NextJS在您使用“getInitialProps”和“publicRuntimeConfig”时会自动退出SSG,因此我想知道,将同一映像部署到多个环境的最佳方式是什么(同样,在通用云上自托管,例如Docker Run)。
1.我必须总是在环境变量中烘焙吗?所以我必须为每个环境和每个env vars的更新构建一个映像。
1.使用publicRuntimeConfig / getInitialProps,但忽略SSG优化,即使我的变量是非敏感的(例如GA_TRACKING_ID)
1.......还有什么事吗?
谢谢你的帮助!
3条答案
按热度按时间2vuwiymt1#
您可能想看看react-env,它就能做到这一点。
其思想是react-env将为您生成一个包含您的环境变量的
__ENV.js
JS文件,然后您可以通过窗口或env
帮助器在客户端访问该文件,例如:使用Docker时,可以设置一个入口点,在容器启动时生成所需的
__ENV.js
:des4xlb02#
我将详细介绍@gyum-fox的答案,因为
react-env
文档不是最新的,有几件事需要一些时间来解决。下一个. js版本:
12.2.5
个Package
在
react-env
Next.js repo中使用了2个 Package :react-env
和@beam-australia/react-env
。我不知道前者的用途是什么,我用了后者。“同构”
react-env
声称它是同构的,但是我无法使它在服务器端工作。我在服务器端和客户端都使用了一些变量,所以要使它工作:
REGULAR_VAR
已在服务器上使用,在.env
文件中管理NEXT_PUBLIC_REGULAR_VAR
在客户端上的使用方式如下:env('REGULAR_VAR')
(注:NEXT_PUBLIC
前缀已删除)。在__ENV.js
文件中管理使用软件包
要在Next.js中使用
__ENV.js
文件,请在_document.tsx
中放置以下行注意:虽然
__ENV.js
位于/public
目录中,但在运行时文件将位于根目录中,因为该目录中的每个文件都将位于正在生成
__ENV.js
文件react-env
命令只需要生成__ENV.js
,因此您可以启动项目:--prefix NEXT_PUBLIC
:NEXT_PUBLIC
是客户端环境变量的默认值node server.js
:或next dev
或任何其他命令来启动项目坞站
我使用Dockerfile from Vercel example进行部署。若要在容器中生成
__ENV.js
文件,请更改至
在这里,我添加了
--path .env.production
以使用生产环境变量。结论
就是这样!现在你可以在
__ENV.js
中更改客户端环境变量,重启生产服务器,新的值将被应用。2nc8po8w3#
您可以:
1.为不同环境构建相同映像
1.对不同的环境使用不同的环境变量。
1.有许多方法可以为不同的环境设置环境变量。
https://nextjs.org/docs/basic-features/environment-variables