【问题标题】:Isomorphic JS - variable is not available on client同构 JS - 变量在客户端不可用
【发布时间】:2026-01-08 19:45:02
【问题描述】:

我目前正在开发一个在客户端和服务器之间使用一些共享 JS 的项目。技术栈包括 Node v6、Webpack、React 等。

有一个“共享”目录,服务器和客户端需要一个名为 rules.js 的文件。在服务器端发生的第一次渲染中,rules.js 中声明的规则变量被设置为来自 DB 的值(我已经完成了 console.log 以验证它是否真的充满了数据)。

然后在客户端,某些组件可能需要这个 rules.js 文件并获取 rules 变量。但是,当我 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;

您知道可能出了什么问题吗?我应该选择不同的方法吗?

【问题讨论】:

    标签: javascript node.js isomorphic-javascript


    【解决方案1】:

    虽然文件可以由客户端和服务器共享,但类的实例却不是。因此,您在服务器上对其执行的任何操作都不会在客户端上持续存在,反之亦然。

    一个可用的想法是“脱水”和“再水化”你的状态。

    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);
    

    Checkout this SO answer utilizing an analogy from Back to the Future to explain dehydrating/rehydrating.

    【讨论】:

      最近更新 更多