Como o script coffee não possui nenhuma var
instrução, ele o insere automaticamente para todas as variáveis no script coffee-coffee, dessa forma evita que a versão JavaScript compilada vaze tudo para o diretório espaço de nomes global .
Portanto, como não há como "vazar" algo no espaço para nome global a partir do lado do script de café, você precisa definir suas variáveis globais como propriedades do objeto global .
anexá-los como propriedades na janela
Isso significa que você precisa fazer algo como window.foo = 'baz';
, que lida com o caso do navegador, já que existe o objeto global é o window
.
Node.js
No Node.js, não há window
objeto, mas o exports
objeto que é passado para o wrapper que envolve o módulo Node.js. (Veja: https://github.com/ry/node/blob/master/src/node.js# L321 ), então no Node.js o que você precisa fazer é exports.foo = 'baz';
.
Agora, vamos dar uma olhada no que ele diz em sua citação dos documentos:
... visando o CommonJS e o navegador: root = exportações? isto
Obviamente, isso é um script de café, então vamos dar uma olhada no que isso realmente compila:
var root;
root = (typeof exports !== "undefined" && exports !== null) ? exports : this;
Primeiro, ele verificará se exports
está definido, pois tentar fazer referência a uma variável inexistente no JavaScript produziria um SyntaxError (exceto quando usado com typeof
)
Portanto, se exports
existir, como é o caso do Node.js (ou em um site mal gravado ...), a raiz apontará para o exports
contrário this
. Então o que é this
?
(function() {...}).call(this);
O uso .call
de uma função vinculará a this
função interna ao primeiro parâmetro passado, no caso do navegador this
agora ser o window
objeto; no caso do Node.js, seria o contexto global que também está disponível como global
objeto.
Mas como você tem a require
função no Node.js., não há necessidade de atribuir algo ao global
objeto no Node.js. Em vez disso, você o atribui ao exports
objeto que é retornado pela require
função.
Coffee-Script
Depois de toda essa explicação, aqui está o que você precisa fazer:
root = exports ? this
root.foo = -> 'Hello World'
Isso declarará nossa função foo
no espaço de nomes global (o que quer que seja).
Isso é tudo :)