1)在后端的节点中将一个javascript文件链接到另一个javascript文件,我们使用require语句和module.exports。 这允许我们创建代码模块并将它们链接在一起。
Meteor中的情况怎么样?
2)在前端,在Meteor中我想从另一个前端javascript文件访问代码,我必须使用全局变量。有没有更好的方法来做到这一点,所以我可以在另一个文件中需要一个javascript文件?我认为像browserify这样的东西会这样做,但我不确定如何将其与Meteor集成。
基本上如果在客户端我有一个文件
browserifyTest.coffee
test = () ->
alert 'Hello'
我希望能够在另一个文件中访问此测试功能
test.coffee
Template.profileEdit.rendered = ->
$ ->
setPaddingIfMenuOpen()
test()
如何在不使用全局变量的情况下在Meteor中执行此操作?
答案 0 :(得分:0)
Meteor为我们创建的每个文件包装模块中的所有代码(function(){... your code ...})()。如果要从js文件(模块)中导出某些内容,请将其设置为全局。即,不要将var
与您要导出的变量名称一起使用,并且可以在此模块之后包含的所有文件中访问它。请记住meteor包含js文件http://docs.meteor.com/#structuringyourapp
我认为如果不使用全局变量就可以做到这一点。 Meteor在SEF(自执行函数)表达式中包装js文件中的代码,导出api仅适用于包。你对全局变量有什么问题?我已经使用了相当大的Meteor项目,并且在使用全局对象来保存我的全局助手名称空间时,我从来没有遇到过这种从其他文件中的一个文件访问函数/数据的方法的任何问题。
答案 1 :(得分:0)
您可以使用本地程序包,它就像普通的Meteor程序包一样,但仅在您的应用程序中使用。 如果该包证明在其他应用程序中有用,您甚至可以在大气中发布它。
我建议你阅读WIP部分"写包"虽然Meteor 0.9将包括最终的Package API,但是预计未来几周将会出现重大变化,这将会略有不同。 http://docs.meteor.com/#writingpackages
基本上,您需要创建一个包目录(my-package)并将其放在/ packages下。
然后你需要一个包描述文件,它需要在包的根目录下命名为package.js.
/packages/my-package/package.js
Package.describe({
summary:"Provides test"
});
Package.on_use(function(api){
api.use(["underscore","jquery"],"client");
api.add_files("client/lib/test.js","client");
// api.export is what you've been looking for all along !
api.export("Test","client");
});
通常我尝试模仿我的包中的Meteor应用程序结构,这就是为什么我将test.js放在my-package / client / lib / test.js下:它是一个实用工具驻留在客户端的功能。
/packages/my-package/client/lib/test.js
Test={
test:function(){
alert("Hello !");
}
};
另一个包约定是声明包含所有public的包全局对象,然后导出该单个对象,以便应用程序可以访问它。 您导出的变量必须是包全局的,所以在声明它们时不要忘记删除var关键字:包范围就像常规的流星应用范围一样。
最后但并非最不重要的是,不要忘记流星添加你的包裹:
meteor add my-package
您将能够在客户端中使用Test.test而不会污染全局命名空间。
由于评论中发布的第二个问题而编辑。
假设您现在要在包中使用NPM模块。 我会以momentjs为例,因为它简单而有趣。
首先你需要在package.js中调用Npm.depends,我们将依赖于最新版本的momentjs:
/packages/my-moment-package/package.js
Package.describe({
summary:"Yet another moment packaged for Meteor"
});
Npm.depends({
"moment":"2.7.0"
});
Package.on_use(function(api){
api.add_files("server/lib/moment.js");
api.export("moment","server");
});
然后您可以在服务器端代码中使用Npm.require,如下所示:
/packages/my-moment-package/server/moment.js
moment=Npm.require("moment");
真正的时刻包也可以通过加载客户端版本的momentjs来导出客户端。
您可以使用大气npm包http://atmospherejs.com/package/npm,它允许您直接在服务器代码中使用NPM包,而无需先将它们包装在Meteor包中。 当然,如果特定的NPM包已经转换为Meteor并且在大气层得到很好的支持,那么你应该使用它。