CommonJS (require)
CommonJS (require, module.exports) alimentou o Node por anos - você ainda o mantém em pacotes legados, carregadores de configuração e shims .cjs enquanto novos serviços padronizam em ESM.
Busque em todas as páginas da documentação
require)CommonJS (require, module.exports) alimentou o Node por anos - você ainda o mantém em pacotes legados, carregadores de configuração e shims .cjs enquanto novos serviços padronizam em ESM.
// config.cjs
const path = require('node:path');
module.exports = {
port: Number(process.env.PORT ?? 3000),
root: __dirname,
resolve: (p) => path.join(__dirname, p),
};const config = require('./config.cjs');Quando usar isso:
require em repositórios brownfield.cjs (jest.config.cjs, prettier.config.cjs)createRequire// circular-a.cjs
const b = require('./circular-b.cjs');
module.exports = {
name: 'A',
bName: () => b.name,
};// circular-b.cjs
const a = require('./circular-a.cjs');
module.exports = {
name: 'B',
aName: () => a.name,
};// main.cjs
const a = require('./circular-a.cjs');
console.log(a.name, a.bName()); // A B - exportações parciais durante a inicialização circular// esm-dirname-polyfill.cjs - padrão que importadores ESM evitam usando import.meta.url
const { fileURLToPath } = require('node:url');
// Necessário apenas ao ensinar diferenças entre CJS e ESMO que isso demonstra:
require retorna module.exports - atribuições substituem todo o objeto de exportaçãomodule.exports parciais até que os módulos terminem de inicializar__dirname é o diretório do arquivo CJS atual - sem equivalente ESM sem import.meta.urlrequire('./same') retorna a mesma referência de objetomodule.exports em cache em require.cache.exports.foo = 1 é açúcar para module.exports.foo até que você reatribua module.exports = ....require('node:fs') não acessa o disco.require('./x.json') em CJS - ESM precisa de readFile + JSON.parse ou padrões de asserções de importação.exports| Padrão | Resultado |
|---|---|
module.exports = fn | Equivalente à exportação padrão |
exports.a = 1 | Propriedade nomeada nas exportações |
module.exports = { a, b } | Exportação de objeto único |
// Consumindo CJS de TS com esModuleInterop
import config from './config.cjs';
// ou
import { createRequire } from 'node:module';
const require = createRequire(import.meta.url);
const cfg = require('./config.cjs') as { port: number };exports após module.exports = - falha. Correção: mutate module.exports apenas uma vez.require preguiçoso dentro de funções ou refatorar o módulo compartilhado.__dirname em ESM - ReferenceError. Correção: import.meta.url + fileURLToPath.../../../ - movimentos frágeis. Correção: migrar para ESM com mapa exports ou aliases de caminho em tsconfig.| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
ESM import | Todo novo código de aplicação | Runner de teste legado sem suporte e sem configuração |
createRequire | App ESM precisa de uma dependência CJS | Pacote inteiro pode ser ESM |
import() dinâmico | Interop CJS assíncrono de ESM | Carregamento de configuração síncrono no topo do CJS |
import de módulo JSON | Configuração estática em ESM | Necessidade de hot-reload sem reinicialização |
Não removido, mas ESM é o caminho a seguir. CommonJS permanece para compatibilidade e configuração .cjs.
Não diretamente. Use createRequire(import.meta.url) para exceções.
Objeto indexado por caminhos resolvidos - delete entradas para hot-reload raro em ferramentas de desenvolvimento.
O Node retorna module.exports incompleto até que o corpo do módulo termine - projete para evitar ciclos.
Não nativamente - compile para JS primeiro ou use loaders tsx/ts-node em desenvolvimento.
Força a análise CommonJS quando o pacote tem "type": "module".
Geralmente não de CJS - ESM é assíncrono. Importe ESM de ESM ou use a ponte de importação dinâmica.
module.exports = function myFn() {} ou module.exports = { myFn }.
Inicialmente, exports referencia module.exports. Reatribuir module.exports quebra o alias.
Autores de bibliotecas suportam ambos os ecossistemas via condições exports - consumidores escolhem pelo estilo de importação.
Nest suporta ambos; novos projetos usam cada vez mais ESM com SWC - siga o ADR da equipe.
Renomeie para .cjs apenas onde necessário, converta módulos folha primeiro, depois use createRequire temporariamente nas fronteiras.
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