2013-12-09 9 views
5

UPDATE nicht kompilieren: habe ich versucht, Jeff Barczewski Antwort unten, und obwohl ich nicht mehr die Fehler unten für Plugins, ich bin jetzt eine andere Störung zu erhalten:Requirejs kann mein Dojo-abhängigen Modul

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) 

UPDATE 2: Da Jeff richtig ist, dass die Plugins von Dojo nicht mit RequireJS kompatibel sind, entschied ich mich für die Verwendung von grunt-dojo anstelle von Dojo. Ich verwende immer noch RequireJS für meinen eigenen Code und überschreibe einfach die Dojo-Abhängigkeiten, die ignoriert werden sollen.

Original-Beitrag:

Ich versuche, Grunzen zu verwenden, um eine einzelne JS-Datei kompilieren, um die Menge von HTTP-Anfragen Browser vornehmen müssen zu senken. Da Dojo 1.9 AMD-kompatibel ist, dachte ich mir, dass ich Grunts Requirejs-Plugin verwenden würde, um meinen Code zu optimieren. Ich bin jedoch die folgenden Fehler zu erhalten, sowohl bei Verwendung der Grunt-Plugin und wenn r.js direkt mit:

>> 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' } } 

auf dem Code der Suche nach dem _loader Dojo-Modul, wird es vorausgesetzt, es ist in einem Browser ausgeführt wird und mich auf die document global:

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

Aber warum requirejs dies nicht zulassen? Ich habe ihre Dokumentation durchsucht und finde keine Möglichkeit, diesen Check abzubrechen. Ich gehe davon aus, dass ich etwas falsch verstehe oder etwas falsch mache, aber ich kann es nicht verstehen. Hier

ist die requirejs relevanten Teil meiner 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' 
      } 
     } 
    } 
+0

Haben Sie jemals eine Lösung für die "Kann nicht lesen Eigenschaft 'Normalisierung von undefinierten" Problem gefunden? –

+1

habe ich nicht. Am Ende musste ich zurücktreten und mich fragen, warum ich r.js benutzen wollte. Ich habe gerade den Dojo-Builder benutzt, der sowieso viel mächtiger ist, obwohl es auch viel komplexer ist, was ich zuerst vermeiden wollte. – EugeneZ

Antwort

4

Dojo hat mehrere Plugins, die es verwendet, die nicht kompatibel sind mit dem r.js Builder/Optimierer. Am besten protokollieren Sie ein Problem unter https://bugs.dojotoolkit.org, damit jemand die erforderlichen Plugin-Hooks hinzufügt, damit dies behoben werden kann.

Eine Alternative ist die Umstellung auf den Dojo-Builder, aber es scheint keinen Code zu erstellen, den requestsjs verwenden kann. Sie müssten also auch ihren Loader verwenden, nicht requirejs. (Dojo Builder verwendet einige proprietäre? {cache:...} Option für seine Abhängigkeiten statt nur inlining definieren, so konnte ich nicht einen Weg zum Erstellen und Laden mit requirejs finden).

Noch ein Problem (bis dojo die Plugins repariert, um kompatibel zu sein) Wenn Sie mit requirejs bleiben wollen (wie ich), können Sie Dateien, die diese Dojo-Plugins verwenden, von der Optimierung ausschließen und diese Dateien einfach nicht optimiert laden . Daher können die meisten Ihrer Dateien optimiert werden, mit Ausnahme von Plugins, die diese Plugins verwenden. Es ist nicht perfekt, aber es bringt dich näher. Requirejs lädt einfach die meisten Dateien in optimierter Weise und holt dann diese ausgeschlossenen Dateien einzeln zur Laufzeit.

Um dies zu tun, fügen Sie Ihre r.js build.js Ausschlüsse für bestimmte Dateien, die Plugins verwenden, die Fehler aus. Nachdem Sie den Build ausgeführt und diesen Fehler erhalten haben, fügen Sie Ihren Pfaden die Datei hinzu, die das Plugin verwendet, z. die zweitletzte in der Stack-Spur.

So legen zum r.js Optionen bauen

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

Dann wieder Build laufen und wiederholen, bis Sie die anderen Dateien alle Fehler, bekommen haben.

Als ich versuchte Dojo D-Grid zu bauen, kam ich mit den folgenden Ausnahmen auf:

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:' 

Ihre Liste variieren je nachdem, was Sie verwenden.

Dann haben Sie nur diese Dateien (und ihre Abhängigkeiten) verfügbar, wenn sie ausgeführt werden, und requiresjs wird sie wie in der Entwicklung laden. So wird zumindest die Mehrzahl Ihrer Dateien aus einer Datei optimiert geladen, danach werden diese geladen.

Hinweis: Dojo zu bitten, die Plugins r.js builder/optimizer kompatibel zu machen, ist die ultimative Lösung, so dass wir diesen Hack nicht machen müssten. Also, auch wenn Sie diese Arbeit verwenden, fügen Sie bitte ein Problem für Dojo hinzu, so dass dies ein für allemal gelöst werden kann. Erwähnen Sie alle Dateien, die Sie ausschließen mussten, damit die Entwickler wissen, was zu beheben ist. Dann poste hier einen Kommentar, damit andere +1 erhalten.

+1

Danke, das hat mich einen Schritt weiter gebracht. Ich werde den Dojo Bug Tracker verfolgen, wenn ich eine Chance bekomme. Ich bekomme jedoch immer noch Fehler: 'Fehler: TypeError: Die Eigenschaft' normalize 'von undefined kann nicht auf' r.js 'gelesen werden: 1193: 35. Wenn ich die Abhängigkeit des angegebenen Moduls vom Plugin lösche, verschwindet der Fehler für dieses Modul, ist aber immer noch für das nächste Modul mit einer Plugin-Abhängigkeit vorhanden. – EugeneZ

+0

Wählen Sie diese Antwort aus, weil Jeff schließlich korrekt ist, dass Dojo-Plugins noch nicht mit dem RequireJS-Builder kompatibel sind. Meine Lösung bestand jedoch darin, die [grunt-dojo-Aufgabe] (https://github.com/phated/grunt-dojo) zu verwenden, um stattdessen meine Dojo-Erstellung durchzuführen. – EugeneZ

Verwandte Themen