Meteor.js:你如何要求或链接在客户端和服务器上的另一个JavaScript文件?

1)在后端节点链接一个JavaScript文件到另一个我们使用require语句和module.exports。 这允许我们创build代码模块并将它们连接在一起。

meteor里的同样的事情呢?

2)在前端,meteor是我想从另一个前端JavaScript文件访问代码,我必须使用全局variables。 有没有更好的办法做到这一点,所以我可以要求在另一个文件中的一个JavaScript文件? 我认为像browserify这样做,但我不知道如何将这与meteor。

基本上如果在客户端我有一个文件

browserifyTest.coffee

test = () -> alert 'Hello' 

我想能够在另一个文件中访问这个testingfunction

test.coffee

 Template.profileEdit.rendered = -> $ -> setPaddingIfMenuOpen() test() 

我怎样才能做到这一点在meteor而不使用全局?

  1. meteor将所有代码包装在模块中(函数(){…您的代码…})()为我们创build的每个文件。 如果你想从你的js文件(模块)中导出一些东西,使它成为一个全局的。 也就是说,不要在你想要导出的variables名称中使用var ,并且在这个模块之后的所有文件中都可以访问它。 请记住meteor包括js文件的顺序http://docs.meteor.com/#structuringyourapp

  2. 我不认为你可以做到这一点,而不使用全局variables。 meteor在SEF(自执行函数)expression式中将代码包装在js文件中,并且导出api仅适用于软件包。 你对全局variables有什么问题? 我曾经使用过相当大的Meteor项目,同时使用一个全局对象来保留我的全局帮助器名称空间,但是从来没有遇到过从其他文件中的一个文件访问函数/数据的任何问题。

您可以使用本地软件包,就像一个普通的Meteor软件包,但只用于您的应用程序。 如果软件包certificate在其他应用程序中有用,您甚至可以在大气中发布它。

我build议你阅读Meteor文档中的WIP章节“编写软件包”,但是预计未来几周会发生突变,因为Meteor 0.9将会包含最终的Package API,这个API将略有不同。 http://docs.meteor.com/#writingpackages

基本上,你需要创build一个包目录(我的包),并把它放在/包。

然后你需要一个包描述文件,它需要在你的包的根目录下被命名为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 !"); } }; 

另一个包约定是声明一个包含全部公共对象的包全局对象,然后导出这个对象,以便应用程序可以访问它。 你输出的variables需要成为package-global,所以不要忘了在声明时删除var关键字:package范围就像普通的meteor app范围一样。

最后但并非最不重要的是,不要忘记meteor添加你的包:

meteor加我的包

而且你将能够在客户端使用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在客户端导出时刻。

你可以使用http://pmmospherejs.com/package/npm的氛围npm包,它可以让你直接在你的服务器代码中使用NPM包,而不需要首先将它们包装在Meteor包中。 当然,如果一个特定的NPM软件包已经转换成Meteor并且在大气层上得到了很好的支持,你应该使用它。