reactjs - 用于部署后设置的 React 配置文件
问题描述
我已经建立了一个 reactjs 站点并试图让它可以部署。
现在所有的配置都是通过一个 config.js 完成的,它被导入到所有的模块中。
但是当我构建应用程序时,它会被编译到部署 js 中并且不可配置。
我想要一个单独的文件,系统管理员可以配置特定于其环境的各种设置,例如 API 端点(该应用程序可能不在与后端相同的服务器上运行,并且将无法访问 DNS )。
有没有办法在反应中做到这一点?我也不希望为此使用 3rd 方库。
解决方案
不确定 linux 方法,但我经常使用 create-react-app (cra)、Docker 和 kubernetes,最初也遇到了类似的问题。然后我受到https://github.com/inloop/cra-docker的启发,并能够在 Docker 和 kubernetes 中找到运行时 create-react-app 配置文件问题的解决方案。以下是我的解决方案中的步骤:
准备好您的自定义配置(例如
config.js
:)。配置文件中的内容应如下所示:window.ENV = { "ENVIRONMENT":"stg", ...other key-value configuration as you'll need }
您的配置可以通过访问在您的代码中的任何位置访问
window.ENV.your_configuration_key
(例如:上面的 ENVIRONMENT 值可在 处获得window.ENV.ENVIRONMENT
)在
public
目录下,编辑 index.html 并添加<script type="text/javascript" src="%PUBLIC_URL%/config.js"></script>
在你的头脑之前的身体。并放在目录
config.js
下public
。您解决 cra 外部配置的目标是要将
config.js
文件放在源目录之外并将其放在静态public
目录下。如果将配置放在源目录下,则配置将在构建期间编译,因此您将无法在运行时轻松更改配置(好吧,模板也可以,但对我来说并不理想)。请注意,从静态目录提供文件需要一个服务器,但由于我已经在使用nginx
它来提供我的静态反应应用程序,所以我绝对没有问题这样做。由于我已经使用
nginx
为我的 react 应用程序提供静态文件,因此我不需要更改我的 Dockerfile 来满足额外的需求config.js
,因为它在编译后将在目录下可用build
(由于它被放置在public
目录下)。我的 Dockerfile 看起来像这样:# Step 1: Build static react app FROM node AS builder # Define working directory and copy source WORKDIR /app COPY . . # Install dependencies and build whatever you have to build RUN yarn install && yarn build # Step 2: Run image FROM nginx COPY --from=builder /app/build /usr/share/nginx/html RUN rm /etc/nginx/conf.d/default.conf COPY nginx.conf /etc/nginx # this step is not required, only when you have custom nginx configuration
然后构建你的 docker 镜像:
docker build -t [your-docker-image]:latest .
最后但同样重要的是,您需要
config.js
在运行时替换文件。现在可以很容易地做到这一点。如果您使用 docker 运行,则可以使用 -v 命令替换文件。因此,您的 docker 运行时命令应该类似于以下内容:
docker run --name [app-container-name] -d -p [host_port]:80 \ -v [path_to_config.js_file_in_certain_environment]:/usr/share/nginx/html/config.js \ [your-docker-image]
如果您使用 kubernetes 运行,您可以使用 、 和 替换容器下现有目录
configMap
中volume
的volumeMounts
文件subPath
。首先把你的 config.js 放到 k8s ConfigMap 下:
kubectl create configmap [k8s_config_name] --from-file=config.js=[path_to_config.js_file_in_certain_environment]
在您的 k8s 部署中挂载您的 configMap:
containers: ... volumeMounts: - name: [k8s_config_name_volume] readOnly: true mountPath: "/usr/share/nginx/html/config.js" subPath: "config.js" volumes: - name: [k8s_config_name_volume] configMap: name: [k8s_config_name]
请注意,要替换目录下已经存在一些文件的文件,需要
mountPath
和参数。subPath
如果subPath
在卷安装到已经包含一些文件的现有目录期间省略,则在我们的情况下结果是不利的,因为它将通过将新文件复制到目录中来覆盖现有目录,但删除所有其他先前存在的文件。
推荐阅读
- javascript - classycountdown.js 上的固定日期
- javascript - 如何禁用 HTML/JS 中的样式元素?
- c# - InvalidOperationException:未指定 authenticationScheme,在 ASP.NET Core 2.0 中未找到 DefaultChallengeScheme
- msbuild - 在 MSBuild 中构建混合 .Net Standard 和 .NetFramework 解决方案
- asp.net - 域更改后 20 分钟的 SessionState
- c# - 在没有数组或任何循环的情况下从用户那里获取 5 个值并找到最大值和最小值
- azure - 天蓝色。手动触发时释放未触发并卡住
- python - TensorFlow Serving:在运行时更新 model_config(添加其他模型)
- python - 如何按值解析 argparser 参数
- magento2 - Magento2 您必须使用 --with-jpeg-dir=DIR 选项安装 GD 库