为什么Meteor 0.6.0将所有内容都包装在(function(){ ... })中?

7
自从版本0.6.0以后,Meteor将每个Javascript文件封装到(function() { ... })中。这对我自己的Javascript文件来说很有意义,但对于第三方库来说就不是了。例如,我正在使用来自crypto-js的sha3.js,它位于client/lib中。在0.5.9之前,这非常完美。但现在,sha3中的函数不再可用。请问这个封装是否可以关闭?
3个回答

4

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

  • 作用域变量是避免变量冲突并保持简单变量名称的好方法
  • 这是 Npm.require 功能所必需的技术手段

Node/Meteor 的一个主要功能是能够在客户端和服务器上运行相同的文件。这就是为什么变量作用域需要在客户端和服务器上具有相同的行为方式,以及为什么 Meteor 现在在客户端上也包含函数闭包。

不能关闭封装(除非更改 Meteor/tools 代码)。

该行为很快将通过对链接器分支的工作进行改进,它将自动解决您的文件依赖关系(基于变量名),然后1.按正确顺序包含 JavaScript 文件2.导出需要的变量到全局范围。

目前,您将不得不手动导出需要在全局范围内的对象。


3
你可以使用未记录的 bare 选项(以前是 raw)来 add_files:
api.add_files([
  'sha3.js'
], 'client', {bare: true});

并且它不会自动换行添加的文件。


请在您的package.js文件中添加此内容。有关包的文档,请参阅packages文档 - Mitar

2
Meteor 0.6.0引入了NPM兼容性,因此可以正式使用通过meteor packages添加的NPM模块。问题在于,由于全局作用域,变量声明存在冲突,因为该包基本上被视为项目中的文件。
这仅影响服务器端代码,但如果服务器端代码受到作用域限制,则客户端代码将不再兼容,因此为了保持一致性,客户端代码也受到作用域限制。
解决方案是像您建议的那样将变量全局化,在coffeescript中通过添加“@”或在javascript中删除“var”。
尽管我也发现这对于一些客户端库(如x-editable和ace编辑器)很令人沮丧,但Meteor正在与链接器分支一起努力开发一个良好的解决方案,以允许自动扫描文件的依赖项,然后自动正确地进行作用域限制。
这方面还有更多讨论,请参见:https://groups.google.com/forum/?fromgroups=#!topic/meteor-talk/gYgYhv88nB4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接