Ich versuche, einige JS-Module zu schreiben, die sowohl in einem Browser als auch in der node.js-Umgebung verwendbar sein sollten.requirejs() gibt undefined zurück, wenn Knoten und AMD-Module gemischt werden
Um dies zu erleichtern schreibe ich diese Module als AMD modules, und mit requirejs in the Node.js environment, um die define()
Funktion sowie die Möglichkeit, diese Module zu laden.
Allerdings habe ich einige Verhaltensweisen kennen gelernt, die ich nicht verstehe.
habe ich eine SSCCE, die das Problem veranschaulicht:
├── bar.js
├── node_modules
│ └── foo
│ ├── foo.js
│ ├── index.js
│ ├── node_modules
│ │ └── requirejs
│ │ ├── bin
│ │ │ └── r.js
│ │ ├── package.json
│ │ ├── README.md
│ │ └── require.js
│ └── package.json
└── test.js
foo Modul ist ein Knoten, der die AMD-Modul
node_modules/foo/foo.js
define([], function() {
return function() {
console.log("This is foo!");
};
});
foo.js wickelt
node_modules/foo/index.js
var requirejs = require('requirejs');
requirejs.config({
baseUrl: __dirname,
nodeRequire: require
});
module.exports = requirejs('foo');
bar.js ist eine weitere AMD-Modul:
define([], function() {
return function() {
console.log("This is bar!");
};
});
test.js ist ein Skript, das sowohl foo und bar nutzen will:
var requirejs=require('requirejs');
requirejs.config(
{
baseUrl: __dirname,
nodeRequire: require
}
);
var foo=require("foo");
foo();
var bar=requirejs("bar");
console.log("bar is:",bar);
Wenn ich test.js laufen, bekomme ich diese:
This is foo!
bar is: undefined
/home/harmic/tmp/test_rjs/node_modules/foo/node_modules/requirejs/bin/r.js:393
throw err;
^
Error: Mismatched anonymous define() module: function() {
return function() {
console.log("This is bar!");
};
}
http://requirejs.org/docs/errors.html#mismatch
at makeError (/home/harmic/tmp/test_rjs/node_modules/foo/node_modules/requirejs/bin/r.js:418:17)
at intakeDefines (/home/harmic/tmp/test_rjs/node_modules/foo/node_modules/requirejs/bin/r.js:1501:36)
at null._onTimeout (/home/harmic/tmp/test_rjs/node_modules/foo/node_modules/requirejs/bin/r.js:1699:25)
at Timer.listOnTimeout (timers.js:119:15)
Es gibt zwei Dinge, die mir hier keinen Sinn ergeben.
In test.js, der Aufruf von
requirejs("bar")
kehrt undefiniert. Tatsächlich erscheint , dass das Laden des Moduls verzögert wird, als ob es eine zirkuläre Abhängigkeit gäbe, weil es erst nach der Rückkehr die Moduldefinition für die Bar ausgeführt wird.Warum denkt es, das ist eine anonyme
define()
? Mein Anwendungsfall erscheint nicht , um die Kriterien in der angegebenen URL zu erfüllen.
Um die zweite Ausgabe supress ich die in bar.js definieren Namensgebung versucht, wie folgt aus:
define('bar', [], function() {
...
die in dem Sinne wirkt, dass die Ausnahme ist weg, aber requirejs("bar")
noch kehrt undefiniert.
Das Beispiel ist eine vereinfachte Version von dem, was ich zu tun versuchen - im Grunde will ich haben eine Reihe von Modulen, die einige gemeinsame Komponenten enthalten, die in Browser verwendet werden kann und in Knoten, und einige spezifische Knotenkomponenten das wird nur in Knoten verwendet werden. Es wird Abhängigkeiten zwischen den Modulen geben.
Wenn es einen besseren Weg gibt, dann bin ich auch offen dafür.
requirejs ("foo") fordert ein bereits geladenes Modul an. Versuchen Sie requirejs (["foo", "bar"], (foo, bar) => {foo() + bar()}); –
@CoreyAlix nach [die requirjs node docs] (http://requirejs.org/docs/node.html) heißt es, dass man unter Knoten Module synchron mit 'requirejs (" foo ")' anfordern kann. Dies ist eine wichtige Voraussetzung, wenn Sie AMD-Module zur Verwendung in Node einbinden, da Node 'require()' synchron ist. – harmic
Wo befindet sich 'bar.js' relativ zu Ihren anderen Dateien? – Louis