为什么meteor 0.6.0将所有内容都包装成(function(){...})

时间:2013-04-07 09:28:32

标签: meteor

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

可以关闭此包装吗?

3 个答案:

答案 0 :(得分:4)

函数闭包首先在服务器端引入(并且仅在服务器上),主要有两个原因:

  • 在保持简单变量名称的同时,范围变量是避免变量冲突的好方法
  • Npm.require功能
  • 在技术上是必需的

Node / Meteor密钥功能之一是能够在客户端和服务器上运行相同的文件。这就是为什么变量范围需要在客户端和服务器上具有相同的行为,以及为什么Meteor现在也包括客户端上的函数闭包。

无法关闭换行(不更改Meteor/tools代码)。

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

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

答案 1 :(得分:3)

您可以将未记录的bare选项(以前为raw)用于add_files

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

它不会包装添加的文件。

答案 2 :(得分:2)

Meteor 0.6.0 introduces NPM compatibility,所以最终可以正式使用通过流星包添加的NPM Modules。问题在于全局化范围界定在变量声明方面存在冲突,因为包基本上被视为项目中的文件

这只影响服务器端代码,但如果服务器端代码是作用域的,则客户端代码将不再兼容,因此客户端代码的范围也是一致的。

解决方案是按照您的建议全局化变量,在coffeescript中添加@或删除javascript中的var

虽然我也发现这个令人沮丧的几个客户端库(如x-editable& ace编辑器)正在使用流星上的linker分支处理一个很好的解决方案,以允许自动扫描文件对于依赖关系,然后自动正确范围。

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