Como Criar e Publicar um Pacote npm
Você já instalou centenas de pacotes com npm install. Agora você quer publicar o seu próprio. O processo parece simples até você descobrir tutoriais desatualizados recomendando Node 12, configurações apenas com CommonJS e tokens de longa duração armazenados em secrets de CI.
Este guia orienta você na criação e publicação de um pacote npm usando práticas modernas e seguras que ainda estarão corretas em 2025. Vamos construir um utilitário simples, configurá-lo adequadamente e publicá-lo com npm Trusted Publishing.
Principais Pontos
- Use ESM com o campo
exportsadequado em vez do campo legadomainpara resolução moderna de pacotes - Compile TypeScript para JavaScript com arquivos de declaração em vez de enviar TypeScript bruto
- Habilite autenticação de dois fatores e use npm Trusted Publishing via GitHub Actions OIDC para releases automatizados seguros
- Sempre verifique o conteúdo do seu pacote com
npm pack --dry-runantes de publicar
Pré-requisitos
Antes de começar, certifique-se de ter:
- Node.js 18 ou posterior instalado
- Uma conta no GitHub
- Familiaridade básica com npm como consumidor
Inicialize sua Configuração de Pacote npm ESM-First
Crie um novo diretório e inicialize seu projeto:
mkdir use-toggle && cd use-toggle
npm init -y
git init
Vamos construir um hook React simples chamado useToggle. Este exemplo demonstra a publicação de pacotes npm TypeScript com pontos de entrada adequados.
Configure o package.json para Publicação Moderna
Substitua seu package.json por uma versão adequadamente configurada:
{
"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"
}
}
Pontos-chave para esta configuração de pacote npm ESM-first:
type: "module"declara ESM como padrãoexportssubstitui o campo legadomain—é assim que o Node moderno resolve pontos de entradafilescontrola o que é publicado (apenasdist/)enginesespecifica Node 18+, evitando problemas de compatibilidade legados
Configure a Compilação TypeScript
Crie tsconfig.json:
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"declaration": true,
"outDir": "dist",
"rootDir": "src",
"strict": true,
"skipLibCheck": true
},
"include": ["src"]
}
Crie 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];
}
Execute npm run build para compilar. Você obterá dist/index.js e dist/index.d.ts—JavaScript mais declarações de tipo, não TypeScript bruto.
Publicação Segura de Pacotes npm em 2025
Crie sua Conta npm com 2FA
- Registre-se em npmjs.com
- Habilite autenticação de dois fatores imediatamente (prefira WebAuthn/passkeys)
- Todos os novos pacotes agora têm aplicação de 2FA habilitada por padrão
- Com o novo modelo de login baseado em sessão, publicar qualquer pacote—novo ou existente—requer 2FA durante a sessão
Sua Primeira Publicação Manual
npm login agora cria um token de sessão de duas horas. Esses tokens:
- Não aparecem na interface do npm
- Expiram automaticamente após duas horas
- Não podem ser reutilizados em CI/CD
- Sempre aplicam 2FA antes de publicar
Ferramentas mais antigas que autenticam via endpoint CouchDB descontinuado também recebem tokens de sessão de duas horas durante o período de transição.
Para seu lançamento inicial:
npm login
npm publish --access public
A flag --access public é necessária para pacotes com escopo em contas gratuitas.
Verifique seu pacote em https://www.npmjs.com/package/@yourusername/use-toggle.
Discover how at OpenReplay.com.
npm Trusted Publishing com CI
Tutoriais antigos dizem para criar um NPM_TOKEN e armazená-lo como secret do repositório. Esta abordagem agora está obsoleta: tokens clássicos foram permanentemente revogados, e tokens de CI de longa duração não são mais suportados.
A alternativa moderna é npm Trusted Publishing via GitHub Actions OIDC. O GitHub prova sua identidade ao npm, e o npm emite credenciais de curta duração automaticamente—nenhum token armazenado necessário.
Configure o Trusted Publishing
- Em npmjs.com, vá para seu pacote → Settings → Publishing access
- Adicione um novo “Trusted Publisher” com os detalhes do seu repositório GitHub
Crie o Workflow
Adicione .github/workflows/publish.yml:
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
A flag --provenance adiciona atestação criptográfica vinculando seu pacote ao repositório de origem—um recurso de segurança da cadeia de suprimentos que o npm introduziu em 2023.
Se OIDC não puder ser usado (por exemplo, runners auto-hospedados), crie um token de acesso granular de curta duração usando:
npm token create
Tokens granulares podem optar por Bypass 2FA para publicação em CI e devem expirar em até 90 dias.
O Que Você Verá em Tutoriais Antigos
Evite estes padrões desatualizados:
"main": "index.js"semexports—useexportspara resolução ESM adequada- Direcionamento para Node 10/12/14—Node 18+ é suportado, mas novos pacotes devem direcionar versões LTS modernas (Node 20 ou 22)
- Pacotes apenas CommonJS—ESM é o padrão; publique ESM-first
NPM_TOKENpermanente em cada workflow—tokens clássicos foram totalmente revogados; use Trusted Publishing sem token
Verifique Antes de Publicar
Sempre teste seu pacote localmente antes de publicar:
npm pack --dry-run
Isso mostra exatamente quais arquivos serão incluídos. Se você ver src/ ou node_modules/, seu campo files precisa de ajuste.
Conclusão
Para criar e publicar um pacote npm em 2025: use ESM com exports adequado, compile TypeScript para JavaScript com declarações, habilite 2FA e automatize releases com npm Trusted Publishing. Pule os padrões legados—eles causarão dores de cabeça para você e seus usuários.
Perguntas Frequentes
Publique JavaScript compilado com arquivos de declaração. Envie a pasta dist contendo seu JS compilado e arquivos .d.ts gerados. Isso garante compatibilidade entre diferentes versões do TypeScript e ferramentas de build. TypeScript bruto força os consumidores a compilar seu código, o que pode causar conflitos de versão e builds mais lentos.
Use dependencies para pacotes que seu código empacota e envia. Use peerDependencies para pacotes que os consumidores devem fornecer, como React para um hook React. Isso evita cópias duplicadas de bibliotecas grandes no bundle final. Seu pacote espera a versão do consumidor em vez de empacotar a sua própria.
Pacotes com escopo como @username/package-name são privados por padrão no npm. Contas npm gratuitas não podem publicar pacotes privados, então você deve definir explicitamente --access public. Esta flag informa ao npm para publicar o pacote publicamente. Você só precisa dela na primeira publicação; versões subsequentes herdam o nível de acesso.
Use npm deprecate @scope/package para avisar usuários sem remover o pacote. Despublicação completa com npm unpublish é restrita a pacotes publicados em até 72 horas ou aqueles com downloads mínimos. Para pacotes abandonados, a depreciação é preferida, pois avisa usuários enquanto preserva instalações existentes.
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.