1

我有一个使用 node.js 后端和 require.js/backbone 前端的应用程序。我的后端有一个配置/设置系统,根据环境(开发、生产、测试​​版)可以做不同的事情。我也想将一些变量传播到客户端,并让它们影响一些模板渲染(例如更改页面的标题或 URL)。

实现这一目标的最佳方法是什么?

我想出了一种方法,它似乎正在工作,但我认为这不是最聪明的事情,而且我不知道如何让它与 requirejs 优化器一起工作。我所做的是在后端公开一个 /api/config 方法(通过 GET),在客户端我有以下模块 config.js:

// This module loads an environment config
// from the server through an API

define(function(require) {
    var cfg = require('text!/api/config');
    return $.parseJSON(cfg);
});

任何需要配置的页面/模块都可以:

var cfg = require('config');

正如我所说,我对这种方法有疑问,我无法使用 requirejs 优化器编译/优化我的客户端代码,因为 /api/config 文件在优化期间离线不存在。而且我确信我的方法是一个坏主意还有很多其他原因。

4

2 回答 2

1

如果您使用webpack等模块捆绑器来捆绑 JavaScript 文件以供在浏览器中使用,您可以将 Node.js 模块重用于在浏览器中运行的客户端。换句话说,将您的设置或配置放在 Node.js 模块中,并在后端和客户端之间共享它们。

例如,您在 config.js 中有以下设置:

普通 Node.js 模块:config.js

const MY_THIRD_PARTY_URL = 'https://a.third.party.url'
module.exports = { MY_THIRD_PARTY_URL }

在 Node.js 后端使用模块

const config = require('path-to-config.js')
console.log('My third party URL: ', config.MY_THIRD_PARTY_URL)

分享到客户端

import config from 'path-to-config.js'
console.log('My third party URL: ', config.MY_THIRD_PARTY_URL)
于 2018-12-03T05:53:59.400 回答
0

我执行以下操作(请注意,这是 Jade,我从未使用过 require.js 或主干,但是只要您可以将变量从 express 传递到您的模板语言中,您应该能够将 JSON 放置在data-*您想要的任何元素的属性中.)

// app.js
app.get('/', function(req, res){
  var bar = {
    a: "b",
    c: Math.floor(Math.random()*5),
  };
  res.locals.foo = JSON.stringify(bar);
  res.render('some-jade-template');
});

// some-jade-template.jade
!!!
html
  head
    script(type="text/javascript"
    , src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js")
    script(type="text/javascript")
      $.ready(init);
      function init(){
        var json = $('body').attr('data-stackoverflowquestion');
        var obj = JSON.parse(json);
        console.log(obj);
      };

  body(data-stackoverflowquestion=locals.foo)
    h4 Passing data with data-* attributes example
于 2013-07-25T18:39:34.533 回答