TL; DR:
Вы можете использовать модули JavaScript в узле сегодня без транспортировки, просто npm -s esm
и запустите свое приложение с Node -r esm foo.js
Анкет Добавить "ESM": "Auto"
до верхнего уровня вашего пакета. Json, чтобы сделать загрузочные модули и CJS в одном и том же приложении без усилий и прозрачного.
Если вы застряли в этом далеко, продолжайте читать для самоуверенной истории о том, как мы подошли к этому моменту.
История, переносившая проблему ESM: лучшее решение
История
Исторически, JavaScript был только для браузера. Разработчики использовали ряд методов для структуры своего кода, все из которых были в основном абстракции по глобальным переменным. Среди этих решений появился крауджир, называемый CommonJS (или «CJS»).
const { foo } = require('./bar') const baz = foo + "qux" module.exports = { quux: [baz] }
CJS приобрел тягу среди разработчиков JS в основном потому, что это была система модулей, которую использовали NodeJS. Разработчики фронт-энда могут пучок Приложения на основе CJS с такими инструментами, как WebPack в однолетные сценарии, которые браузеры могли загружать и работать.
Представление о том, что одна кодовая база может (с определенным объемом инструментов) работать на сервере, а также клиент приводит к таким вещам, как рендеринг на стороне сервера, NativeScript/React Native и пролиферация таких инструментов, как WebPack, Вавилон и другие как Непринимаемый Предварительные условия для JS Development.
В 2015 году была опубликована Ecmascript версия 6, которая включала синтаксис для модулей на уровне языка.
import { foo } from './bar.js' const baz = foo + "qux" export const quux = [baz]
Эти модули были статичными и только на верхнем уровне, что означает, что вы не могли делать такие вещи, как следующее.
const moduleName = "foo" + "bar" if (baz) { // nope! import { quz } from moduleName }
К чему пользователи CJS привыкли. С другой стороны, модули JS были статически анализируемыми, что означает, что новая порода таких инструментов, как RULLUP Можно проанализировать файлы JS для выполнения полезных вещей, таких как устранение деревьев, которое является процессом, который удаляет неиспользованный код из пакетов. Это помогло разработчикам отправить меньше кода, что заставило сайты быстрее загружаться для пользователей.
Примечание: a Предложение о динамически импортированных модулях сделал это на этап 3 и уже доступен в ряд браузеров
Специфика того, как будут загружены модули, и модульные графики (логические структуры, представляющие функциональную взаимосвязь между модулями), были оставлены реализаторами, то есть поставщикам браузеров и содействием узлами.
Продавцы браузера взяли на себя инициативу и записали Спецификация загрузчика , но ситуация для узла, у которой уже была модульная система, была более сложной, и на сегодняшний день, Окончательный план не появился , хотя они близки.
Транспортировка
Когда была опубликована спецификация ES2015 (тогда называемая ES6 или «Гармония»), проект под названием 5-6, позже переименованный в Babel, появился как способ позволить JS-программистам написать свои приложения, используя потрясающие новые функции ES6, при доставке при доставке при доставке при доставке при доставке при доставке при доставке при доставке при доставке при доставке при доставке при доставке при доставке при доставке при доставке при доставке при доставке при доставке при доставке при доставке при доставке при доставке при доставке при доставке при доставку при доставку при судоходном Код, которые могут поддержать более старые браузеры и интернет -проводник.
Этот процесс перевода одного языка или версии языка на другой называется транспорт , портманто*транс*lating and com*giling.
Вавилон с тех пор превратился в своего рода швейцарский армейский нож JavaScript. Он может занять множество версий JavaScript или даже отдельные языки исключительно и внести их в код, который работает в браузере.
Проблема
Вавилон сделал огромное поле для веб -разработчиков. Это включено новые или предлагаемые функции, которые будут изучены en masse До того, как они были реализованы браузерами, что помогло разоблачить кромки с этими функциями, что привело к лучшим спецификациям. Он также сыграл огромную роль в морских изменениях, которые в настоящее время проживает веб -разработку от ООП/Пратовой парадигмы до более функциональной парадигмы. Вавилон также является основой для широкого спектра инструментов и продуктов, доступных для веб -разработчиков сегодня …
… но это не должно, и это иногда может быть немного проблемой.
Стоимость транспортировки
Разработчик Джейми К. хорошо выразил:
Сборник бизнеса для доставки большого размера «все» для всех браузеров и IE8 быстро разрывается. Современные методы, такие как Дифференциальная порция Давайте подаем оптимизированные, уменьшенные ES2018 для способных браузеров, в то же время зарезервируя раздутые, транспилированные пачки для тех, кто менее не очень. Кроме того, для приложений, где поддержка IE11 не является абсолютной бизнес -необходимостью, на самом деле было бы безответственно поддержать тот старый, небезопасенный браузер, когда пользователи могут и должны использовать новейший и лучший.
Принципы и когнитивная нагрузка
В мире узлов транспорт также поставляется со своими затратами. Поддержание конфигурации Вавилона не всегда самая простая задача. Тем не менее, более того, транспилирование тонко сообщает, что «этот код не в порядке, он нуждается в дополнительной обработке, чтобы быть в порядке», и мы не должны говорить об этом о нативных модулях, даже если у CJS был старт.
ESM: простое решение
ESM
отличный пакет от Microsoft Developer Джон-Дэвид Далтон славы Lodash, и др. Анкет Это погрузчик модуля, который преобразует модули ES во время выполнения вместо их транспортировки.
С эсм
, неуловимый «Interop» просто работает ™. Вы можете смешать и сопоставить родные и CJS -модули, не отдавая глаз.
Вы даже можете использовать большинство приложений узлов командной строки! Например, отличный лента
Тестирование библиотеки не поставляется с поддержкой модулей из коробки, но вы можете легко добавить ее так:
npx tape -r 'esm' './**/*.test.js'
Резюме
В следующий раз, когда у вас будет проект Node.js, прежде чем вы начнете писать конфигурацию Babel только для транспильных модулей, дайте ESM
Попробуй.
Оригинал: “https://dev.to/bennypowers/you-should-be-using-esm-kn3”