← Назад к вопросам

Зачем нужен префикс 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 проще работать с кодом
  • Предотвращает неожиданные ошибки при добавлении зависимостей