Node.js ist eine JavaScript Runtime
Verwendung für:
npm = Node package manager
ist in der node.js-Installation beinhaltet
Download von https://nodejs.org
Major Releases alle 6 Monate; Long-Term-Support Releases alle 12 Monate
Die npm Registry enthält hauptsächlich open source JavaScript Pakete
Beispiele: most depended upon packages
wichtige Package Manager für die npm Registry:
Sowohl öffentliche Pakete als auch private Projekte werden über die Konfigurationsdatei package.json konfiguriert
Um Abhängigkeiten zu installieren können wir mit einer leeren package.json beginnen:
{}
Alternative: package.json mit Inhalten mittels npm init
(oder npm init -y
für Standardoptionen) erstellen
Beispiel zur Installation von Abhängigkeiten:
npm install lodash bootstrap
Wenn wir eine Library entwickeln, die wir in der npm Registry veröffentlichen wollen:
Abhängigkeiten, die nur für die Entwicklung, nicht für die Verwendung von Bedeutung sind werden als dev-dependencies installiert:
npm install eslint --save-dev
Auswirkungen der bisherigen npm install
Befehle:
package.json
- listet Minimalversionen der gerade installierten Paketenode_modules
- Ordner, der alle installierten Pakete enthältpackage-lock.json
- listet exakte Versionen aller Pakete in node_modules
aufDie Datei package.json
listet nun Abhängigkeiten gemeinsam mit deren Version auf.
Die Versionen verwenden typischerweise semantic versioning: major.minor.patch
Mögliche Konfigurationen:
"bootstrap": "4.3.1"
- genau diese Version"bootstrap": "~4.3.1"
- Updates der Patch-Version sind erlaubt - z.B. auf 4.3.2
"bootstrap": "^4.3.1"
- Updates der Minor-Version sind erlaubt - z.B. auf 4.4.0
package-lock.json
listet exakte Versionen aller Abhängigkeiten (und derer Abhängigkeiten ...)
enthält die tatsächlichen Pakete
sollte nicht unter Versionskontrolle stehen - kann stattdessen aus package.json
neu generiert werden - durch ausführen von npm install
ohne Argumente
Npm kann verwendet werden, um Scripts / Befehle auszuführen, z.B.:
npm run test
- würde Unit Tests ausführennpm run build
- würde einen Build erstellennpm run start
npm run deploy
Manche npm Scripts haben Abkürzungen, insbesondere npm test
und npm start
Npm Scripts werden in package.json
konfiguriert:
{
"scripts": { "start": "node run-server.js" }
}
Node Pakete können global auf einem Computer installiert werden oder direkt aus der npm Registry ausgeführt werden
direkte Ausführung (ohne Installation):
npx cowsay hello
globale Installation von cowsay
:
npm install -g cowsay
cowsay hello
hello.js:
console.log('Hello world!');
ausführen:
node hello.js
Mit Debugging: F5
Ohne Debugging: Ctrl + F5
festlegen, wie JavaScript-Dateien ausgeführt werden sollen:
in der Befehlspalette, suche nach Debug: Open launch.json und wähle Node.js als Umgebung
der Befehl erstellt eine neue Datei unter .vscode/launch.json
Mögliche Konfigurationseinträge (.vscode/launch.json):
{
"name": "Run current file",
"type": "node",
"request": "launch",
"program": "${file}",
"skipFiles": ["<node_internals>/**"]
}
{
"name": "Run index.js",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/index.js",
"skipFiles": ["<node_internals>/**"]
}
Node-Programme können Objekte aus sogenannten Modulen importieren
Kategorien:
standard JavaScript Imports:
import { platform, release } from 'node:os';
older, node-specific variant:
const { platform, release } = require('node:os');
für Verwendung der import
-Syntax: in package.json als "module" deklarieren:
{
"type": "module"
}
Eine JavaScript-Datei, die Objekte exportiert, ist ein sogenanntes Modul
Beispiel für ein Modul mit moderner Syntax:
const message1 = 'hello!';
const message2 = 'have a nice day!';
export { message1, message2 };
es kann einen default Export geben
const mainMessage = 'xyz';
const message1 = 'hello!';
const message2 = 'have a nice day!';
export { message1, message2 };
export default mainMessage;
Lokale Module werden mittels relativer Dateipfade importiert
import mainMessage, { message1 } from './messages.js';
ältere, node-spezifische, Syntax für den Export:
const message1 = 'hello!';
const message2 = 'have a nice day!';
module.exports.message1 = message1;
module.exports.message2 = message2;
// shorthand
exports.message3 = 'Bye';
default Export:
const mainMessage = 'xyz';
module.exports = mainMessage;
in node gibt es andere globale Objekte als im Browser
nur im Browser:
document
localStorage
, sessionStorage
window
(globaler Namespace) - Alternativname globalThis
nur in Node
process
(z.B. process.argv
)global
(globaler Namespace) - Alternativname globalThis
process
ist eine globale Variable
process.argv
(Kommandozeilenparameter)process.cwd()
process.exit()
Übung: schreibe ein Programm, das wie folgt aufgerufen werden kann:
node sum.js 1 2 3
output:
the sum is 6
Beispiele:
asynchron via Promises (empfohlen):
import { readFile } from 'node:fs/promises';
asynchron via Callbacks:
import { readFile } from 'node:fs';
synchron:
import { readFileSync } from 'node:fs';
import { writeFile } from 'node:fs/promises';
await writeFile('message.txt', 'hello world');
dies erstellt eine Textdatei mit UTF-8 als Encoding
const fileContent = await readFile('package.json', 'utf8');
Beim Lesen von Dateien als Text muss ein Encoding angegeben werden (in diesem Fall UTF-8)
const folderContent = await readdir('.');
console.log(folderContent);
import http from 'http';
const requestHandler = (req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World\n');
};
const server = http.createServer(requestHandler);
server.listen({ port: 3000 });
(siehe https://nodejs.org/en/docs/guides/getting-started-guide/)