JavaScript это язык программирования, а Node.js это среда выполнения, программа, которая запускает JavaScript вне браузера. Синтаксис, типы и стандартные объекты (Array, Promise, JSON) в обоих случаях одни и те же. Меняется окружение вокруг вашего кода: браузер даёт window и document для работы со страницей, а Node.js даёт global, process, require и модули вроде fs для работы с файлами, серверами и операционной системой.
Глобальные объекты браузера вывели undefined, объекты Node.js вывели object или function, а последняя строка вывела true, потому что в Node.js globalThis и global это один и тот же объект. Вставьте первые шесть строк в консоль браузера, и результаты поменяются местами.
Разница в одной таблице
| JavaScript в браузере | JavaScript в Node.js | |
|---|---|---|
| Что это | Язык, который выполняет движок браузера | Тот же язык, который выполняет среда Node.js (V8) |
| Глобальный объект | window | global |
| С чем работает | Страница: document, DOM, события | Компьютер: fs, http, process, os |
| Модули | <script type="module">, import | require (CommonJS) и import (ES модули) |
| Пакеты | Собираются в бандл страницы | Ставятся в node_modules через npm |
| Ввод | Клики, формы, события клавиатуры | Аргументы командной строки, стандартный ввод, HTTP запросы |
Array, Promise, JSON, setTimeout, console | Да | Да |
Чаще всего путаются со строкой про модули. Node.js поддерживает обе системы, require и import, а браузеры понимают только import. Какую выбрать, объясняет страница CommonJS и ES модули.
Язык один и тот же
Функция, которая использует только сам язык, работает везде. В этом блоке нет ничего специфичного для Node, и в браузере он вывел бы те же строки:
Программа вывела {"best":95,"average":85} и Passed: 2 of 3. Spread синтаксис, reduce, шаблонные строки и JSON принадлежат языку, их определяет стандарт ECMAScript, поэтому они есть в любой среде выполнения.
Что есть только в Node.js
Специфичная для Node часть это встроенные модули и глобальные объекты, которые работают с операционной системой:
Программа записала файл, прочитала его обратно и вывела .txt 2 lines, затем пустой список аргументов. Ни доступа к файлам, ни process.argv в браузере нет: страница не может трогать ваш диск.
Какие возможности языка вам доступны
У языка есть версии (ES2015, ES2020, ES2024 и так далее), и каждый движок добавляет новые возможности в своём темпе. В каждый релиз Node.js входит конкретная версия движка V8, поэтому от версии Node.js зависит, что работает: например, Object.groupBy и Array.prototype.findLast требуют свежей версии. Поэтому в таблицах поддержки браузерами Node.js идёт отдельной колонкой рядом с Chrome, Firefox и Safari. Если новый синтаксис падает с SyntaxError или метод оказывается undefined, запустите node --version и обновитесь, прежде чем искать полифилл.
Код, который работает и там, и там
Авторы библиотек иногда проверяют, где выполняется код, прежде чем использовать API конкретного окружения:
const isNode = typeof process !== 'undefined' && process.versions?.node != null;
const isBrowser = typeof window !== 'undefined';
Когда можно, проверяйте нужную возможность, а не название окружения: typeof fetch === 'function' говорит больше, чем "это Node?". Сегодня и там, и там есть fetch, URL, TextEncoder, setTimeout и structuredClone, так что проверок нужно меньше, чем несколько лет назад.
Частые ошибки
document или window в скрипте Node.js. Получите ReferenceError: document is not defined. Такому коду место в браузере.
require в браузере. В браузерах его нет. Используйте import или сборщик, который превращает вызовы require в один файл.
Мысль, что Node.js это другой язык. Это не так. Если что-то описано в учебнике по JavaScript, оно работает в Node.js, если только не использует DOM.
Часто задаваемые вопросы
Можно ли выучить Node.js, не зная JavaScript?
Не получится. Каждая строка, которую вы пишете в Node.js, это JavaScript, поэтому сначала язык. Когда вы знаете функции, объекты и промисы, Node.js это набор дополнительных API, которые нужно изучить.
Почему в Node.js появляется ошибка "document is not defined"?
document это DOM браузера, а у Node.js нет страницы, которая бы его дала. Код, который обращается к document или window, должен выполняться в браузере или в тестовом окружении, имитирующем DOM, например jsdom.
TypeScript и Node.js это одно и то же?
Нет. TypeScript это типизированная версия JavaScript, которая компилируется в JavaScript. Результат можно запустить в Node.js или в браузере, а свежие версии Node.js умеют запускать многие файлы .ts напрямую, просто отбрасывая типы.