2013-08-07 9 views
12

Ich versuche, das Modernizr Feature dynamisch erfasst mit requireJS zu laden.
Da Modernizr AMD eingebaut hat, sollte dies kein Problem sein.requireJS Konfiguration für Modernizr

Meine requireJS Konfiguration enthält die Pfade zum Modernizr Quellverzeichnis und auf die Funktion erkennt Verzeichnis:

requirejs.config({ 
    paths: { 
    "modernizr" : "components/modernizr/src", 
    "feature-detects": "components/modernizr/feature-detects" 
    } 
}); 

einer meiner Ansichten annehmen Ermöglicht würde die svg Test benötigen.
Meine Ansicht Definition aussehen könnte this

define(["feature-detects/svg"], function() { .. }); 

Leider kann die svg.js nicht Modernizr.js finden, weil alle Features und Quelldateien Modernizr erkennen Modernizr laden, ohne jedes Verzeichnis festgelegt wird: define(['Modernizr'], ...

, die in einem sehr hässlich Ergebnisse require.config

requirejs.config({ 
    paths: { 
    "Modernizr": "components/modernizr/src/Modernizr", 
    "addTest": "components/modernizr/src/addTest", 
    "ModernizrProto": "components/modernizr/src/ModernizrProto", 
    "setClasses": "components/modernizr/src/setClasses", 
    "hasOwnProp": "components/modernizr/src/hasOwnProp", 
    "tests": "components/modernizr/src/tests", 
    "is": "components/modernizr/src/is", 
    "docElement": "components/modernizr/src/docElement", 
    "feature-detects": "components/modernizr/feature-detects" 
    } 
}); 

Gibt es einen sauberen Weg requireJS zu sagen, in components/modernizr/src/ zu suchen, wenn es die Datei nicht finden kann?

aktualisieren

Ich habe ein example github project, die die Basis-Setup und eine laufende demonstration enthält.

+0

Neugierig nach dem Grund in Ihrem Skript verwenden definieren? Sie müssen die Datei synchron laden, damit die Tests ausgeführt werden, bevor der Rest der Seite gerendert wird. Wenn ich mich richtig erinnere, wurde AMD hauptsächlich ausgewählt, um den Build-Prozess zu unterstützen - https://github.com/Moderniszr/Moderniszr/issues/713 –

+0

@SimonSmith Ich benutze das Skript requireJS 'r.js', um meine App zu einer zu machen Datei. Es wäre genial, wenn ich mithilfe von requireJS modernisierte Abhängigkeiten definieren könnte. – jantimon

+0

Ich gehe davon aus, dass Sie Bower für die Verwaltung von Assets verwenden, daher ist Ihr 'components'-Ordner nicht derselbe wie der Projektordner (mit anderen Worten, Sie können' BaseUrl' in RequireJS nicht auf Modernizer verweisen). Leider scheint es keine einfache Möglichkeit zu geben, diese Abhängigkeiten und die Art, wie Sie es gelöst haben, hinzuzufügen. Die Alternative wäre, "r.js" auf Modernizer auszuführen und dann die gepackte Datei in Ihre App aufzunehmen. Immer noch nicht großartig. – danielepolencic

Antwort

19

Modernizrs AMD-Struktur ist (derzeit) nur für seinen eigenen internen Build-Prozess. Wir haben darüber diskutiert, dies so auszulegen, dass es so verwendet werden kann, wie Sie es versucht haben, aber wir haben uns noch nicht auf eine bequeme Art und Weise geeinigt, dies zu tun. A Modernizr plugin for RequireJS könnte eine Option sein.

Verwenden Sie Bower? Wenn ja, ist es notieren Modernizr isn't suitable for use with Bower yet.

Der empfohlene Weg, um Modernizr in Ihren Build-Prozess im Moment zu binden, ist die Verwendung grunt-modernizr, die automatisch Verweise auf Modernizr erkennt in Ihrem Code finden (oder Sie können sie explizit definieren), dann können Sie einfach die resultierende Modernizr-Build verwenden wie jede andere Abhängigkeit AMD, wenn Sie es brauchen:

define(['path/to/built/modernizr.js'], function (Modernizr) { 
    if (Modernizr.svg) { 
     ... 
    } 
}); 
+0

Vielen Dank! Wenn das der einzige Weg ist, werde ich jetzt zu grunzen wechseln. – jantimon

+0

Wenn ich bereits einen Custom Build von Modernizr habe (mit Zurb Foundation), wie unterstützt es AMD? Ich sehe keine define() für das Modul. Ich sehe, dass eine globale Variable an das Fenster in der ersten Zeile angehängt ist. Kannst du es ausarbeiten? – elanh

+3

@elanh Ein gebautes Modernizr-Skript ist nicht AMD-kompatibel, daher sollten Sie eine [shim config] (http://requirejs.org/docs/api.html#config-shim) verwenden. –

-1

Wenn ich Ihre Frage richtig verstehe, würden Sie nicht definieren Sie einfach Ihre Funktion wie so:

define([ 
    "modernizr", 
    "feature-detects/svg" 
], function(Modernizr) { 
    Modernizr.addTest(); 
}); 

Auf diese Weise modernizr geladen werden, bevor Sie Ihre Feature-Erkennung Code ausgeführt wird.

+0

Ich möchte ein Feature erkennen mit allen seinen Abhängigkeiten – jantimon

11

würde Mein Vorschlag eine Shim

Config

paths: { 
     'Modernizr': 'PATH TO MODERNIZR' 
    } 
shim: { 
     'Modernizr': { 
      exports: 'Modernizr' 
     } 
    } 
zu haben sein

=================

Sie können für die Verwendung von AMD mit Modernizr

define(['Modernizr'],function(Modernizr) { 
    'use strict'; 

console.log(Modernizr) 
// This should log the Modernizr function 

//For Example 
if(Modernizr.boxshadow){ 
    // Do something here 
} 

};