Node und npm

Node.js und npm

Node.js

Node.js ist eine JavaScript Runtime

Verwendung für:

  • lokales ausführen von Scripts
  • Entwicklerwerkzeuge (z.B. Build-Prozess, Unittests, ...)
  • Backend ausführen

npm

npm = Node package manager

ist in der node.js-Installation beinhaltet

Node.js Installation

Download von https://nodejs.org

Major Releases alle 6 Monate; Long-Term-Support Releases alle 12 Monate

npm

npm Registry

Die npm Registry enthält hauptsächlich open source JavaScript Pakete

Beispiele: most depended upon packages

Package Manager

wichtige Package Manager für die npm Registry:

  • npm: Node package manager, in node.js beinhaltet
  • pnpm
  • yarn

Paketkonfiguration

Sowohl öffentliche Pakete als auch private Projekte werden über die Konfigurationsdatei package.json konfiguriert

Paketkonfiguration

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

Abhängigkeiten hinzufügen

Beispiel zur Installation von Abhängigkeiten:

npm install lodash bootstrap

Abhängigkeiten hinzufügen

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

Abhängigkeiten hinzufügen

Auswirkungen der bisherigen npm install Befehle:

  • package.json - listet Minimalversionen der gerade installierten Pakete
  • node_modules - Ordner, der alle installierten Pakete enthält
  • package-lock.json - listet exakte Versionen aller Pakete in node_modules auf

Abhängigkeiten in package.json

Die 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

Abhängigkeiten in package-lock.json

package-lock.json listet exakte Versionen aller Abhängigkeiten (und derer Abhängigkeiten ...)

node_modules Ordner

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 Scripts

Npm kann verwendet werden, um Scripts / Befehle auszuführen, z.B.:

  • npm run test - würde Unit Tests ausführen
  • npm run build - würde einen Build erstellen
  • npm run start
  • npm run deploy

Manche npm Scripts haben Abkürzungen, insbesondere npm test und npm start

npm scripts

Npm Scripts werden in package.json konfiguriert:

{
  "scripts": { "start": "node run-server.js" }
}

Globale Installation und npx

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

Ausführen von Node-Programmen

Ausführen von Programmen im Terminal

hello.js:

console.log('Hello world!');

ausführen:

node hello.js

Ausführen von Programmen in VS Code

Mit Debugging: F5

Ohne Debugging: Ctrl + F5

Ausführen von Programmen in VS Code

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

Ausführen von Programmen in VS Code

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>/**"]
}

Module

Module

Node-Programme können Objekte aus sogenannten Modulen importieren

Kategorien:

  • eingebaute Module (built-ins)
  • Module von npm
  • Module im lokalen Verzeichnis

Importieren von Modulen

standard JavaScript Imports:

import { platform, release } from 'node:os';

older, node-specific variant:

const { platform, release } = require('node:os');

Importieren von Modulen

für Verwendung der import-Syntax: in package.json als "module" deklarieren:

{
  "type": "module"
}

Lokale Module

Lokale Module

Eine JavaScript-Datei, die Objekte exportiert, ist ein sogenanntes Modul

Lokale Module

Beispiel für ein Modul mit moderner Syntax:

const message1 = 'hello!';
const message2 = 'have a nice day!';

export { message1, message2 };

Lokale Module

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

Lokale Module werden mittels relativer Dateipfade importiert

import mainMessage, { message1 } from './messages.js';

Lokale Module

ä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;

Globals und eingebaute Module

Globals

in node gibt es andere globale Objekte als im Browser

Globals

nur im Browser:

  • document
  • localStorage, sessionStorage
  • window (globaler Namespace) - Alternativname globalThis
  • ...

nur in Node

  • process (z.B. process.argv)
  • global (globaler Namespace) - Alternativname globalThis
  • ...

Eingabaute Module (built-in)

  • assert
  • fs (file system)
  • http(s)
  • net (TCP)
  • os
  • path
  • ...

Process

Process

process ist eine globale Variable

  • process.argv (Kommandozeilenparameter)
  • process.cwd()
  • process.exit()
  • ...

Process

Übung: schreibe ein Programm, das wie folgt aufgerufen werden kann:

node sum.js 1 2 3

output:

the sum is 6

Lesen und Schreiben von Textdateien

Lesen und Schreiben von Dateien

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';

Schreiben von Textdateien

import { writeFile } from 'node:fs/promises';

await writeFile('message.txt', 'hello world');

dies erstellt eine Textdatei mit UTF-8 als Encoding

Lesen von Textdateien

const fileContent = await readFile('package.json', 'utf8');

Beim Lesen von Dateien als Text muss ein Encoding angegeben werden (in diesem Fall UTF-8)

Lesen von Ordnerinhalten

const folderContent = await readdir('.');

console.log(folderContent);

HTTP server mit node

Betreiben eines HTTP-Servers mit node

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/)

HTTP Server frameworks

  • connect: Middleware
  • express: Middleware, Routing