写流星包时可变范围

Variable scope when writing meteor package

本文关键字:范围 包时可 流星      更新时间:2023-09-26

当我在流星包中编写js文件时,我有以下代码:

A = 1;
console.log(A);
console.log(window.A);

我想知道为什么第一个console.log打印1,而第二个打印未定义。

之所以会发生这种情况,是因为bundler足够智能,可以解析包源代码,查找全局变量。毕竟,包的(生成的)代码(即实际加载到浏览器的代码)前面有这样的代码:

/* Package-scope variables */
var A;

它应该解释一切;)

如果你真的想导出你的变量,使其在包外可用,请按照@sbking告诉你的那样做,所以在package.js中写:

// was Package.on_use in older Meteor versions
Package.onUse(function (api) {
  api.export('A');
});

编辑

需要记住的一点是,当您将use strict语句放在文件的开头时,Meteor将不再检测隐式全局变量,除非它们使用api.export显式导出。因此,只有当您希望在包代码中具有私有全局变量时,这才是有问题的。

请注意,当严格模式处于活动状态,并且这些变量没有放入包"preamble"中时,尝试将值附加到未定义的变量将导致运行时错误,因此这实际上是一个破坏交易的因素。有关此问题的更多详细信息,请查看此处。

一个简单的解决方法是将所有私有全局变量放在一个文件中,开头没有use strict语句:

// globals.js
// no "use strict" statement here ...
MyPrivateVariable1 = null;
MyPrivateVariable2 = null;

Meteor命名空间包变量。要导出包变量,您需要在package.js文件中使用api.export。请参阅此处的示例:

https://github.com/meteor/meteor/blob/devel/packages/email/package.js