当我创建一个新的 coffeescript 文件时,我无法从另一个文件访问已编译代码中的代码,因为它被包裹在某个函数范围内。例如:
CoffeeScript :
class ChatService
constructor: (@io) ->
生成的 Javascript:
(function() {
var ChatService;
ChatService = (function() {
function ChatService(io) {
this.io = io;
}
return ChatService;
})();
}).call(this);
当尝试在另一个文件中调用 ChatService
时,它未定义。我如何使用 coffeescript 处理多个文件?
最佳答案
根据这是客户端代码还是服务器端代码,有两种略有不同的方法。
客户端:在这里,我们将跨文件可用的内容附加到全局命名空间 (window
),如下所示:
class window.ChatService
constructor: (@io) ->
然后,在另一个文件中,ChatService
和 window.ChatService
都将允许访问该类。
服务器端:这里我们必须使用exports
和require
。在 ChatService.coffee
文件中,您将拥有以下内容:
class exports.ChatService
constructor: (@io) ->
然后,要从另一个文件中获取它,您可以使用:
ChatService = require('ChatService.coffee').ChatService
注意:如果您从 ChatService.coffee 获取多个类,这是 CoffeeScript 的 dict 解包真正发挥作用的地方,例如:
{ChatService, OtherService} = require('ChatService.coffee')
两者:基本上,我们根据所处的环境来选择是运行服务器端代码还是客户端代码。一种常见的做法是:
class ChatService
constructor: (@io) ->
if typeof module != "undefined" && module.exports
#On a server
exports.ChatService = ChatService
else
#On a client
window.ChatService = ChatService
获取方式:
if typeof module != "undefined" && module.exports
#On a server
ChatService = require("ChatService.coffee").ChatService
else
#On a client
ChatService = window.ChatService
可以跳过第二个 block 的 else 子句,因为 ChatService
已经引用了附加到 window
的引用。
如果你要在这个文件中定义很多类,像这样定义它们可能会更容易:
self = {}
class self.ChatService
然后在服务器上附加它们,如 module.exports = self
和客户端上的 _.extend(window, self)
(替换 _.extend
与另一个 extend
适当的函数)。
关于javascript - 使用 coffeescript 进行多文件通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9287510/