2012-04-17 18 views
20

tl; dr: ¿Cómo mantengo el complemento text.js fuera de mi archivo optimizado cuando todas mis dependencias de texto están en línea?¿Cómo puedo evitar que el optimizador Require.js incluya el complemento de texto en los archivos optimizados?

Estoy usando el Require.js optimizer (a través del nodo) para optimizar algunos de los archivos JS en mi proyecto. Estoy usando el text plugin para cargar dependencias de texto (plantillas HTML, CSS). Tengo un módulo Quiero optimizar, incluyendo sus dependencias, así:

define(['text!core/core.css'], function(styles) { 
    // do setup stuff, return an object 
}); 

Los Require.js documentos dicen que el archivo core/core.css será inlined cuando corro el optimizador r.js, que estoy invocando como este:

$ r.js -o baseUrl=./src name=core out=release/test.js 

Tracing dependencies for: core 
Uglifying file: c:/path/release/test.js 

c:/path/release/test.js 
---------------- 
c:/path/src/text.js 
text!core/core.css 
c:/path/src/core.js 

La buena noticia es que esto funciona. Cuando miro el archivo optimizado, puedo ver el texto inline, algo como esto:

define("text!core/core.css",[],function(){return"some CSS text"}), 
define("core",["text!core/core.css"],function(a){ ... }) 

La mala noticia es que también se incluye el plugin text.js - se añade alrededor de 3K, y consiste en (como se Hasta donde puedo decir) ahora código completamente innecesario para cargar archivos de texto externos. Sé que 3K no es mucho, pero estoy tratando de mantener mi código altamente optimizado, y por lo que yo entiendo, el código para el complemento de texto no es en absoluto necesario si mis dependencias de texto están en línea. Puedo mantener el complemento de texto agregando exclude=text a mi llamada r.js, pero si lo hago, me sale un error cuando trato de usar el código optimizado en el navegador diciendo que el complemento text.js no se pudo cargar.

Así:

  1. ¿Hay alguna razón por la text.js plugin es realmente necesario aquí?

  2. Si no es así, no hay una opción de configuración para r.js que puede solucionar este comportamiento, o

  3. es un fácil cuña para los text.js plugin que puedo incluir a convencer a requerir. js que el plugin innecesario está cargado?

Respuesta

15

El plug-in de texto es realmente necesario, ya RequireJS tiene que comprobar si el plugin implementa el método normalize antes de recuperar el identificador de módulo adecuado.

La manera de quitar el complemento de texto de la construcción es el uso de la configuración onBuildWrite para crear un módulo plug-in vacío como se describe en este tema comentario: https://github.com/jrburke/r.js/issues/116#issuecomment-4185237 - Esta característica debe aterrizar en una versión futura de r.js

Editar:

r.js ahora tienen un ajuste llamado stubModules que hace exactamente eso:

//Specify modules to stub out in the optimized file. The optimizer will 
//use the source version of these modules for dependency tracing and for 
//plugin use, but when writing the text into an optimized layer, these 
//modules will get the following text instead: 
//If the module is used as a plugin: 
// define({load: function(id){throw new Error("Dynamic load not allowed: " + id);}}); 
//If just a plain module: 
// define({}); 
//This is useful particularly for plugins that inline all their resources 
//and use the default module resolution behavior (do *not* implement the 
//normalize() method). In those cases, an AMD loader just needs to know 
//that the module has a definition. These small stubs can be used instead of 
//including the full source for a plugin. 
stubModules : ['text'] 

Para más r.js op Consulte el archivo example.build.js.

+0

OK, gracias - Voy a probar esto.Esencialmente, la respuesta es (3) hacer un calce, que puedo resolver en mi proceso de construcción. – nrabinowitz

+1

Para la posteridad: hice una revisión como esta: 'define (" text ", {load: function() {}});' y la adjunté al comienzo de mi archivo optimizado. Parece que funciona bien – nrabinowitz

+1

Me preguntaba lo mismo. 'stubModules: ['text']' hace el truco en las versiones más nuevas de RequireJS. – superlukas

Cuestiones relacionadas