/ / Underscorejs quando usado com requirejs retornando undefined - javascript, requirejs, underscore.js

Underscorejs quando usado com requirejs retornando undefined - javascript, requirejs, underscore.js

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 № 1

O 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.