7

从 0.6.0 版本开始,meteor 将每个 javascript 文件包装到 (function() { ... }) 中。这对我自己的 javascript 文件非常有意义。但不适用于第三方库。例如,我正在使用来自 crypto-js 的 sha3.js。这。位于客户端/库。这在 0.5.9 之前是完美的。但是现在,sha3 中的功能不再可用。

这个包装可以关掉吗?

4

3 回答 3

4

函数闭包最初是在服务器端(并且仅在服务器端)引入的,主要原因有两个:

  • 作用域变量是避免变量冲突同时保持简单变量名称的好方法
  • Npm.require功能在技术上需要它

Node/Meteor 的关键特性之一是能够在客户端和服务器上运行相同的文件。这就是为什么变量作用域需要在客户端和服务器上具有相同的行为,以及为什么 Meteor 现在也包括客户端上的函数闭包。

无法关闭包装(不更改Meteor/tools代码)。

随着链接器分支上的工作将很快改善这种行为,它将自动解决您的文件依赖关系(基于变量名称),然后 1. 以正确的顺序包含 javascript 文件 2. 在全局范围内导出需要的变量。

现在,您必须手动导出需要在全局范围内的对象。

于 2013-04-07T12:20:53.603 回答
3

您可以使用未记录的bare选项(以前raw)来add_files

api.add_files([
  'sha3.js'
], 'client', {bare: true});

它不会包装添加的文件。

于 2013-06-28T06:06:55.233 回答
2

Meteor 0.6.0 引入了 NPM 兼容性,因此人们终于可以正式使用通过流星包添加的NPM 模块。问题是,对于全局范围,在变量声明方面存在冲突,因为包基本上被视为项目中的文件

这只会影响服务器端代码,但是如果服务器端代码被限定了范围,那么客户端代码将不再兼容,因此客户端代码也被限定为一致性。

@解决方案是按照您的建议在咖啡脚本中通过添加或删除varjavascript来全球化变量。

虽然我也发现这对几个客户端库(如 x-editable 和 ace 编辑器)感到沮丧,但正在使用流星上的分支开发一个很好的解决方案,linker以允许自动扫描文件以查找依赖项,然后自动正确地确定它们的范围。

对此有更多讨论:https ://groups.google.com/forum/?fromgroups=#!topic/meteor-talk/gYgYhv88nB4

于 2013-04-07T12:19:52.360 回答