在服务器,客户端和所有文件之间共享Meteor功能而不将其声明为全局?

时间:2015-06-24 15:39:24

标签: javascript meteor

假设我有我想要在BOTH服务器和客户端上的多个文件之间重用的功能。我可以将它们设置为全局,将它们放入common代码文件夹中,但这并不好。

/lib/master_file.js

add = function(num1, num2){
  return num1 + num2;
};

subtract = function(num1, num2){
  return num1 - num2
};

/client/client_file1.js

add(4,4);
subtract(10,3);

/server/server_file1.js

add(9,1);

/server/file2.js

subtract(8,2);

- 可能的解决方案 -

我可以创建一个全局对象并将这些函数作为全局对象的值附加。

/lib/master_file_v2.js

var add = function(num1, num2){
  return num1 + num2;
};

var subtract = function(num1, num2){
  return num1 - num2
};

global = {

  add: function(num1, num2){
    return add(num1, num2);
  },
  subtract: function(num1, num2){
    return subtract(num1, num2);
  }

};

然后我必须调用这样的函数。

/client/client_file1.js

var add = global.add;
var subtract = global.subtract;
add(4,4);
subtract(10,3);

/server/server_file1.js

var add = global.add;
add(9,1);

/server/server_file2.js

var subtract = global.subtract;
subtract(8,2);

有没有办法调用这样的函数?我更愿意直接用他们的名字来称呼他们,但没有宣称他们是全球性的。

/client/client_file1.js

add(4,4);
subtract(10,3);

/server/server_file1.js

add(9,1);

/server/server_file2.js *

subtract(8,2);

模块

在服务器端,我相信我可以使用module.exports但是客户端上没有模块,所以这不起作用。我可以为客户端使用modules库,但我认为如果我在那里声明/lib,它可能会破坏Meteor在modules中客户端和服务器之间的唯一代码共享? / p>

Meteor.methods

调用它们非常罗嗦,当在/lib中定义时,它们会在客户端和服务器上运行,这并不总是你想要的......

1 个答案:

答案 0 :(得分:0)

如果您想要查看一段代码,则无法将其推送到客户端。所以你要把它放在method中。这是唯一的流星本土方式。你可以用这样的东西来增加Meteor.call api:

LIB /

methodCaller = function methodCaller (methodName) {
  return function (/*arguments...[, callback]*/) {
    var callback = arguments.slice(-1)
    Meteor.apply(methodName, arguments, methodCallback)
  }
}

Meteor.methods({
  test: function (n) {
    return n*2
  }
})

test = methodCaller('test')

的任何地方

test(1, function (err, result) {
  console.log(result)
})

如果您害怕混乱,只需使用closure或您提议的简单对象。您不必定义局部范围变量来使用存储在对象中的函数。您可以像这样使用它:

的任何地方

globals.add()

现在我认为globals是通用名称。这只会将混乱的问题转移到另一个地方。在您的示例中,您可以为示例定义mathUtils对象。

我不经常使用闭包。在某些情况下,它可以带来很大的好处。 once就是一个很好的例子:

once = function (func) {
  var hasBeenTriggered = false
  return function (/*arguments*/) {
    if(hasBeenTriggered) return
    hasBeenTriggered = true
    return func.apply(null, arguments)
  }
}

这可能看起来不像大多数闭包,但它是一个。隐藏hasBeenTriggered对于函数的完整性至关重要。尽量不要不必要地隐藏。拥有大量隐藏功能会使编写好的测试变得更加困难。