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