Andy Melnikov (nponeccop) wrote,
Andy Melnikov
nponeccop

Categories:

ECMAScript Modules в Ноде в 2021

TLDR

Потратил тут ~неделю на приобретение тайного знания, так что вот вам оно забесплатно. Это к вопросу о визарде и галочках в том числе. Ну и как аргументированно посылать предлагающих перейти. Я тут попал в трудную ситуацию, когда придётся послать самого себя.

Если TLDR - то низя. Да, оно работает, работает в том виде в котором оно будет в 16.х, но mock-библиотеки не работают. То есть если вы не пишете тесты, или пишете их, но уверены, что вам не понадобятся те фичи, которые сейчас не работают, или пишете на уникальном сочетании технологий, которое внезапно работает - то можно. А если хотите хуяк-хуяк, и тесты на любом зрелом тестовом фреймворке и оно трам-пам-пам завелось - то низя.

Поддержка нодой

В ноде 14.х они наконец выкатили поддержку ES Modules без флага, но она помечена как Experimental в доке.

В ноде 15.х поддержка уже помечена как Stable. Но сама ветка не LTS. То есть в 16 ветке уже будет совсем зашибись.

Поддержка либами

Есть мок-либа https://www.npmjs.com/package/quibble, которая вроде как работает как --loader, но я её не смотрел и это же случай "пишете на уникальном сочетании технологий, которое внезапно работает".

В Jest поддержка заявлена только в jest@27, который сейчас @next. И оно использует ключик --vm-modules, который экспериментальный и отличается от других ключиков --loader и -r, которые вам встретятся по дороге. И там всё равно не работает jest.mock для некоторых типов модулей. В-общем Jest только транспиляция.

В mocha оно работает без ключика, но там есть длинный список ограничений:
- Watch mode does not support ES Module test files
- When using module-level mocks via libs like proxyquire, rewiremock or rewire, hold off on using ES modules for your test files

Разные версии ESM!

Но всё ещё более запутанно, на самом деле. Есть ~4 разных версии ES Modules только на сервере. В клиентский зоопарк я даже не лезу:

- TypeScript modules - как входной, так и генерируемый код
- node -r esm
- *.mjs
- type:module

И у них всех разные фичи и разная степень комплаенса спецификации! Последние 2 - это та самая "поддержка нодой" которая стабилизируется в 16.х.

И ещё это всё накладывается на то, что тестовые фреймворки клали хуй на систему модулей. В jest и mocha в обоих какие-то странные глобалсы. В tap их нет, но то относительная маргинальщина. А в библиотеках моков какие-то ебанутые требования к рантайму - в jest.mock например в factory не любой код можно. Jest вот решил перестать класть и завёл @jest/globals, который единственный способ использовать Jest c ES Modules, что совершенно правильный и прямой подход.
Tags: programming, все пидарасы а я, выебудни
Subscribe

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 2 comments