devterview_$ iniciar simulação

CommonJS x ES Modules no Node

MédioPlenoMódulos

Pergunta

Quais as diferenças práticas entre CommonJS (`require`) e ES Modules (`import`) no Node, e o que costuma dar errado ao migrar?

Resposta esperada

CommonJS: `require` é síncrono e resolvido em runtime (dá pra `require` condicional, dentro de função), `module.exports` é um objeto mutável, `__dirname`/`__filename` existem. ES Modules: `import` é estático (hoisted, analisado antes de executar — permite tree-shaking), assíncrono por baixo, os bindings exportados são 'ao vivo' (readonly pra quem importa), e não tem `__dirname` (usa `import.meta.url`). Atritos na migração: extensão obrigatória nos imports relativos em ESM (`'./x.js'`, não `'./x'`); o `package.json` precisa marcar o tipo como module (ou usar arquivos `.mjs`); `require` de um pacote só-ESM não funciona (e o inverso tem pegadinhas de interop de default export); top-level `await` só existe em ESM; e mocking em teste muda (jest com ESM é mais chato). Muitos projetos ficam em CJS ou usam um bundler pra evitar a dor.

Por que perguntam isso

Pergunta pleno de Node. Sinais de experiência: 'extensão obrigatória', interop de default export, top-level await só em ESM.

#commonjs#esm#modulos
publicidade

Relacionadas