簡體   English   中英

在服務器,客戶端和所有文件之間共享Meteor功能而不聲明它們為全局文件?

[英]Sharing Meteor functions between server, client, and all files without declaring them global?

假設我有要在服務器和客戶端上的多個文件之間重復使用的功能。 我可以將它們設置為全局,然后將它們放置在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庫,但如果在此處聲明modules ,我認為它可能會與流星在/lib的客戶端和服務器之間的唯一代碼共享相沖突。

Meteor.methods

調用它們非常麻煩,當在/lib定義它們時,它們可以同時在客戶端和服務器上運行,而這並不總是您想要的...

如果您不想看到一段代碼,則無法將其推送給客戶端。 因此,您將其放入一個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)
})

如果您擔心混亂,只需使用閉包或您建議的簡單對象即可。 您不必定義局部作用域變量即可使用存儲在對象中的函數。 您可以像這樣使用它:

隨地

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對於功能的完整性至關重要。 盡量不要隱藏不必要的東西。 具有許多隱藏函數使編寫好的測試變得更加困難。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM