Noções Básicas de Módulos
8 exemplos para você começar com Módulos - 6 básicos e 2 intermediários.
Busque em todas as páginas da documentação
8 exemplos para você começar com Módulos - 6 básicos e 2 intermediários.
"type": "module" em package.json para exemplos ESM.Exportações nomeadas são analisáveis estaticamente - o padrão preferido em 2026.
// user.ts
export interface User { id: string; name: string }
export function formatUser(u: User): string {
return `${u.name} (${u.id})`;
}// main.ts
import { formatUser, type User } from './user.js';
const user: User = { id: '1', name: 'Ada' };
console.log(formatUser(user));.js em especificadores de importação ao compilar TypeScript para ESM.import type é removido em tempo de compilação - sem custo de tempo de execução.Relacionado: Módulos ESM (import) - importação dinâmica e TLA
Uma exportação padrão por módulo - use para pontos de entrada de propósito único.
// logger.ts
export default function createLogger(prefix: string) {
return (msg: string) => console.log(`[${prefix}]`, msg);
}import createLogger from './logger.js';
const log = createLogger('api');
log('started');Código "brownfield" ainda usa require - conheça para manutenção.
// legacy.cjs
const path = require('node:path');
module.exports = {
basename: (p) => path.basename(p),
};const { basename } = require('./legacy.cjs');.cjs força CommonJS mesmo quando "type": "module".require é síncrono - sem top-level await em módulos CJS.Relacionado: CommonJS (require) - padrões de module.exports
Define ESM como padrão para arquivos .js no pacote.
{
"name": "billing-api",
"type": "module",
"exports": {
".": "./dist/index.js"
}
}"type": "module", arquivos .js são tratados como CommonJS."type": "commonjs" é o modo legado explícito."exports" para pontos de entrada públicos.Relacionado: type & exports do package.json - exportações condicionais
Clarifica importações embutidas e evita sombreamento de pacotes do usuário.
import { readFile } from 'node:fs/promises';
import { createServer } from 'node:http';node: é opcional, mas recomendado em código de aplicação.fs sequestre importações.require('node:fs')).Carrega módulos condicionalmente ou em tempo de execução - retorna uma Promise.
async function loadPlugin(name: string) {
const mod = await import(`./plugins/${name}.js`);
return mod.default();
}
await loadPlugin('metrics');Relacionado: Módulos ESM (import) - top-level await com importação dinâmica
Re-exporta uma superfície curada de index.ts.
// src/services/index.ts
export { UserService } from './user-service.js';
export type { User } from './user-service.js';import { UserService, type User } from './services/index.js';Relacionado: Algoritmo de Resolução de Módulos - como index resolve
Módulos mistos durante a migração - extensões explícitas e createRequire.
// bridge.mjs
import { createRequire } from 'node:module';
const require = createRequire(import.meta.url);
const legacy = require('./legacy-config.cjs');
console.log(legacy.apiUrl);createRequire carrega CJS do contexto ESM durante a migração "brownfield".import e require em CI durante a transição.Relacionado: Interoperabilidade CJS ↔ ESM - pacotes duplos e .mjs/.cjs
Versões da Stack: Esta página foi escrita para Node.js 24.18.0 (Active LTS), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 e NestJS 11.
Revisado por Chris St. John·Última atualização: 19 de jul. de 2026