waitseconds node example define javascript dojo requirejs

javascript - node - requirejs npm



Requirejs no puede compilar mi módulo dependiente de dojo (1)

Dojo tiene varios complementos que usa que no son compatibles con el constructor / optimizador r.js. Lo mejor que puede hacer es registrar un problema en https://bugs.dojotoolkit.org para que alguien agregue los complementos necesarios para que se pueda resolver.

Una alternativa es cambiar al uso del constructor de dojo, pero no parece que cree el código que requirejs puede usar, por lo que también necesitaría usar su cargador, no requirejs. (dojo builder usa alguna opción patentada? {cache:...} para hacer sus dependencias en lugar de solo definir define, por lo que no pude encontrar una manera de compilar y cargar con requirejs).

Otra alternativa (hasta que dojo arregle los complementos para que sean compatibles) si quieres permanecer con requirejs (como yo), puedes excluir los archivos que usan estos complementos de dojo de la optimización y simplemente tener esos archivos cargados por separado sin optimizar. Por lo tanto, la mayoría de sus archivos se pueden optimizar, excepto los que usan estos complementos. No es perfecto pero te acerca más. Requirejs simplemente cargará la mayoría de los archivos de manera optimizada y luego solo obtendrá los excluidos de forma individual en el tiempo de ejecución.

Para hacer esto, agregue las exclusiones de r.js build.js para archivos específicos que usan complementos que generan errores. Entonces, después de ejecutar la construcción y obtienes ese error, agrega a tus rutas el archivo que está usando el complemento, es decir. el penúltimo en el seguimiento de la pila.

Así que agrega a tus opciones de compilación r.js

paths: { ''dojo/query'': ''empty:'', // this will exclude it from the build

A continuación, ejecute su compilación de nuevo y repita hasta que haya obtenido todos los demás archivos de ese error.

Cuando intentaba construir dojo''s dgrid, terminé con las siguientes exclusiones:

paths: { // r.js having issues building these, the plugins are not // compatible so let them load normally unoptimized ''dgrid/extensions/ColumnHider'': ''empty:'', ''put-selector/put'': ''empty:'' ''dojo/i18n'': ''empty:'', ''dojo/selector/_loader'': ''empty:'', ''dojo/query'': ''empty:'', ''dgrid/extensions/ColumnResizer'': ''empty:'', ''dgrid/List'': ''empty:'', ''xstyle/css'': ''empty:''

Su lista puede variar según lo que esté usando.

Luego solo tiene estos archivos (y sus dependencias) disponibles cuando se ejecuta y requirejs los cargará como lo hace en desarrollo. Por lo tanto, al menos la mayoría de sus archivos se cargarán optimizados desde un archivo, y luego se cargarán después.

Nota: Pedir dojo para que los complementos sean compatibles con el compilador / optimizador de r.js es la mejor solución, así que no tendríamos que hacer este truco. Entonces, incluso si usa este trabajo, agregue un problema para Dojo para que esto pueda resolverse de una vez por todas. Mencione todos los archivos que terminó excluyendo para ayudar a los desarrolladores a saber qué corregir. Luego publique un comentario aquí para que otros lo hagan +1.

ACTUALIZACIÓN: Intenté la respuesta de Jeff Barczewski a continuación, y aunque ya no obtengo el siguiente error para los complementos, ahora recibo un error diferente:

Error: TypeError: Cannot read property ''normalize'' of undefined In module tree: mymodule/core at Object.<anonymous> (/usr/local/lib/node_modules/requirejs/bin/r.js:1193:35)

ACTUALIZACIÓN 2: como Jeff tiene razón en que los complementos de Dojo no son compatibles con RequireJS, decidí cambiar al uso de grunt-dojo para construir dojo. Todavía uso RequireJS para mi propio código y simplemente anulo las dependencias de dojo para ser ignorado.

Publicación original:

Estoy intentando usar ronco para compilar un solo archivo JS para reducir la cantidad de solicitudes HTTP que los navegadores deben realizar. Dado que Dojo 1.9 es compatible con AMD, pensé que usaría el complemento requirejs de Grunt para optimizar mi código. Sin embargo, recibo el siguiente error, tanto al usar el plugin Grunt como al usar r.js directamente:

>> Tracing dependencies for: mymodule/core >> TypeError: Cannot call method ''createElement'' of undefined >> In module tree: >> mymodule/core >> dojo/behavior >> dojo/query >> dojo/selector/_loader { [Error: TypeError: Cannot call method ''createElement'' of undefined In module tree: mymodule/core dojo/behavior dojo/query dojo/selector/_loader at eval (eval at <anonymous> (/Users/EugeneZ/Workspace/presentment/web/js/node_modules/grunt-contrib-requirejs/node_modules/requirejs/bin/r.js:23690:38), <anonymous>:6:24) ] originalError: { [TypeError: Cannot call method ''createElement'' of undefined] moduleTree: [ ''dojo/selector/_loader'', ''dojo/query'', ''dojo/behavior'', ''mymodule/core'' ], fileName: ''/Users/EugeneZ/Workspace/presentment/web/js/dojo_release/dojo/selector/_loader.js'' } }

Al mirar el código del módulo _loader Dojo, se asume que se está ejecutando en un navegador y se basa en el document global:

var document; var testDiv = document.createElement("div");

Pero, ¿por qué no lo permite? He buscado en su documentación y no puedo encontrar ninguna manera de desactivar esta verificación. Asumo que estoy malinterpretando algo o haciendo algo mal, pero no puedo entenderlo.

Aquí está la parte relevante de mi Gruntfile.js:

requirejs: { compile: { options: { ''baseUrl'': ''./'', ''paths'': { ''dojo'': ''dojo_release/dojo'', ''dojox'': ''dojo_release/dojox'', ''dijit'': ''dojo_release/dijit'', ''mymodule'' : ''core/mymodule'', ''osi'': ''osi'', ''demo'': ''demo'', ''slick'': ''core/slick'' }, ''name'': ''mymodule/core'', ''out'': ''./mymodule.js'' } } }