Zum Inhalt springen
Deutsch

Node.js

actor-ts läuft auf Node.js 20 und neuer. Voll unterstützt; die CI des Frameworks läuft neben Bun auch gegen Node.

GrundDetail
Managed-Platform-SupportAWS Lambda, Cloud Functions, Vercel, Cloudflare Pages akzeptieren alle Node.
LTS-GründeManche Compliance-Regime verlangen Node’s LTS-Branches.
Bestehende Node-InfrastrukturBestehende Build-/Deploy-/Monitor-Stacks integrieren sich natürlich.
Breitere native-Modul-UnterstützungManche nativen Module (z. B. spezifische Verschlüsselungsbibliotheken) hinken auf Bun hinterher.

Für neue Greenfield-Projekte ohne diese Einschränkungen ist Bun meist vorzuziehen — weniger Peer-Deps, schnellerer Start.

Terminal-Fenster
nvm install 20
nvm use 20
node --version # v20.0.0 oder neuer

Für Docker:

FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
CMD ["node", "dist/main.js"]

Das Framework braucht:

  • globalThis.crypto.subtle (WebCrypto) — auf Node 20+ vorhanden; genutzt für AES-GCM in Object-Storage- Verschlüsselung.
  • Eingebautes fetch — stabil auf Node 18+.
  • AsyncLocalStorage — lang stabil.
  • node:test — braucht Node 20.

Node 18 funktioniert vielleicht für die Core-Actor-API, wird aber nicht aktiv getestet — melde Bugs nur gegen Node 20+.

Ein paar Features unlocken nativ auf neueren Node-Versionen (ohne Peer-Dep-Fallback):

  • Natives WebSocket — globaler WebSocket-Konstruktor ist auf Node 22+ eingebaut. Auf Node 20 installiere die ws-Peer-Dep für ServerWebSocketActor / WebSocketActor.
  • Native zstd-Kompressionnode:zlib bekam zstdCompress / zstdDecompress auf Node 22.15. Auf älterem Node installiere die fzstd-Peer-Dep für Object-Storage- zstd-Codecs.

Beide Peer-Dep-Pfade sind gut getestet; „braucht eine Peer-Dep” heißt nicht „kaputt auf Node 20.”

Node-Setups brauchen ein paar Peer-Deps, die das Framework nicht mitliefert:

SubsystemPeer-Dep
SQLite-Journal / -Snapshot-Store / -Statebetter-sqlite3
WebSocket-Server (ServerWebSocketActor)ws
Kafkakafkajs
MQTTmqtt
AMQPamqplib
NATSnats
Redisredis
gRPC@grpc/grpc-js @grpc/proto-loader
Cassandracassandra-driver
OTel@opentelemetry/api @opentelemetry/sdk-* + Exporter

Installiere nur, was du nutzt:

Terminal-Fenster
npm install actor-ts ts-pattern
# Plus pro Subsystem:
npm install better-sqlite3 # für SQLite-Persistenz
npm install kafkajs # für Kafka-Actor

Die Lazy-Imports des Frameworks heißen, fehlende Peer-Deps brechen ungenutzte Features nicht — wenn du nie einen KafkaActor instanziierst, kannst du kafkajs weglassen.

Terminal-Fenster
npm install better-sqlite3

Dann:

import { SqliteJournal } from 'actor-ts';
// Erkennt automatisch better-sqlite3 auf Node.
new SqliteJournal({ path: '/var/lib/events.db' });

better-sqlite3 ist ein natives Modul — Erst-Install verlangt Build-Tools (gyp, Python, einen C++-Compiler). Die meisten Linux-Base-Images haben diese; Alpine-basierte Images brauchen vielleicht:

RUN apk add --no-cache python3 make g++

Für vorgefertigte Binaries:

Terminal-Fenster
npm install better-sqlite3 --prefer-offline

Die meisten Plattformen haben vorgefertigte Artefakte; du baust selten aus dem Quellcode.

Terminal-Fenster
# Mit Node's nativem Runner:
node --test --test-name-pattern="..."
# Mit Vitest:
npx vitest
# Mit Jest:
npx jest

TestKit funktioniert mit allen dreien. Die eigenen Tests des Frameworks nutzen bun:test, aber die TestKit-API ist runner-agnostisch.

actor-ts liefert ESM (type: "module" in package.json). In Node:

// In der package.json deiner App:
{
"type": "module"
}
// actor-ts importieren:
import { ActorSystem } from 'actor-ts';

Für CommonJS-Projekte bräuchtest du einen Build-Schritt (esbuild, tsc mit ES-Module-Interop), um zu überbrücken. Einfacher: nutze ESM durchgängig.

Grobe Zahlen vs Bun:

  • Tell-Durchsatz: ~6-8 M msgs/sec (langsamer als Bun).
  • HTTP-Durchsatz: vergleichbar für Fastify-basierte Server.
  • Start-Zeit: 300-500 ms vs Bun’s sub-100 ms.

Für lang laufende Produktionsdienste zählt die Start-Lücke nicht. Für hochdurchsatz-starke Tight-Loop-Arbeit gewinnt Bun.

# Lambda-Function-Definition:
Runtime: nodejs20.x
MemorySize: 1024
Handler: dist/main.handler

Cold-Start dominiert bei kurzen Invocations. Pre-warm via Provisioned Concurrency für latenz-sensitive Workloads.

Das Cluster-Modell passt nicht gut zu Lambda — Actor erwarten einen lang laufenden Prozess. Für Lambda nutze actor-ts als Single-Actor-per-Invocation-Muster (oder nutze eine andere Architektur für kurzlebige Workloads).

Dieselben Einschränkungen — diese Plattformen sind kurzlebige Prozess-Umgebungen. Single-Actor-Muster funktionieren; Clustering nicht.

Natürlicher Fit. Nutze systemd / PM2 (siehe Process Manager) oder K8s (siehe Kubernetes-Deployment).