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

时间:2014-07-24 16:08:01

标签: node.js meteor

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中执行此操作?

2 个答案:

答案 0 :(得分:0)

  1. Meteor为我们创建的每个文件包装模块中的所有代码(function(){... your code ...})()。如果要从js文件(模块)中导出某些内容,请将其设置为全局。即,不要将var与您要导出的变量名称一起使用,并且可以在此模块之后包含的所有文件中访问它。请记住meteor包含js文件http://docs.meteor.com/#structuringyourapp

  2. 的顺序
  3. 我认为如果不使用全局变量就可以做到这一点。 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并且在大气层得到很好的支持,那么你应该使用它。