Eu estou usando requirejs e em um dos meus arquivos sublinhado é uma dependência. O abaixo é o pedaço de código para incluir sublinhado.
define(["lib/underscore"], function(_) {
// Here _ is undefined
});
Com um pouco de pesquisa, descobri que sublinhado é adicioná-lo ao namespace global. Underscore retorna indefinido e é por isso que _ está se tornando indefinido. Se eu usar o seguinte caminho, é válido.
define(["lib/underscore"], function() {
// Here _ is defined
};
No código acima, não estou sobrescrevendo o _ que é adicionado ao espaço de nomes global.
Na minha exploração para descobrir por que sublinhado não está retornando o _ eu encontrei este pedaço de código a seguir em underscore.js
// AMD registration happens at the end for compatibility with AMD loaders
// that may not enforce next-turn semantics on modules. Even though general
// practice for AMD registration is to be anonymous, underscore registers
// as a named module because, like jQuery, it is a base library that is
// popular enough to be bundled in a third party lib, but not be part of
// an AMD load request. Those cases could generate an error when an
// anonymous define() is called outside of a loader request.
if (typeof define === "function" && define.amd) {
define("underscore", [], function() {
return _;
});
}
Isso significa que quando o sublinhado é carregado por meio de requirejs, ele deve retornar _ em vez de indefinido. Isso não está acontecendo comigo. Alguém por favor pode me ajudar com isso.
Respostas:
0 para resposta № 1O snippet de sublinhado fornecido acima é executado apenas quando define
existe. Você provavelmente está carregando o sublinhado na página antes do RequireJS. Além disso, o sublinhado está se registrando como um módulo nomeado. Os módulos nomeados normalmente são necessários usando esse nome, em vez de um caminho.
Você também pode:
Se você precisar de sublinhado como um global regular, carregue sublinhado depois de você carrega o RequireJS na página. Dessa forma, ele se declara como um módulo global e também como um módulo nomeado. Você pode então exigir sublinhado usando seu nome em vez de um caminho como:
define(["underscore"], function(_){...});
Não é necessário sublinhar e continuar usando o global
_
. mas isso acaba com o propósito de você ter o RequireJS em primeiro lugar.