console.log(__dirname); // /path/to/current/directory
console.log(__filename); // /path/to/current/file.js
Происхождение:
(function(exports, require, module, __filename, __dirname) {
// Ваш модуль
});
import.meta.url
)const fs = require('fs');
Происхождение:
__dirname
Module._load
import fs from 'fs';
export function foo() {}
Происхождение:
fetch('https://api.example.com');
Происхождение:
const arr = new Array(1, 2, 3);
Происхождение:
Идентификатор | Тип | Источник | Доступность |
---|---|---|---|
__dirname | Переменная | Node.js CommonJS wrapper | Только CommonJS |
__filename | Переменная | Node.js CommonJS wrapper | Только CommonJS |
require | Функция | Node.js модульная система | Только CommonJS |
import/export | Синтаксис | ECMAScript стандарт | ESM модули |
fetch | Функция | Web API / Node.js реализация | Глобально (новые версии) |
Array | Конструктор | ECMAScript ядро | Глобально везде |
// При загрузке модуля Node.js делает примерно следующее:
const wrapper = [
'(function(exports, require, module, __filename, __dirname) { ',
'\n});'
];
const wrapped = wrapper[0] + moduleCode + wrapper[1];
const compiled = vm.runInThisContext(wrapped, {
filename: modulePath,
lineOffset: 0,
displayErrors: true
});
compiled(module.exports, require, module, filename, dirname);
// До Node.js 18 нужно было делать так:
const fetch = require('node-fetch');
// Или глобально:
globalThis.fetch = require('node-fetch');
Браузер:
__dirname
, __filename
, require
fetch
, Array
, import/export
Node.js:
Deno/Bun:
Node.js-специфичные:
__dirname
, __filename
, require
- инжектятся оберткой CommonJS модуляСтандарт ECMAScript:
import/export
- часть ES модулейArray
- базовый конструктор языкаWeb API:
fetch
- перенесен из браузеров в Node.jsКлючевые различия:
Понимание происхождения этих идентификаторов помогает: