0

我正在尝试为使用 Node.js 和 CoffeeScript 编写的应用程序声明全局变量。所以我在一个通用文件中声明它,该文件在编译后连接到两个应用程序。在那个文件中,我有例如:

root = exports ? this
root.myVariable = 300

所以我的第一个应用程序是一个 HTML 应用程序。当我尝试访问此变量时,例如通过

console.log myVariable

没有问题。但是我的另一个应用程序是由节点命令启动的服务器应用程序,我无法访问该应用程序中的该变量。我试过:

console.log root.myVariable
console.log myVariable

在第一行中,我打印了“未定义”(因此看起来 root 已定义),在第二行中,我收到了 ReferenceError - myVariable 未定义。

那么如何访问这个变量呢?

这是我得到的 Javascript 输出代码,我想它可能会有所帮助:

(function() {
  var root, _ref;

  root = (_ref = typeof module !== "undefined" && module !== null ? module.exports : void 0) != null ? _ref : this;

  root.myVariable = 300;

}).call(this);

(function() {

  console.log(root.myVariable);

  console.log(myVariable);

}).call(this);
4

2 回答 2

2

你已经很接近了,但你需要稍微改变一下

# config.coffee
module.exports =
  foo: "bar"
  hello: "world"
  db:
    user: alice
    pass: password1

# lib/a.coffee
config = require "../config"

# lib/b.coffee
config = require "../config"

# lib/db.coffee
dbconfig = require("../config").db
于 2013-03-19T15:29:24.930 回答
0

客户端和服务器JavaScript(或CoffeeScript)的工作方式不同。因此,编写一个适用于两个应用程序的模块真的很困难。

有很多库可以解决这个问题,比如RequireJSBrowserify

但是对于您的问题,我有两个更简单的建议。


第一个是用来JSON存储你的全局常量。在服务器端,您可以简单地require归档JSON

root = require './config.json'

在客户端,您可以手动解析它或将其作为pjson.


我的第二个建议是编写与您的两个应用程序兼容的非常简单的模块。它看起来像这样:

root = 
  myVariable: 300
  myOtherVariable: 400

modulte.exports = root if module?.parent?

此代码应与node.js require函数和浏览器<script>标记兼容。

更新:

我只是重读了您的问题并意识到,您几乎按照我的建议做了。但是您的代码对我来说看起来不错。您可以尝试使用module.export而不是它的 alias exports,它可能会有所帮助:

root = modulte?.exports ? this
root.myVariable = 300

但是,正如我所说,您的代码对我来说也很好。

于 2013-03-19T11:39:03.073 回答