Никита Прокопов
негодует (как обычно). Обновил
npm
на минор и вылез ворнинг
(node:45421) ExperimentalWarning: CommonJS module /opt/homebrew/lib/node_modules/npm/node_modules/debug/src/node.js is loading ES Module /opt/homebrew/lib/node_modules/npm/node_modules/supports-color/index.js using require().
Support for loading ES Module in require() is an experimental feature and might change at any time
(Use node --trace-warnings ... to show where the warning was created)
Я мимо пройти не мог и решил разобраться. Первопричина понятна — node 23 включил экспериментальную поддержку синхронного
require()
для ESM-модулей. Зачем нужен ворнинг? Потому что поддержка неполноценная и если прилетит ESM c top level await то всё полетит к чертям (и это очень опасный момент с которым пока непонятно как жить).
Ладно, ясно-понятно, экспериментальная версия node.js споткнулась. Завтра починят. Вроде бы ничего такого. Получается, Никита не прав, у нас всё относительно хорошо? Ну, не совсем.
Интересен другой момент — почему это случилось на миноре npm и как оно работает в обычной node без реквайра? А разгадка простая:
Во-первых
supports-color
апнули на мажор. Это модуль от Синдре. Ну вы понимаете. Синдре опять переписал всё на pure ESM
Второй момент, как же оно работает сейчас? А никак не работает. Там внутри в
debug/src/node.js
— try catch
try {
require('supports-color')
} catch (error) {
// Swallow - we only care if `supports-color` is available; it doesn't have to be.
}
И вот это уже печально. Апнули на сломанную версию, ошибок нет (они заглушены).
https://github.com/npm/cli/issues/7857