【问题标题】:ReferenceError: share is not definedReferenceError:未定义共享
【发布时间】:2015-03-13 15:52:28
【问题描述】:

我有一个使用 coffeescript 的 Meteor 项目。

我不确定发生了什么,但我的解决方案突然出现此错误。

    ReferenceError: share is not defined
at app/models/Models.js:3:3

当我尝试启动我的解决方案时。

无论我在哪里使用 Meteor coffeescript 共享变量,它都会生成此错误。

我正在使用 WebStorm,并且我有一个 FileWatcher 可以将 coffeescript 转换为 javascript。当我打开它时(我需要能够在 WebStorm 中进行调试),它会为我的 .coffee 文件生成 .js 和 .map 文件。

因此,不知何故,这些生成的 JS 文件没有引用咖啡脚本在 Meteor 中使用的共享变量来拥有全局变量。

我尝试删除 .idea 目录和 .meteor 目录,我尝试添加和删除流星咖啡脚本包。我什至尝试创建一个新的解决方案 - 我仍然遇到同样的问题。

我似乎无法修复它,以便在打开文件观察器时不会出现错误。

这个错误的根源是什么?我可以做些什么来解决它?

【问题讨论】:

  • 为什么您要使用来自 webstorm 的 FileWatcher 为您的咖啡文件从 coffee 生成 js?这可以通过coffeescriptmeteor package 完成
  • @ajduke - 你必须这样做才能让 webstorm 能够调试
  • 自己没有检查这个,但是这个问题可能是在转译coffeescript时将生成的js代码包装在匿名函数中引起的(这使得全局函数不可用)。这是默认的 coffeescript 编译器行为。尝试在文件观察器中将“-bare”选项传递给它(相应地修改参数字段,例如 --bare --map --compile $FileName$) - 有帮助吗?
  • @lena - 不错的建议,但没有,没有任何区别。但我认为这基本上是 webstorm 咖啡脚本文件观察器的一个错误 - 不会对其进行转换,以便流星能够使用共享变量
  • 不是错误 - 缺少功能。而不是在 WebStorm 中,而是在标准的咖啡脚本编译器中

标签: meteor coffeescript webstorm


【解决方案1】:

Meteor 在将 coffeescript 编译为 js 时做了一项特殊的工作:它在生成的代码前面加上

__coffeescriptShare = typeof __coffeescriptShare === 'object' ?
    __coffeescriptShare : {};
var share = __coffeescriptShare;

确保全局 __coffeescriptShare 存在并分配给文件范围变量共享。

但是文件观察器中使用的标准 CoffeeScript 编译器对这些流星技巧一无所知。结果,我们得到

(function() {
  share.TestFunction = function(p) {
    return p;
  };

}).call(this);

而不是

function(){__coffeescriptShare = typeof __coffeescriptShare === 'object' ? __coffeescriptShare : {}; var share = __coffeescriptShare;
share.TestFunction = function(p) {
  return p;
};

})();

因此标准编译器不适合转译coffeescript meteor 应用程序。必须使用 Meteor coffeescript 包。它支持源映射,因此没有理由使用文件观察器。对我来说,使用 Meteor coffeescript 包生成的地图时可以进行调试,但并非总是如此。请注意,WebStyorm 还不支持meteor+coffeescript。相关票证有:WEB-14479WEB-14794

【讨论】:

    猜你喜欢
    • 2012-08-24
    • 2015-10-04
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多