So erstellen und veröffentlichen Sie ein npm-Paket
Sie haben Hunderte von Paketen mit npm install installiert. Jetzt möchten Sie Ihr eigenes veröffentlichen. Der Prozess erscheint zunächst unkompliziert, bis Sie veraltete Tutorials entdecken, die Node 12, reine CommonJS-Setups und langlebige Tokens empfehlen, die in CI-Secrets gespeichert werden.
Dieser Leitfaden führt Sie durch das Erstellen und Veröffentlichen eines npm-Pakets unter Verwendung moderner, sicherer Praktiken, die auch 2025 noch korrekt sein werden. Wir erstellen ein einfaches Utility, konfigurieren es ordnungsgemäß und veröffentlichen es mit npm Trusted Publishing.
Wichtigste Erkenntnisse
- Verwenden Sie ESM mit dem korrekten
exports-Feld anstelle des veraltetenmain-Feldes für moderne Paketauflösung - Kompilieren Sie TypeScript zu JavaScript mit Deklarationsdateien, anstatt rohes TypeScript auszuliefern
- Aktivieren Sie Zwei-Faktor-Authentifizierung und verwenden Sie npm Trusted Publishing über GitHub Actions OIDC für sichere automatisierte Releases
- Überprüfen Sie immer Ihre Paketinhalte mit
npm pack --dry-runvor der Veröffentlichung
Voraussetzungen
Stellen Sie vor dem Start sicher, dass Sie Folgendes haben:
- Node.js 18 oder neuer installiert
- Einen GitHub-Account
- Grundlegende Vertrautheit mit npm als Nutzer
Initialisieren Sie Ihr ESM-First npm-Paket-Setup
Erstellen Sie ein neues Verzeichnis und initialisieren Sie Ihr Projekt:
mkdir use-toggle && cd use-toggle
npm init -y
git init
Wir erstellen einen einfachen React-Hook namens useToggle. Dieses Beispiel demonstriert die Veröffentlichung eines TypeScript-npm-Pakets mit korrekten Entry Points.
Konfigurieren Sie package.json für modernes Publishing
Ersetzen Sie Ihre package.json mit einer ordnungsgemäß konfigurierten Version:
{
"name": "@yourusername/use-toggle",
"version": "0.1.0",
"description": "A simple React hook for boolean toggle state",
"keywords": ["react", "hook", "toggle", "state"],
"license": "MIT",
"author": "Your Name",
"repository": {
"type": "git",
"url": "git+https://github.com/yourusername/use-toggle.git"
},
"type": "module",
"exports": {
".": {
"types": "./dist/index.d.ts",
"default": "./dist/index.js"
}
},
"files": ["dist"],
"engines": {
"node": ">=18"
},
"peerDependencies": {
"react": ">=18"
},
"devDependencies": {
"typescript": "^5.4.0",
"react": "^18.0.0",
"@types/react": "^18.0.0"
},
"scripts": {
"build": "tsc",
"prepublishOnly": "npm run build"
}
}
Wichtige Punkte für dieses ESM-First npm-Paket-Setup:
type: "module"deklariert ESM als Standardexportsersetzt das veraltetemain-Feld – so löst modernes Node Entry Points auffilessteuert, was veröffentlicht wird (nurdist/)enginesspezifiziert Node 18+, wodurch Legacy-Kompatibilitätsprobleme vermieden werden
Richten Sie die TypeScript-Kompilierung ein
Erstellen Sie tsconfig.json:
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"declaration": true,
"outDir": "dist",
"rootDir": "src",
"strict": true,
"skipLibCheck": true
},
"include": ["src"]
}
Erstellen Sie src/index.ts:
import { useState, useCallback } from 'react';
export function useToggle(initial = false): [boolean, () => void] {
const [value, setValue] = useState(initial);
const toggle = useCallback(() => setValue(v => !v), []);
return [value, toggle];
}
Führen Sie npm run build aus, um zu kompilieren. Sie erhalten dist/index.js und dist/index.d.ts – JavaScript plus Typdeklarationen, nicht rohes TypeScript.
Sicheres npm-Paket-Publishing in 2025
Erstellen Sie Ihren npm-Account mit 2FA
- Registrieren Sie sich auf npmjs.com
- Aktivieren Sie sofort die Zwei-Faktor-Authentifizierung (bevorzugen Sie WebAuthn/Passkeys)
- Alle neuen Pakete haben standardmäßig 2FA-Durchsetzung aktiviert
- Mit dem neuen sitzungsbasierten Login-Modell erfordert die Veröffentlichung jedes Pakets – neu oder bestehend – 2FA während der Sitzung
Ihre erste manuelle Veröffentlichung
npm login erstellt jetzt einen zweistündigen Sitzungstoken. Diese Tokens:
- Erscheinen nicht in der npm-Benutzeroberfläche
- Laufen automatisch nach zwei Stunden ab
- Können nicht in CI/CD wiederverwendet werden
- Erzwingen immer 2FA vor der Veröffentlichung
Ältere Tools, die sich über den veralteten CouchDB-Endpunkt authentifizieren, erhalten während der Übergangsphase ebenfalls zweistündige Sitzungstokens.
Für Ihr erstes Release:
npm login
npm publish --access public
Das Flag --access public ist für Scoped Packages auf kostenlosen Accounts erforderlich.
Überprüfen Sie Ihr Paket unter https://www.npmjs.com/package/@yourusername/use-toggle.
Discover how at OpenReplay.com.
npm Trusted Publishing mit CI
Alte Tutorials sagen Ihnen, Sie sollen ein NPM_TOKEN erstellen und es als Repository-Secret speichern. Dieser Ansatz ist jetzt obsolet: Klassische Tokens wurden dauerhaft widerrufen, und langlebige CI-Tokens werden nicht mehr unterstützt.
Die moderne Alternative ist npm Trusted Publishing über GitHub Actions OIDC. GitHub beweist npm seine Identität, und npm stellt automatisch kurzlebige Credentials aus – kein gespeicherter Token erforderlich.
Konfigurieren Sie Trusted Publishing
- Gehen Sie auf npmjs.com zu Ihrem Paket → Settings → Publishing access
- Fügen Sie einen neuen „Trusted Publisher” mit Ihren GitHub-Repository-Details hinzu
Erstellen Sie den Workflow
Fügen Sie .github/workflows/publish.yml hinzu:
name: Publish
on:
release:
types: [published]
jobs:
publish:
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '22'
registry-url: 'https://registry.npmjs.org'
- run: npm ci
- run: npm publish --provenance --access public
Das Flag --provenance fügt eine kryptografische Attestierung hinzu, die Ihr Paket mit seinem Quell-Repository verknüpft – eine Supply-Chain-Sicherheitsfunktion, die npm 2023 eingeführt hat.
Wenn OIDC nicht verwendet werden kann (z. B. bei selbst gehosteten Runnern), erstellen Sie einen kurzlebigen granularen Zugriffstoken mit:
npm token create
Granulare Tokens können 2FA umgehen für CI-Publishing und müssen innerhalb von 90 Tagen ablaufen.
Was Sie in alten Tutorials sehen werden
Vermeiden Sie diese veralteten Muster:
"main": "index.js"ohneexports– verwenden Sieexportsfür korrekte ESM-Auflösung- Targeting Node 10/12/14 – Node 18+ wird unterstützt, aber neue Pakete sollten moderne LTS-Versionen anvisieren (Node 20 oder 22)
- Reine CommonJS-Pakete – ESM ist der Standard; liefern Sie ESM-First aus
- Permanentes
NPM_TOKENin jedem Workflow – klassische Tokens sind vollständig widerrufen; verwenden Sie tokenloses Trusted Publishing
Überprüfen vor der Veröffentlichung
Testen Sie Ihr Paket immer lokal vor der Veröffentlichung:
npm pack --dry-run
Dies zeigt genau, welche Dateien enthalten sein werden. Wenn Sie src/ oder node_modules/ sehen, muss Ihr files-Feld angepasst werden.
Fazit
Um ein npm-Paket in 2025 zu erstellen und zu veröffentlichen: Verwenden Sie ESM mit korrektem exports, kompilieren Sie TypeScript zu JavaScript mit Deklarationen, aktivieren Sie 2FA und automatisieren Sie Releases mit npm Trusted Publishing. Überspringen Sie die Legacy-Muster – sie werden Ihnen und Ihren Nutzern Kopfschmerzen bereiten.
FAQs
Veröffentlichen Sie kompiliertes JavaScript mit Deklarationsdateien. Liefern Sie den dist-Ordner aus, der Ihr kompiliertes JS und generierte .d.ts-Dateien enthält. Dies gewährleistet Kompatibilität über verschiedene TypeScript-Versionen und Build-Tools hinweg. Rohes TypeScript zwingt Nutzer, Ihren Code zu kompilieren, was zu Versionskonflikten und langsameren Builds führen kann.
Verwenden Sie dependencies für Pakete, die Ihr Code bündelt und ausliefert. Verwenden Sie peerDependencies für Pakete, die Nutzer bereitstellen müssen, wie React für einen React-Hook. Dies verhindert doppelte Kopien großer Bibliotheken im finalen Bundle. Ihr Paket erwartet die Version des Nutzers, anstatt eine eigene zu bündeln.
Scoped Packages wie @username/package-name sind standardmäßig privat auf npm. Kostenlose npm-Accounts können keine privaten Pakete veröffentlichen, daher müssen Sie explizit --access public setzen. Dieses Flag teilt npm mit, das Paket öffentlich zu veröffentlichen. Sie benötigen es nur für die erste Veröffentlichung; nachfolgende Versionen erben die Zugriffsstufe.
Verwenden Sie npm deprecate @scope/package, um Nutzer zu warnen, ohne das Paket zu entfernen. Vollständiges Depublizieren mit npm unpublish ist auf Pakete beschränkt, die innerhalb von 72 Stunden veröffentlicht wurden oder minimale Downloads haben. Für aufgegebene Pakete wird Deprecation bevorzugt, da es Nutzer warnt und gleichzeitig bestehende Installationen bewahrt.
Understand every bug
Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.