JavaScript é uma linguagem de programação; Node.js é um runtime, um programa que executa JavaScript fora do navegador. A sintaxe, os tipos e os objetos padrão (Array, Promise, JSON) são os mesmos nos dois. O que muda é o ambiente em volta do seu código: o navegador te dá window e document para trabalhar com uma página web, enquanto o Node.js te dá global, process, require e módulos como fs para trabalhar com arquivos, servidores e o sistema operacional.
Os globais do navegador imprimiram undefined, os do Node.js object ou function, e a última linha true, porque no Node.js globalThis e global são o mesmo objeto. Cole as seis primeiras linhas no console do navegador e os resultados se invertem.
A diferença em uma tabela
| JavaScript no navegador | JavaScript no Node.js | |
|---|---|---|
| O que é | A linguagem, executada pelo motor do navegador | A mesma linguagem, executada pelo runtime Node.js (V8) |
| Objeto global | window | global |
| Trabalha com | A página: document, o DOM, eventos | A máquina: fs, http, process, os |
| Módulos | <script type="module">, import | require (CommonJS) e import (ES modules) |
| Pacotes | Empacotados junto com a página | Instalados em node_modules com o npm |
| Entrada | Cliques, formulários, eventos de teclado | Argumentos de linha de comando, entrada padrão, requisições HTTP |
Array, Promise, JSON, setTimeout, console | Sim | Sim |
A linha dos módulos é a que mais confunde. O Node.js suporta os dois sistemas, require e import, enquanto os navegadores só entendem import. A página CommonJS vs ES modules explica qual escolher.
A linguagem é a mesma
Uma função que usa só a linguagem roda em qualquer lugar. Este bloco não tem nada específico do Node, e imprimiria as mesmas linhas em um navegador:
Ele imprimiu {"best":95,"average":85} e Passed: 2 of 3. Spread, reduce, template strings e JSON fazem parte da linguagem, definida pelo padrão ECMAScript, então todo runtime tem.
O que só o Node.js tem
A parte específica do Node é o conjunto de módulos e globais nativos que conversam com o sistema operacional:
Ele escreveu um arquivo, leu de volta e imprimiu .txt 2 lines, depois uma lista vazia de argumentos. Nem o acesso a arquivos nem process.argv existem no navegador, onde uma página não pode mexer no seu disco.
Quais recursos da linguagem você tem
A linguagem tem versões (ES2015, ES2020, ES2024 e assim por diante), e cada motor adiciona recursos novos no seu próprio ritmo. O Node.js traz um V8 específico em cada release, então é a sua versão do Node.js que decide quais recursos funcionam: Object.groupBy e Array.prototype.findLast, por exemplo, precisam de uma versão recente. Por isso uma tabela de compatibilidade lista o Node.js como mais uma coluna ao lado de Chrome, Firefox e Safari. Rode node --version quando uma sintaxe nova falhar com SyntaxError ou um método vier undefined, e atualize antes de partir para um polyfill.
Código que roda nos dois
Quem escreve bibliotecas às vezes verifica onde o código está rodando antes de usar uma API específica do ambiente:
const isNode = typeof process !== 'undefined' && process.versions?.node != null;
const isBrowser = typeof window !== 'undefined';
Sempre que puder, verifique o recurso de que você precisa, não o nome do ambiente: typeof fetch === 'function' diz mais do que "isto é Node". Os dois têm fetch, URL, TextEncoder, setTimeout e structuredClone hoje, então menos código precisa de verificação do que alguns anos atrás.
Erros comuns
Usar document ou window em um script Node.js. Você recebe ReferenceError: document is not defined. Esse código é para o navegador.
Usar require no navegador. Navegadores não têm require. Use import, ou um bundler que transforma as chamadas de require em um único arquivo.
Achar que Node.js é outra linguagem. Não é. Se um tutorial de JavaScript ensina, funciona no Node.js, a menos que use o DOM.
Perguntas frequentes
Dá para aprender Node.js sem aprender JavaScript?
Na prática, não. Cada linha que você escreve em Node.js é JavaScript, então a linguagem vem primeiro. Depois que você conhece funções, objetos e promises, o Node.js é um conjunto de APIs extras para aprender.
Por que aparece "document is not defined" no Node.js?
document é o DOM do navegador, e o Node.js não tem uma página para te dar um. Código que mexe em document ou window precisa rodar em um navegador, ou em um setup de testes que simula o DOM, como o jsdom.
TypeScript é a mesma coisa que Node.js?
Não. TypeScript é uma versão tipada do JavaScript que compila para JavaScript. Você pode rodar o resultado no Node.js ou em um navegador, e as versões recentes do Node.js também rodam muitos arquivos .ts diretamente, removendo os tipos.