RequireJS ist ein Framework zum Laden von Dependencies in Javascript.
<script type="text/javascript" src="js/require.js" data-main="main"></script>
Das main.js befindet sich üblicher Weise im Wurzelpfad der Anwendung, um andere Scripts relativ dazu laden zu können. Das Attribut data-main spezifiziert dabei das Main-Script.
requirejs.config({ paths: { jquery: "js/jquery-3.4.1.min", "jquery-ui": "js/jquery-ui.min", vue: "js/vue.min", "vue-jquery": "js/vue-jquery", reactor: "js/reactor", css: "js/require-css" } }); require(["app/app"]);
paths: Deklaration von Require-Dependencies, die mit einfachem Namen geladen werden können. require: Laden der eigentlichen App.
requirejs.config({ paths: { css: "js/require-css" } });
Die require-css.js kann wie folgt aussehen:
define(["jquery"], function($) { return { load: function(name, req, onload, config) { onload($("<link>") .attr({ type: "text/css", rel: "stylesheet", href: name + ".css" }) .appendTo("head") ); } }; });
Die CSS-Dateien können dann, wie JS-Requirements, im require- oder define-Statement geladen werden:
define(["vue", "jquery", "reactor", "app/test-element", "css!css/reactive-component"], function(Vue, $) { [...] });
function(name, req, onload, config) { var url = req.toUrl(name + ".css"); }
Wie auch in verschiedenen Foren zu finden ist, legt RequireJS unterschiedliches Verhalten an den Tag. Vor allem im Browser entstehen dadurch offenbar falsche URLs. In eigenen Loadern lässt sich das beheben durch:
function(name, req, onload, config) { var url = req.toUrl(config.baseUrl + name + ".css"); };
requirejs.config({ packages: [{ name: "static-ui", location: "/service/static-ui" }] });
Dabei sind folgende Dinge zu beachten:
Erklärung: Aufgrund des asynchronen Ladens ist unklar, ob das Package zuerst aus dem Unterpackage oder Hauptpackage geladen wird. Wird es aus dem Unterpackage geladen, ist die Definition richtig. Wird es zuerst aus dem Hauptpackage geladen und fehlt dort die Definition, wird die Standardauflösung baseUrl/<name>.js verwendet, die möglicherweise falsch ist.
requirejs.config({ paths: { "jquery-internal": "vue/js/jquery-3.4.1.min", jquery: "vue/js/jquery-noconflict" } });
Mit jquery-noconflict.js:
define(["jquery-internal"], function() { return jQuery.noConflict(true); });
Hinweis: Im Browser ist es leider nicht möglich, auf Ressourcen zuzugreifen, die nicht in "paths" definiert wurden. Ansonsten wird die absolute URL falsch zusammengesetzt.