Javascript 同构反应中的活环境变量
我已经构建了一个同构的React应用程序,它松散地基于中的初学者工具包。它使用webpack来构建生产代码 问题是,我需要将服务器上的一些环境变量的值公开给浏览器中的客户机代码,而无需重新生成生产代码。我希望能够更改env变量的值,并使其在下一页刷新时对客户端产生影响,而无需重建任何内容。我不想为了完成它而使测试复杂化 我找到了一些解决方案,但没有一个是好的:Javascript 同构反应中的活环境变量,javascript,reactjs,webpack,flux,isomorphic-javascript,Javascript,Reactjs,Webpack,Flux,Isomorphic Javascript,我已经构建了一个同构的React应用程序,它松散地基于中的初学者工具包。它使用webpack来构建生产代码 问题是,我需要将服务器上的一些环境变量的值公开给浏览器中的客户机代码,而无需重新生成生产代码。我希望能够更改env变量的值,并使其在下一页刷新时对客户端产生影响,而无需重建任何内容。我不想为了完成它而使测试复杂化 我找到了一些解决方案,但没有一个是好的: 使用DefinePlugin for webpack将某些环境变量的值硬编码到生产代码中。类似于所概述的 构建一个API,将环境变量拉入
有什么建议吗?似乎这应该是一个常见/已解决的问题。也许我想得太多了,3才是正确的选择。锅炉板使用express,您可以使用express'local向客户端公开服务器env变量
var serverVariable = 'this is a server variable'
app.get('/somelink', function (req, res, next) {
res.locals.data = {
FluxStore: { serverlocal: serverVariable }
}
next()
})
然后通过React.renderToString传递本地数据,客户端上的FluxStore将拾取该数据。另一种方法,您可以使用falcor之类的数据获取api,它可以由客户端操作存储通过falcor http datasource拾取,您不需要falcor的express local,您可以使用falcor express和falcor router构建它,所以我提出的解决方案相当简单。我只编写了一行javascript,将值保存到脚本标记内的本地存储中。然后在应用程序启动时从我的flux应用商店读取本地存储 这是添加到index.html的相关标记:
<script type="text/javascript"><%= config %></script>
然后,当应用程序启动时,我读到:
import ls from 'local-storage';
....
let api = ls.get('ADMIN_API');
这将使用
window
中的窗口全局变量来传递值,但为您提供一个通用界面来访问浏览器和节点上的值
在publicEnv.js中:
// Env variable to push to the client. Careful on what you put here!
const publicEnv = [
'API_URL',
'FACEBOOK_APP_ID',
'GA_ID'
];
// These 2 lines make sure we pick the value in the right place on node and the browser
const isBrowser = typeof window !== 'undefined';
const base = (isBrowser ? window.__ENV__ : process.env) || {};
const env = {};
for (const v of publicEnv) {
env[v] = base[v];
}
export default env;
在页面的HTML模板文件中,我有:
import publicEnv from 'publicEnv.js';
...
<script>
window.__ENV__ = ${stringify(publicEnv)};
// Other things you need here...
window.__INITIAL_STATE__ = ${stringify(initialState)};
</script>
我希望它能有所帮助。3似乎是最好的选择。
import publicEnv from 'publicEnv.js';
...
<script>
window.__ENV__ = ${stringify(publicEnv)};
// Other things you need here...
window.__INITIAL_STATE__ = ${stringify(initialState)};
</script>
import publicEnv from 'publicEnv.js';
...
console.log("Google Analytic code is", publicEnv.GA_ID);