¿Utiliza un módulo javascript no compatible con AMD con require.js?
backbone.js requirejs (3)
puede ajustar su requerimiento con otro requiera que el complemento se cargue primero, y luego puede hacer su aplicación.
require(["myCustomTastyPiePlugin.js"], function () {
//This callback is called after the one script finish loading.
require(["one.js", "two.js", "three.js"], function () {
//This callback is called after the three scripts finish loading.
// all your code goes here...
});
});
Estoy usando require.js para ayudar a organizar mi aplicación basada en Backbone.js.
Estoy tratando de encontrar la forma correcta de usar una biblioteca de JavaScript de terceros que no sea compatible con AMD con require.js
La biblioteca en cuestión es backbone-tastypie.js . Básicamente lo que hace la biblioteca es parchear algunos de los métodos prototipo de Backbone para proporcionar soporte más simple para el marco REST TasjanPie Django. Lo hace manipulando directamente el objeto Backbone en el espacio de nombres global.
Sin embargo, dado que estoy usando Backbone.js como un módulo require.js, no está disponible cuando esta biblioteca intenta acceder a él.
¿Cómo puedo ir sobre la importación de este backbone-tastypie en el ámbito de Backbone?
ACTUALIZACIÓN: he bifurcado un backbone-tastypie compatible con AMD llamado backbone-tastypie-amd.
Si bien la solución de lijadora funcionaría, es un poco molesto hacer toda la tarea requerida anidada cada vez que quieras tener la red troncal.
backbone-tastypie es lo que se llama una "secuencia de comandos tradicional". Puedes resolver el problema de 4 maneras.
Haga que el backbone-tastypie AMD sea compatible usted mismo. Puedes hacer esto de una de dos maneras. La opción 1 sería nunca incluir la red troncal directamente, solo backbone-tastypie. Luego, modifique el sabueso de la red troncal para garantizar que se requiera la red troncal.
var root = this; var Backbone = root.Backbone; if (!Backbone && (typeof require !== ''undefined'')) Backbone = require(''backbone'').Backbone;
Sin embargo, esto no es muy bueno porque esencialmente comenzará a descargar la red troncal después de que backbone-tastypie se haya cargado (sincrónico). Tampoco le exige a todos la comprensión completa de cómo se relacionan estos módulos, y ese es el punto correcto? Así que vamos a envolver backbone-tastypie en un define ():
(function (factory) { if (typeof define === ''function'' && define.amd) { // AMD. Register as an anonymous module. define([''backbone''], factory); } else { // RequireJS isn''t being used. Assume backbone is loaded in <script> tags factory(Backbone); } }(function (Backbone) { //Backbone-tastypie contents }));
Esta es, de lejos, la mejor opción de todo en esta respuesta. RequireJS conoce las dependencias y puede resolverlas, descargarlas y evaluarlas correctamente. Vale la pena señalar que el Backbone en sí carga el guión bajo usando la opción 1 y no se define a sí mismo como un módulo, lo cual es bastante malo. Puede obtener la versión optimizada de AMD de la red troncal aquí. Asumiendo que está usando esta versión de AMD, ahora puede ir adelante y requerir backbone-tastypie en su aplicación (ya sea requiriéndola en una función de definición () o de la función require () real). No es necesario que incluya la red troncal o el subrayado, ya que esas dependencias se resuelven mediante requirejs.
Use el complemento de solicitud require.js . Esto obliga a que las cosas se carguen en orden (aún asíncrono en algunos aspectos, ya que las descarga cada vez, pero evalúa en el orden correcto)
require(["order!backbone.js", "order!backbone-tastypie.js"], function () { //Your code });
Ponga backbone.js en la configuración de prioridad . Esto obliga a la red troncal y sus dependencias a cargar siempre primero sin importar qué.
Agregue backbone-tastypie al mismo archivo que backbone.js. Cada vez que se carga la red troncal, también lo hace el sabueso de la red troncal. Hacky? Sí. Pero esto es muy similar a la forma recomendada de usar jquery con requireJS (los plugins de jquery necesitan que se cargue jquery, al igual que backbone-tastypie necesita que se cargue la columna vertebral).
Lo siguiente debería funcionar con RequireJS 2.1.0+ suponiendo que ha configurado correctamente las rutas.
require.config({
shim: {
''underscore'': {
exports: ''_''
},
''backbone'': {
deps: [''underscore'',''jquery''],
exports: ''Backbone''
},
''backbone-tastypie'': {
deps: [''backbone'']
}
}
);