node - Con requirejs, ¿es posible verificar si un módulo está definido sin intentar cargarlo?
requirejs jquery (2)
Quiero poder definir un módulo de manera opcional y luego usarlo o no en mi código. La situación particular que estoy considerando es la carga de módulos simulados o de código auxiliar en el entorno de depuración / prueba, pero no cuando estoy activo. Aquí está el ejemplo:
En el archivo html, los archivos js se cargarán opcionalmente (pseudo código):
//index.cshtml
...
<script src="/Scripts/lib/require.js"></script>
<script src="/Scripts/app/service_user.js"></script>
<script src="/Scripts/app/real_service.js"></script>
#if DEBUG
<script src="/Scripts/app/mock_service.js"></script>
#endif
En lo anterior, tanto real_service como mock_service deben cargarse en la versión de depuración.
Cada módulo se definiría usando requirejs, por ejemplo:
//mock_service.js
define(''mock_service'', [],
function () {
...
});
//real_service.js
define(''real_service'', [],
function () {
...
});
Luego, cuando utilice el servicio, me gustaría verificar si se ha definido el servicio mock_service:
//service_user.js
define([''require'', ''real_service''],
function (require, real_service) {
if (require.isDefined(''mock_service'')) { // ''isDefined'' is what I wish was available
var mock = require(''mock_service'');
mock.init(real_service);
}
...
});
Por lo tanto, mi función teórica "está Definida" simplemente verificaría que se haya definido un módulo con el nombre (o los nombres) dados. Luego, en mi código, si está definido, puedo requerirlo y usarlo. Si no, entonces eso también está bien.
Lo importante para mí es que no se intenta cargar el módulo opcional. Podría intentar / atrapar la instrucción require pero eso provocaría un intento de cargarla desde el servidor y no quiero eso.
Otra opción sería tener un apéndice que establezca que siempre cargue, por lo que siempre hay un simulacro que puedo cuestionar si es real o no, pero eso también parece un desperdicio.
¿Hay alguien por ahí que esté profundamente interesado en require.js que ha descubierto que necesita esta funcionalidad y ha elaborado una estrategia para la implementación?
Gracias de antemano, Rob
Aunque la respuesta de David Wolf estuvo cerca de la marca, no satisfizo completamente mis necesidades.
El problema es que requieren resolver asincrónicamente los requisitos así que en el ejemplo que di y usando la sugerencia de David require.defined(''mock_service'')
devolverá false
porque aunque se haya especificado, aún no se ha resuelto.
Al investigar esto encontré otra función specified
. En el ejemplo require.specified(''mock_service'')
devolverá true
pero luego intentará obtener una referencia usando require(''mock_service'')
falla porque aún no se ha resuelto.
Eso, afortunadamente, se soluciona fácilmente mediante el uso de la versión de devolución de require. Poniéndolo todo junto tenemos:
if (require.specified(''mock_service'')) {
require( [ ''mock_service'' ], function (mock) {
mock.init(real_service);
});
}
@David Wolf - gracias, no habría llegado allí sin su ayuda.
Solo busqué esto yo mismo, requiero global tiene un método "definido" que toma un nombre de módulo y devuelve verdadero o falso.
// returns true
require.defined("my/awesome/defined/module");
// returns false
require.defined("not/yet/loaded");