2016-04-11 8 views
2

Ich benutze das requirejs-babel Plugin, das voraussetzt 'es6!' zu allen Modul-IDs, die Babel transpilation benötigen.RequireJS: Plugin dynamisch auf Modul-ID anwenden

Gibt es eine API in RequireJS, die es mir erlaubt, eine Modul-ID zu prüfen und die Plugin-ID bei Bedarf voranzustellen? Zum Beispiel, wenn ich 'es6!' auf alle Modul-IDs in einem bestimmten Verzeichnis anwenden möchte?

Letztendlich muss ich in der Lage sein zu schreiben definiert wie diese define(['some-es6-module'], ...) und automatisch das Präfix es6! je nachdem, was die Modul-ID ist.

  • sucht nicht für Informationen über SystemJS oder schluck Aufgaben, die die transpilation vor der Zeit zu tun, usw.
  • Der genaue Modul-IDs nicht bei der Konfiguration bekannt ist zeitüber ich an bestimmten Orten/Verzeichnisse weiß nur, werden Module brauche es6!.
  • Bedürfnisse im Browser zur Laufzeit
+0

zu klären, sind Sie wollen ein wie folgt definieren schreiben, und erfordern lassen die es6 automatisch hinzuzufügen! Präfix? 'define (['your-es6-modul'], funktion (modul) {...' –

+0

right- Ich werde die Frage aktualisieren, um das klarer zu machen –

+0

Sie könnten immer Ihren eigenen Haken direkt in der 'define' hinzufügen Funktion in requirJs Quelle .... aber dann müssten Sie es verteidigen, wenn es später Fragen verursacht oder in einem Upgrade verloren geht. Es gibt ein Problem (https://github.com/requirejs/r.js/issues/812) das spricht von einem ähnlichen Haken. –

Antwort

1

I beendete die load Methode überschrieben werden. Die Überschreibung verwendet die Standardlast für Module mit zugeordneten Pfaden, andernfalls verwendet sie das es6 (requirejs-babel) -Plugin zum Laden des Moduls.

require.standardLoad = require.load; 
require.load = function(context, moduleName, url) { 
    var config = requirejs.s.contexts._.config; 
    if (moduleName in config.paths) { 
    return require.standardLoad(context, moduleName, url); 
    } 
    require(['es6'], function(es6) { 
    es6.load(
     moduleName, 
     require, 
     { 
     fromText: function(text) { 
      require.exec(text); 
      context.completeLoad(moduleName); 
     } 
     }, 
     {}); 
    }); 
}; 

Hier ist es in Aktion: https://gist.run/?id=7542e061bc940cde506b

1

Ich bin nicht 100% sicher auf dem Gesamtziel (sehen Sie die es6 zusätzlich dauerhaft oder immer automatisch hinzugefügt? ID gespeichert Modul wollen), aber Sie arbeiten kann RequireJS mapping verwenden, um Modul-IDs für definierte Module zu ersetzen. Zum Beispiel: -

requirejs.config({ 
    map: { 
     // * - for all modules that require these, do this 
     '*': { 
      'some-es6-module': 'es6!some-es6-module' 
     } 
    } 
}); 

jedoch Ihre Anwendungsfall unter Berücksichtigung Sie etwas komplizierter, als diese benötigen, als Mapping vorausgesetzt, dass Sie zu diesem Zweck tatsächlich verschiedene Versionen von Dateien und wird im Allgemeinen verwendet haben.

Eine kompliziertere Lösung Ich nehme an, Sie vermeiden möchten, könnte sein, Ihre Dateien dynamisch zu loopen, bevor Sie sie in r.js optimieren und über Knoten laden/bearbeiten. Es würde ein bisschen unordentlich werden!

var config = requirejs.s.contexts._.config; 
var needBabel = ['some-es6-module', 'another-module-name', 'another']; 

for (var property in config.paths) { 
    if (config.paths.hasOwnProperty(property) && needBabel.indexOf(property) > -1) { 
     // load the module in node 
     // fs.readFileSync(__dirname + config.paths[property] + '.js'); 
     // dynamically modify this file with text replacement 
     // save this file via Node again 
    } 
} 

// run Require JS optimiser 

// undo everything you've just done when optimisation is complete