reactjs - 如何为服务器上部署的 Reactjs 应用程序设置环境变量?
问题描述
我认为我的问题与之前提出的有关环境变量的问题不同。我知道如何在构建 ReactJs 应用程序时设置环境变量。构建应用程序后,它会为我提供静态文件,然后我将其放在服务器上。这个应用程序就像一个普通的网络应用程序一样工作。
问题:
如果我想在不打开代码文件的情况下为客户端提供更改服务器上已部署构建的环境变量之一,我该怎么做?
注意:
由于这不是一个特定的编码问题,如果您认为,请将此问题移至相关的 SO 论坛。
谢谢
解决方案
无法更改 REACT_APP_XXXXX 环境。编译后的变量。他们正在永久“融入”应用程序。
我通过拥有一个从后端提供的动态 JSON 清单文件解决了这个问题。该应用程序加载 JSON 文件并读取其值。这种方法的一种变体是从后端提供一个 Javascript js 文件。该脚本执行一个在全局窗口对象中设置一些变量的函数。
这是一个节点express
应用程序的片段,它以 JSON 和 JS 文件的形式提供清单。
const express = require('express')
const app = express()
const manifest = {
appTheme: process.env.APP_THEME,
foo: "bar"
};
const cacheTimeoutSec = 600
class ManifestController {
static getJS(req, res) {
/// Generate IIFE function that sets window.serverManifest object
let fileChunks = [
'(function(){',
'var serverManifest=',
JSON.stringify(manifest),
'; window.serverManifest = serverManifest',
'})()',
].join('');
res.set('Cache-Control', `public, max-age=${cacheTimeoutSec}`);
res.setHeader('content-type', 'text/javascript');
res.write(fileChunks);
res.end();
}
static getJSON(req, res) {
res.json(manifest);
}
}
// Serve manifest in JS
app.get('/server-manifest.js', ManifestController.getJS);
// Serve manifest as JSON
app.get('/server-manifest.json', ManifestController.getJSON);
选项1:
react 应用程序从您的后端(例如)手动获取 JSON 文件https://api.mybackend.com/server-manifest.json
并对数据进行操作。
选项 2:
<script>
像这样在 html 文件头中包含标签
<html lang="en">
<head>
<script src="https://api.mybackend.com/server-manifest.js"></script>
<title>Home</title>
</head>
<body>
<noscript>
You need to enable JavaScript to run this app.
</noscript>
<div id="root"></div>
</body>
</html>
如果你把它放在<head>
浏览器中,它将加载脚本并执行它。该脚本将清单设置在window.serverManifest
React 应用程序现在可以随时访问的全局对象中。
推荐阅读
- java - 当在 for each 循环中找不到值时,无法找出 println 语句
- c# - 程序网格 Unity 之间的奇怪线条
- python - 如何在python中查找和操作句子中的单词?
- semantic-ui - Semantic-UI-React 未使用 Nextjs _app.js 应用
- apache-spark - Any 类型的表达式不符合预期的类型 sql.DataFrame
- .net-core - 预构建目标未运行
- machine-learning - [0, 1] 中的 GBM 连续预测和 [0, 1] 中的 Logistic 回归连续预测有什么区别
- android - Android WebView 中的 VueJS (Xamarin)
- java - SSL 错误 java - 收到致命警报:handshake_failure
- mongodb - 如何通过搜索日期和时间来查找记录