Es gibt einige Javascript-Bibliotheken von Drittanbietern mit einigen Funktionen, die ich auf einem Node.js-Server verwenden möchte. (Insbesondere möchte ich eine QuadTree-Javascript-Bibliothek verwenden, die ich gefunden habe.) Diese Bibliotheken sind jedoch nur einfache .js
Dateien und keine "Node.js-Bibliotheken".
Daher folgen diese Bibliotheken nicht der exports.var_name
Syntax, die Node.js für seine Module erwartet. Soweit ich das bedeutet , verstehen , wenn Sie tun , module = require('module_name');
oder module = require('./path/to/file.js');
Sie werden mit einem Modul ohne öffentlich zugängliche Funktionen am Ende, usw.
Meine Frage lautet dann: "Wie lade ich eine beliebige Javascript-Datei in Node.js, damit ich ihre Funktionalität nutzen kann, ohne sie neu schreiben zu müssen exports
?"
Ich bin sehr neu bei Node.js, also lassen Sie mich bitte wissen, ob mein Verständnis, wie es funktioniert, ein eklatantes Loch enthält.
BEARBEITEN : Ich recherchiere mehr und sehe jetzt, dass das von Node.js verwendete Lademuster des Moduls Teil eines kürzlich entwickelten Standards zum Laden von Javascript-Bibliotheken namens CommonJS ist . Es steht dies direkt auf der Modul-Dokumentseite für Node.js , aber das habe ich bis jetzt verpasst.
Es kann sein, dass die Antwort auf meine Frage lautet: "Warten Sie, bis die Autoren Ihrer Bibliothek dazu gekommen sind, eine CommonJS-Schnittstelle zu schreiben, oder tun Sie es selbst."
quelle
Antworten:
Es gibt eine viel bessere Methode als die
eval
: dievm
Modul.Hier ist zum Beispiel mein
execfile
Modul, das das Skriptpath
entweder imcontext
oder im globalen Kontext auswertet :Und es kann so verwendet werden:
Wo
example.js
enthält:Der große Vorteil dieser Methode besteht darin, dass Sie die vollständige Kontrolle über die globalen Variablen im ausgeführten Skript haben: Sie können benutzerdefinierte Globals (via
context
) übergeben, und alle vom Skript erstellten Globals werden hinzugefügtcontext
. Das Debuggen ist auch einfacher, da Syntaxfehler und dergleichen mit dem richtigen Dateinamen gemeldet werden.quelle
runInNewContext
verwenden Sie den globalen Kontext , wenncontext
(anders als bezeichnetsandbox
, in docs) nicht definiert ist? (Dieser Punkt wurde durch keine Dokumente, die ich gefunden habe, klargestellt)vm
Modul in diesem Fall bieten?Hier ist meiner Meinung nach die "richtige" Antwort für diese Situation.
Angenommen, Sie haben eine Skriptdatei namens
quadtree.js
.Sie sollten einen Benutzer erstellen
node_module
, der diese Art von Verzeichnisstruktur hat ...Alles in deinem
./node_modules/quadtree/quadtree-lib/
Verzeichnis sind Dateien aus Ihrer Drittanbieter-Bibliothek.Dann
./node_modules/quadtree/index.js
lädt Ihre Datei diese Bibliothek einfach aus dem Dateisystem und erledigt die Aufgabe, die Dinge richtig zu exportieren.Jetzt können Sie Ihr
quadtree
Modul wie jedes andere Knotenmodul verwenden ...Ich mag diese Methode, weil Sie den Quellcode Ihrer Drittanbieter-Bibliothek nicht ändern müssen - daher ist die Wartung einfacher. Alles, was Sie beim Upgrade tun müssen, ist den Quellcode zu überprüfen und sicherzustellen, dass Sie immer noch die richtigen Objekte exportieren.
quelle
npm link
in Ihre Anwendung aufzunehmen. Dann wird es so behandelt, als wäre es ein natives Node.js-Paket.Der einfachste Weg ist:
eval(require('fs').readFileSync('./path/to/file.js', 'utf8'));
Dies funktioniert hervorragend zum Testen in der interaktiven Shell.quelle
AFAIK, so müssen Module geladen werden. Anstatt jedoch alle exportierten Funktionen an das
exports
Objekt anzuheften, können Sie sie auch anheftenthis
(was sonst das globale Objekt wäre).Wenn Sie also die anderen Bibliotheken kompatibel halten möchten, können Sie dies tun:
oder wenn die externe Bibliothek bereits einen eigenen Namespace hat, z. B.
jQuery
(nicht, dass Sie diesen in einer serverseitigen Umgebung verwenden können):In einer Nicht-Knoten-Umgebung
this
würde das globale Objekt aufgelöst und somit zu einer globalen Variablen gemacht ... was es bereits war. Es sollte also nichts kaputt machen.Edit : James Herdman hat eine nette Beschreibung über node.js für Anfänger, in der dies ebenfalls erwähnt wird.
quelle
Ich bin mir nicht sicher, ob ich das tatsächlich verwenden werde, weil es eine ziemlich hackige Lösung ist, aber eine Möglichkeit, dies zu umgehen, besteht darin, einen kleinen Mini-Modul-Importer wie diesen zu erstellen ...
In der Datei
./node_modules/vanilla.js
:Wenn Sie dann die Funktionalität Ihrer Bibliothek nutzen möchten, müssen Sie manuell auswählen, welche Namen exportiert werden sollen.
Also für eine Bibliothek wie die Datei
./lib/mylibrary.js
...Wenn Sie seine Funktionalität in Ihrem Node.js-Code verwenden möchten ...
Ich weiß allerdings nicht, wie gut das alles in der Praxis funktionieren würde.
quelle
Ich konnte es zum Laufen bringen, indem ich ihr Skript sehr einfach aktualisierte und einfach hinzufügte
module.exports =
und gegebenenfalls ...Zum Beispiel habe ich ihre Datei genommen und nach './libs/apprise.js' kopiert. Dann wo es anfängt
Ich habe die Funktion folgendermaßen zugewiesen
module.exports =
:So kann ich die Bibliothek folgendermaßen in meinen Code importieren :
Und ich war gut zu gehen. YMMV, das war mit Webpack .
quelle
Eine einfache
include(filename)
Funktion mit besserer Fehlermeldung (Stapel, Dateiname usw.) füreval
: Fehler:Mit nodejs wird es jedoch noch schmutziger: Sie müssen Folgendes angeben:
Andernfalls können Sie keine globalen Variablen in Dateien verwenden, die in enthalten sind
include(...)
.quelle