2013-08-07 11 views
12

Sto tentando di caricare la funzione Modernizr in modo dinamico con requireJS.
Come Modernizr ha costruito nel supporto AMD, questo non dovrebbe essere un problema.requireJS configuration per Modernizr

La mia configurazione requireJS contiene i percorsi per la directory di origine Modernizr e alla funzione rileva directory:

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

lascia supporre uno dei miei punti di vista richiederebbero l' prova svg.
La mia definizione di vista potrebbe apparire come this

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

Purtroppo la svg.js non riesce a trovare Modernizr.js perché tutte le funzionalità rileva e file di origine Modernizr caricare Modernizr senza specificare qualsiasi directory: define(['Modernizr'], ...

che si traduce in un tempo molto brutto 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" 
    } 
}); 

C'è un modo più pulito per dire requireJS per la ricerca in components/modernizr/src/ ogni volta che non riusciva a trovare il file?

Aggiornamento

ho creato un example github project che include la configurazione di base e di una esecuzione demonstration.

+0

Curioso di sapere il motivo per l'utilizzo di AMD con Modernizr? È necessario caricare il file in modo sincrono in modo che i test siano eseguiti prima del rendering della restante parte della pagina. Se ricordo bene, AMD è stata scelta principalmente per aiutare il processo di costruzione - https://github.com/Modernizr/Modernizr/issues/713 –

+0

@SimonSmith Sto usando lo script 'r.js' requireJS per creare la mia app in uno file. Sarebbe fantastico se potessi definire le dipendenze di modernizr usando requireJS. – jantimon

+0

Presumo che tu stia usando qualcosa come Bower per la gestione delle risorse, quindi la tua cartella 'components' non è uguale alla cartella del progetto (in altre parole, non puoi usare 'baseUrl' in RequireJS per puntare a Modernizer). Sfortunatamente, sembra che non ci sia un modo semplice per aggiungere quelle dipendenze e il modo in cui l'hai risolto, è l'unica opzione. L'alternativa sarebbe eseguire 'r.js' su Modernizer e quindi includere il file pacchettizzato nella tua app. Ancora non eccezionale. – danielepolencic

risposta

19

La struttura AMD di Modernizr è (attualmente) solo per il proprio processo di compilazione interno. Abbiamo discusso dell'esposizione di questo in modo che possa essere utilizzato come hai provato, ma non abbiamo ancora trovato un modo conveniente per farlo. A Modernizr plugin for RequireJS potrebbe essere una opzione.

Stai usando Bower? Se è così, vale la pena notare Modernizr isn't suitable for use with Bower yet.

Il metodo consigliato per collegare Modernizr al processo di compilazione in questo momento è l'utilizzo di grunt-modernizr, che troverà automaticamente riferimenti a Modernizr nel codice (o è possibile definirli esplicitamente), quindi sarà sufficiente utilizzare la build Modernizr risultante come qualsiasi altra dipendenza AMD quando ne hai bisogno:

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

Grazie mille! Se questo è l'unico modo per ora, passerò al grugnito. – jantimon

+0

Se ho già una versione personalizzata di Modernizr (ottenuta con Zurb Foundation), come supporta AMD? Non vedo alcun define() per il modulo. Vedo che c'è una variabile globale collegata alla finestra nella prima riga. Puoi elaborare? – elanh

+3

@elanh Uno script Modernizr non è compatibile con AMD, quindi dovresti usare una [shim config] (http://requirejs.org/docs/api.html#config-shim). –

-1

Se ho capito bene la tua domanda, non ti basta definire la funzione in questo modo:

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

In questo modo verrà caricato prima che il codice di rilevamento funzione viene eseguito.

+0

Voglio caricare una funzionalità di rilevamento con tutte le sue dipendenze – jantimon

11

Il mio suggerimento sarebbe di avere uno spessore

Config

paths: { 
     'Modernizr': 'PATH TO MODERNIZR' 
    } 
shim: { 
     'Modernizr': { 
      exports: 'Modernizr' 
     } 
    } 

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

È possibile utilizzare definire nello script

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

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

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

};