同构 JS - 变量在客户端不可用
Isomorphic JS - variable is not available on client
我目前正在开发一个在客户端和服务器之间使用一些共享 JS 的项目。技术栈包括 Node v6、Webpack、React 等
有一个目录 "shared",服务器和客户端需要一个名为 rules.js 的文件。在服务器端发生的第一个渲染中,rules.js 中声明的规则变量设置为来自数据库的值(我已经完成 console.log 来验证它真的充满了数据)。
然后在客户端,某些组件可能需要此 rules.js 文件并获取规则变量。但是,当我 console.log 变量时,它是空的。
规则文件类似于:
// shared/rules.js
let rules;
// This is called on server to set the value
exports.setData = function(data) {
rules = data;
}
exports.rules = rules;
你知道哪里出了问题吗?我应该选择不同的方法吗?
虽然文件可以由客户端和服务器共享,但 class 的 实例 不是。因此,您在服务器上对它所做的任何操作都不会在客户端上持续存在,反之亦然。
一个可用的想法是 "dehydrating" 和 "rehydrating" 你所在的州。
server.js
// implemented in server to dehydrate your state
import rules from '../shared/rules';
let dehydratedRules = JSON.stringify(rules.rules);
let html = renderToString(<App/>);
// now in your render call
res.render('yourTemplateFile', {html, dehydratedRules});
你的模板文件
...
<script type="text/javascript">var __RULES__ = {{dehydratedRules}};
...
client.js
// implemented in client to rehydrate your state
import rules from '../shared/rules';
let parsedRules = JSON.parse(__RULES__);
delete window.__RULES__;
// set the rehydrated data back in the class
rules.setData(parsedRules);
.
我目前正在开发一个在客户端和服务器之间使用一些共享 JS 的项目。技术栈包括 Node v6、Webpack、React 等
有一个目录 "shared",服务器和客户端需要一个名为 rules.js 的文件。在服务器端发生的第一个渲染中,rules.js 中声明的规则变量设置为来自数据库的值(我已经完成 console.log 来验证它真的充满了数据)。
然后在客户端,某些组件可能需要此 rules.js 文件并获取规则变量。但是,当我 console.log 变量时,它是空的。
规则文件类似于:
// shared/rules.js
let rules;
// This is called on server to set the value
exports.setData = function(data) {
rules = data;
}
exports.rules = rules;
你知道哪里出了问题吗?我应该选择不同的方法吗?
虽然文件可以由客户端和服务器共享,但 class 的 实例 不是。因此,您在服务器上对它所做的任何操作都不会在客户端上持续存在,反之亦然。
一个可用的想法是 "dehydrating" 和 "rehydrating" 你所在的州。
server.js
// implemented in server to dehydrate your state
import rules from '../shared/rules';
let dehydratedRules = JSON.stringify(rules.rules);
let html = renderToString(<App/>);
// now in your render call
res.render('yourTemplateFile', {html, dehydratedRules});
你的模板文件
...
<script type="text/javascript">var __RULES__ = {{dehydratedRules}};
...
client.js
// implemented in client to rehydrate your state
import rules from '../shared/rules';
let parsedRules = JSON.parse(__RULES__);
delete window.__RULES__;
// set the rehydrated data back in the class
rules.setData(parsedRules);