← Назад к вопросам
Зачем нужен префикс node: при загрузке встроенных модулей?
1.0 Junior🔥 151 комментариев
#Node.js и JavaScript
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Префикс node: в импортах встроенных модулей
Префикс node: — это явное указание того, что вы загружаете встроенный модуль Node.js, а не пакет npm с похожим названием. Это мощный инструмент для избежания конфликтов и повышения ясности кода.
История вопроса
Раньше импорт был неявным:
const fs = require("fs"); // Встроенный модуль
const crypto = require("crypto"); // Встроенный модуль
Проблема возникала, когда в npm появлялся пакет с тем же названием:
// Что это будет? Встроенный fs или пакет из node_modules?
const fs = require("fs");
Зачем нужен префикс node:?
1. Явная идентификация встроенных модулей
С NodeJS 16+ рекомендуется использовать:
const fs = require("node:fs"); // Ясно — встроенный модуль
const crypto = require("node:crypto"); // Встроенный модуль
const path = require("node:path"); // Встроенный модуль
2. Конфликт имён в npm-пакетах
Пример реального конфликта:
// В npm существует пакет "events"
// Но встроенный модуль также называется "events"
// Без префикса — неясно, что загружается
const EventEmitter = require("events");
// С префиксом — очевидно
const EventEmitter = require("node:events").EventEmitter;
3. ESM синтаксис (рекомендуемый подход)
В современном Node.js с ESM (ES modules) префикс node: обязателен:
// Правильно
import fs from "node:fs";
import path from "node:path";
import { EventEmitter } from "node:events";
// Это НЕ будет работать (потребует разрешения в экспорте)
// import fs from "fs";
4. Совместимость и будущее
Node.js планирует расширить это поведение:
- Встроенные модули с префиксом
node:— явно защищены - Без префикса — может быть переопределено установленным пакетом (в будущем)
Когда использовать node:?
Всегда используй для встроенных модулей:
// ✅ Правильно в CommonJS
const fs = require("node:fs");
const path = require("node:path");
const { EventEmitter } = require("node:events");
const http = require("node:http");
const util = require("node:util");
// ✅ Обязательно в ESM
import fs from "node:fs";
import path from "node:path";
import { EventEmitter } from "node:events";
Реальный пример конфликта
// package.json
{
"dependencies": {
"path": "^0.12.7", // Пакет npm с похожим названием
"http": "^0.0.1" // Пакет npm
}
}
// app.js — без префикса node:
const path = require("path"); // Это будет npm пакет, НЕ встроенный!
const http = require("http"); // Это будет npm пакет!
// Решение — использовать node:
const path = require("node:path"); // Встроенный модуль
const http = require("node:http"); // Встроенный модуль
Список встроенных модулей с node:
import assert from "node:assert";
import buffer from "node:buffer";
import child_process from "node:child_process";
import cluster from "node:cluster";
import crypto from "node:crypto";
import dgram from "node:dgram";
import dns from "node:dns";
import domain from "node:domain";
import events from "node:events";
import fs from "node:fs";
import http from "node:http";
import https from "node:https";
import net from "node:net";
import os from "node:os";
import path from "node:path";
import stream from "node:stream";
import util from "node:util";
import zlib from "node:zlib";
Best practices
- Всегда используй префикс
node:для встроенных модулей - Это лучшая практика, рекомендуемая Node.js официально
- Помогает инструментам анализа и IDE проще работать с кодом
- Предотвращает неожиданные ошибки при добавлении зависимостей