Import
Einführung
Wenn wir entwickeln, müssen wir mehrere miteinander verbundene Codedateien verwenden, um Funktionalitäten zu organisieren und wiederzuverwenden, um Wiederholungen zu vermeiden, die Wartung durch die Zentralisierung nützlicher Funktionen zu erleichtern, was die Anzahl der Codezeilen insgesamt reduziert und folglich zu einer großen Reduzierung von Bugs führt.
Also zentralisieren wir den nützlichen Code in einer anderen Codedatei, die von den anderen importiert werden kann, die ihn leicht wiederverwenden können.
Hier werden einige Lösungen vorgestellt, die Netuno bietet, um die Wiederverwendung von Code zu ermöglichen.
Polyglotter Core
In jeder von Netuno unterstützten Programmiersprache können wir jede
Codedatei importieren, die sich im Ordner server/core der Anwendung befindet.
Die vereinfachte Form, die Netuno bietet, ist die Verwendung eines speziellen Kommentarformats
für den Import von Code, bei dem die kommentierte Zeile das Präfix _core: hat und danach
der Pfad der Codedatei ab dem Ordner server/core der Anwendung folgt.
Also um die Codedatei zu importieren:
server/core/beispiel/datei
Die Datei muss die Erweiterung gemäß der verwendeten Programmiersprache haben.
Es ist möglich, eine andere Datei am Anfang jeder Codedatei zu importieren, zum Beispiel in den Diensten.
Im Fall von JavaScript, Groovy und Kotlin:
// _core: beispiel/datei
...
Im Fall von Python und Ruby:
# _core: beispiel/datei
...
In diesem speziellen Importkommentar ist es nicht notwendig, die Erweiterung der Datei anzugeben, Netuno erkennt sie automatisch.
Die in der importierten Datei deklarierten Variablen, Konstanten, Funktionen, Klassen usw. werden für die Verwendung in der Datei verfügbar gemacht, die den Import mit diesem Kommentartyp am Anfang durchführt.
Um mehrere Dateien zu importieren, wiederholen Sie einfach den Importkommentar mit dem Pfad der anderen Dateien.
Im Fall von JavaScript, Groovy und Kotlin, um mehrere Dateien zu importieren:
// _core: beispiel/datei1
// _core: beispiel/datei2
// _core: beispiel/datei3
...
Im Fall von Python und Ruby, um mehrere Dateien zu importieren:
# _core: beispiel/datei1
# _core: beispiel/datei2
# _core: beispiel/datei3
...
Exec-Ressource
Durch die Ressource _exec können wir Code jederzeit während der Ausführung importieren.
Die in der importierten Codedatei deklarierten Variablen, Konstanten, Funktionen, Klassen usw. können verwendet werden.
core
Um programmatisch den Import einer Codedatei auszuführen, in diesem Fall innerhalb des Ordners
📁 server/core:
_exec.core('pfad/zur/datei')
Es ist nicht notwendig, die Erweiterung der Datei anzugeben, die Netuno automatisch erkennt.
services
Um programmatisch den Import einer Codedatei auszuführen, in diesem Fall innerhalb des Ordners
📁 server/services:
_exec.service('pfad/zur/datei')
Es ist nicht notwendig, die Erweiterung der Datei anzugeben, die Netuno automatisch erkennt.
JavaScript
Netuno bietet eine solide Grundlage für die Entwicklung in JavaScript, der am häufigsten verwendeten Sprache, besonders weil wir in JavaScript sowohl das Front-End als auch das Back-End programmieren können und so eine Full-Stack-Entwicklung mit derselben Programmiersprache ermöglichen.
Netuno analysiert den Code und erkennt automatisch, ob import (ECMAScript Modules) oder
require (CommonJS) verwendet wird.
Man sollte nicht das
import-Muster mitrequiremischen, es sollte eines oder das andere verwendet werden.
Damit können wir immer die Erweiterung .js in den Codedateien verwenden, und bei der Verwendung von Anweisungen mit import
verarbeitet Netuno sie als ECMAScript Modules und so können wir export default verwenden.
Die Verwendung von
importwird empfohlen, wann immer möglich, da es der moderne Standard ist.
Code importieren
Bei der Verwendung des nativen Imports wird, anders als in den vorherigen Beispielen, nur das importiert, was
explizit exportiert wurde, basierend auf dem Standard von CommonJS (require) oder ECMAScript Modules (import).
Im Ordner 📁 server befindet sich die Datei package.json, dort müssen wir folgende Anweisung haben:
...
"imports": {
"#actions/*": {
"default": "./actions/*"
},
"#components/*": {
"default": "./components/*"
},
"#core/*": {
"default": "./core/*"
},
"#reports/*": {
"default": "./reports/*"
},
"#services/*": {
"default": "./services/*"
},
"#setup/*": {
"default": "./setup/*"
},
"#templates/*": {
"default": "./templates/*"
}
},
...
Damit können wir jede Datei in jede andere Codedatei importieren, zum Beispiel:
import profil from "#core/lib/profil.js";
const dbProfil = profil.getAngemeldet();
Da import in der importierten Datei verwendet wird, wird export default verwendet:
import {_db, _user} from "@netuno/server-types";
export default {
getAngemeldet: () => {
return _db.form("profil")
.where(_db.where("profil_benutzer_id").equal(_user.id))
.first();
}
};
Es wird nicht empfohlen, in derselben Anwendung oder demselben Projekt die Verwendung von
import(ECMAScript Modules) undrequire(CommonJS) zu mischen, auch nicht in verschiedenen Dateien und Situationen, es ist vorzuziehen, immer eine einheitliche Standardisierung zu verfolgen. Wir empfehlen die Verwendung vonimport, da es die moderne Methode ist.
Alternativ, wenn require (CommonJS) anstelle von import (ECMAScript Modules) verwendet wird:
const profil = require("#core/lib/profil.js");
const dbProfil = profil.getAngemeldet();
Da require in der importierten Datei verwendet wird, wird module.exports verwendet:
const {_db, _user} = require("@netuno/server-types");
module.exports = {
getAngemeldet: () => {
return _db.form("profil")
.where(_db.where("profil_benutzer_id").equal(_user.id))
.first();
}
};
Code-Autovervollständigung und -Validierung
Um die Funktion der Code-Autovervollständigung mit integrierter Code-Validierung in den Editoren zu haben, müssen wir im Ordner
📁 server der Anwendung die Server-Typen installieren.
Die Server-Typen (
@netuno/server-types) sind die Definition aller Low-Code-Polyglot-Programmierressourcen in TypeScript, was es den Editoren ermöglicht, alles zu erkennen, was das polyglotte Low-Code-Framework von Netuno bietet, aber da es TypeScript ist, dient es nur dazu, den Code in JavaScript zu unterstützen.
Innerhalb des Ordners 📁 server installieren Sie die Server-Typen:
bun add @netuno/server-types
Damit können Sie im Code im Allgemeinen jede der in der Netuno-Framework verfügbaren Low-Code-Polyglot-Ressourcen importieren, zum Beispiel dieser Servicecode:
import {_req, _db, _out, _val} from "@netuno/server-types";
const name = _req.getString("name");
_db.form("produkt")
.set("name", name)
.insert();
_out.json(
_val.map()
.set("name", name)
.set("ergebnis", true)
);
Beachten Sie, dass der Editor den Code validiert und autovervollständigt, was äußerst nützlich ist und die Entwicklung sehr beschleunigt.
In einigen Editoren kann es erforderlich sein, eine Konfiguration/Aktivierung vorzunehmen, um den Ordner
📁 serverals Code-Stammverzeichnis zu erkennen, zum Beispiel erkennt Visual Studio Code es automatisch, aber in WebStorm muss man mit der rechten Maustaste auf den Ordnerserverklicken undMark Directory As > Resource Rootauswählen und das Projekt neu öffnen.
JS & NPM - Externe Abhängigkeiten
Es können externe NPM-Abhängigkeiten innerhalb des Ordners 📁 server in der Anwendung installiert werden, wo sich
die package.json befindet.
Allerdings, anders als wir zuvor empfohlen haben, verwenden wir zum Importieren externer Bibliotheken
require, und in diesem Fall können wir es mit import von internen Projektdateien mischen, was nicht sehr
elegant ist, aber möglich.
Um also eine Abhängigkeit hinzuzufügen, installieren Sie sie einfach mit dem Befehl bun add.
Zum Beispiel ist es möglich, momentjs zu installieren:
bun add moment
Zum Importieren von Abhängigkeiten wird require verwendet, hier ein Beispiel:
import {_out} from "@netuno/server-types";
const moment = require('moment')
_out.json(moment().format())
Ein weiteres Beispiel mit dayjs, installieren Sie zuerst:
bun add dayjs
import {_out} from "@netuno/server-types";
const dayjs = require("dayjs");
_out.json(dayjs().format());
Sehen Sie ein vollständiges Beispiel mit date-fns, installieren Sie zuerst:
bun add date-fns
import {_out} from "@netuno/server-types";
import profil from "#core/lib/profil.js";
const dbProfil = profil.getAngemeldet();
const { formatDistance, subDays } = require('date-fns');
_out.println(formatDistance(
subDays(new Date(), 3), new Date(), { addSuffix: true }
));
Sich auf externe Bibliotheken zu verlassen, sind Ausnahmesituationen; normalerweise finden wir alles, was wir brauchen, im polyglotten Low-Code-Framework von Netuno.
NodeJS-Native Module
Da GraalVM nicht vollständig mit den nativen Modulen von NodeJS kompatibel ist, ist es zur Umgehung möglich, eine größere Kompatibilität mit externen Abhängigkeiten zu erreichen, die eine alternative Lösung für diese Module implementieren.
Es ist möglich, einige externe Abhängigkeiten als Alternative zu installieren, die die Kompatibilität bieten, als wären es native Module.
Es folgt die Liste der als Alternativen verwendeten Module, um die nativen Module von NodeJS zu ersetzen, und die jeweiligen Installationsbefehle:
- Buffer:
bun add buffer - Events:
bun add events - Util:
bun add util - Path:
bun add path-browserify - Stream:
bun add stream-browserify - HTTP:
bun add http-browserify - HTTPS:
bun add https-browserify
Denken Sie daran, Sie müssen diese oben genannten Module im Ordner 📁 server innerhalb der Anwendung installieren, die
Kompatibilität mit den nativen Modulen von NodeJS wird bereitgestellt, wobei diese alternativen Module verwendet werden.
Fazit
Wir können unseren Code auf verschiedene Weise organisieren, aber Code wiederzuverwenden und Wiederholungen zu vermeiden ist immer sehr wichtig.
Je mehr Codezeilen es gibt, desto größer ist die Wahrscheinlichkeit, dass Bugs auftreten.
Denken Sie daran, Ihren Code gut zu organisieren und seine Wiederverwendung zu zentralisieren, es erleichtert die Wartung, vermeidet Bugs und steigert die Produktivität im Allgemeinen.
Obwohl es noch einige Einschränkungen bei der Verwendung externer Abhängigkeiten gibt, arbeiten wir daran, das Ökosystem zu verbessern.
In der Zwischenzeit bietet Netuno verschiedene Low-Code- und Polyglot-Ressourcen, die die meisten Anforderungen abdecken.