JavaScript, вероятно, является одним из самых влиятельных языков программирования всех времен (хорошо это или плохо) — он работает почти в каждом современном веб-браузере, независимо от операционной системы. Независимо от того, используете ли вы Safari, Chrome или Firefox в MacOS, Windows или Linux, JavaScript будет работать за кулисами (если вы не отключите его).

Однако JavaScript (см. ECMAScript) — это всего лишь язык программирования: абстрактная спецификация того, как последовательности символов ASCII должны интерпретироваться компьютером. Чтобы на самом деле выполнить код JavaScript, вам нужна программа, называемая среда выполнения (также известная как движок). Каждый современный веб-браузер поставляется в комплекте с исполняющей средой JavaScript. Chrome использует движок под названием V8, в то время как Firefox использует SpiderMonkey, а Safari использует WebKit/JavaScriptCore.

В последнее время наблюдается тенденция выполнения кода Javascript вне веб-браузеров. В настоящее время существует несколько сред выполнения JavaScript, которые предназначены для выполнения JavaScript на «серверной стороне» (то есть как отдельная программа, аналогичная другим языкам программирования, таким как Python или Java). В этой статье я кратко расскажу о текущем состоянии сред выполнения JavaScript и их различных плюсах и минусах.

Среды выполнения браузера (V8, SpiderMonkey, Webkit и т. д.)

Я собрал все это в этом разделе, потому что на самом деле они не являются предметом этой статьи. Хотя эти механизмы можно использовать автономно, их основное назначение — встроить в другое приложение. На них работают ваши любимые веб-браузеры, а также другие среды выполнения, о которых я расскажу ниже. Однако обычно вы не будете использовать их, скажем, для локального запуска веб-сервера через командную строку.

NodeJS

В настоящее время наиболее популярной серверной средой выполнения JS является NodeJS, основанная на V8. NodeJS широко используется для разработки веб-серверов, веб-приложений, API и т. д. NodeJS использует менеджер пакетов npm, в котором есть миллионы готовых к использованию библиотек практически для любого случая использования, который вы только можете себе представить.

Сам NodeJS имеет множество функций — его цикл обработки событий поддерживает асинхронное программирование; кроссплатформенный; и его стандартная библиотека поддерживает сетевые запросы, взаимодействие с ОС/файловой системой, использование REPL/TTY и т. д.

Однако обычно вы увидите, что NodeJS используется с чрезвычайно популярными библиотеками, такими как React, Express, Lodash, Axios и т. д. Эти библиотеки используют большую часть Интернета, и вы найдете учебник после учебника, объясняющего, как их использовать.

Однако NodeJS не без проблем. С такой большой экосистемой обязательно возникнут проблемы с фрагментацией и безопасностью.

Чтобы развернуть веб-сайт или приложение с помощью платформы на основе NodeJS, вам нужно использовать бандлер для упаковки всего кода. Вам придется выбирать между rollup, parcel, webpack, esbuild, vite, snowpack и т. д. Если вы застряли в конфигурационном аду, очень плохо! Вы должны были просто использовать npx xxx-create-app для создания всех файлов конфигурации для вас. Новому разработчику может быть очень сложно понять разницу между всеми этими инструментами и выбрать правильный вариант.

Обработка зависимостей также может быть проблемой для NodeJS. Хорошо известно, что запуск одного npm install может привести к сотням пакетов, и сообщество часто жалуется на большой размер папки node_modules, в которой хранятся все загруженные зависимости проекта.

Кроме того, существуют потенциальные проблемы с безопасностью, которые необходимо устранить должным образом. Злоумышленник может разработать часть вредоносного ПО в виде пакета npm, а затем внедрить его в список зависимостей пакета, от которого зависит пакет, от которого зависит пакет, от которого зависит популярная библиотека, такая как React. Такая глубокая цепочка зависимостей также может вызвать проблемы, если пакет будет удален — помните, когда удаление left-pad временно сломало Интернет?

Некоторые из этих проблем можно решить с помощью таких альтернатив, как yarn, bower или pnpm. Однако npm по-прежнему является стандартом, и теперь каждая JS-библиотека имеет 5 различных команд установки (я, конечно, утрирую, но посмотрите этот пример и этот актуальный XKCD).

Но опять же, популярность NodeJS просто нельзя недооценивать. Его лучший актив — его большая экосистема, и вы обнаружите, что NodeJS предоставляет все необходимое для создания следующего отличного веб-приложения.

Дено

NodeJS был стандартом в течение многих лет, но теперь Deno — новичок в этом блоке. Deno был выпущен в 2018 году как более современная версия NodeJS. На самом деле у Deno и NodeJS один и тот же создатель: Райан Даль. Кроме того, обе среды выполнения основаны на движке V8 (правда, Deno написан на Rust, а NodeJS использует C++).

Deno был написан для устранения различных недостатков NodeJS, от проблем с безопасностью до удобства использования. Deno «безопасен по умолчанию» — если коду Deno необходимо получить доступ к файловой системе или сделать сетевой запрос, вам нужно будет явно предоставить разрешение. Кроме того, Deno распространяется в виде универсального исполняемого файла, который обеспечивает первоклассную поддержку TypeScript, линтинг/форматирование с помощью deno {lint,fmt}, объединение с deno bundle, выполнение тестов с помощью deno test и многое другое.

Deno также обрабатывает зависимости совершенно иначе, чем NodeJS. Удаленные зависимости импортируются непосредственно из URL-адреса. Например, вы можете импортировать дуб, HTTP-фреймворк, используя import * as oak from "https://deno.land/x/[email protected]/mod.ts";. Затем Deno возьмет на себя управление зависимостями — загрузит пакеты и кэширует их локально. Распространенным шаблоном является использование одного файла deps.ts для импорта удаленных библиотек и повторного экспорта их локально для использования другими файлами JavaScript или TypeScript.

В целом экосистема Deno намного меньше, чем у NodeJS. Есть экспериментальный режим совместимости с Node (см. здесь), но он не работает в 100% случаев. С другой стороны, у Deno есть собственная коллекция новых и интересных веб-библиотек, таких как fresh (веб-фреймворк с полным стеком), oak (HTTP-маршрутизатор) и ultra (потоковая SSR-фреймворк). Кроме того, популярные библиотеки Node, такие как Lodash, day.js и xstate, поддерживаются Deno и размещаются на deno.land/x. Не говоря уже о том, что у Deno есть проверенный набор стандартных модулей, которые охватывают множество вариантов использования, включая взаимодействие ОС и файловой системы, ввод-вывод, сетевые запросы, криптографию и многое другое.

Что касается экосистемы, один уникальный веб-сервис, официально предлагаемый Deno, который нельзя игнорировать, — это Deno Deploy. Deno Deploy позволяет развертывать код Deno глобально — подумайте о бессерверных функциях общего назначения (например, AWS Lambda или Google Cloud Functions). Deno Deploy можно использовать для размещения веб-сайтов, прокси-сервисов API, обработки форм/запросов POST и многого другого. На данный момент у Deno Deploy есть бесплатное предложение, которое поддерживает 100 000 запросов в день и передачу данных 100 ГиБ в месяц (эта статья не спонсируется — я просто думаю, что это действительно круто).

Хотя Deno не отказался от NodeJS (и, возможно, никогда), это очень хорошая альтернатива, которая уже используется такими компаниями, как Slack, Netlify и Github. Если вы не обязаны использовать NodeJS, я бы определенно попробовал Deno для вашего следующего проекта.

Булочка

Если Дено — новичок в этом квартале, то Бун — еще более новый ребенок в этом квартале. Он был выпущен в конце 2021 года Джарредом Самнером и сразу же начал вызывать ажиотаж в сети. Основным преимуществом Bun является его скорость — он утверждает, что запускается в 4 раза быстрее, чем NodeJS, и запускает JavaScript в два-три раза быстрее, чем NodeJS/Deno в различных обстоятельствах.

Как это возможно? Что ж, Bun написан на Zig, низкоуровневой альтернативе C, и с самого начала был оптимизирован по скорости — большая часть его кода была написана с нуля. Он использует JavaScriptCore в качестве внутреннего JS-движка.

В дополнение к своей производительности, Bun рекламирует отличное удобство использования, как и Deno. Bun состоит из одного исполняемого файла и включает в себя транспилятор TypeScript, встроенный упаковщик, средство запуска задач и диспетчер пакетов, все из которых работают быстрее, чем их эквиваленты NodeJS.

Bun использует тот же алгоритм разрешения модулей, что и NodeJS, что делает его совместимым с npm. Он также реализует большую часть API Node, что позволяет ему работать с собственными модулями Node. В целом, цель Bun — заменить набор сборщиков, транспилеров и менеджеров пакетов, связанных с NodeJS, одним быстрым и простым в использовании пакетом.

Bun появился не так давно, и мы можем только подождать и посмотреть, утвердится ли он в современной экосистеме JS. Однако, судя по его скорости и совместимости с NodeJS, кажется, что у Bun большое будущее.

Различные встраиваемые среды выполнения JS

Удивительно, но JS также используется во встроенных устройствах, таких как микроконтроллеры. Появилось несколько встраиваемых сред выполнения, каждая из которых выполняет код JavaScript с экстремальными требованиями к использованию ЦП и памяти.

  • Duktape — встраиваемый движок Javascript с упором на портативность и компактность.
  • Elk — малозатратный движок JavaScript для встраиваемых систем.
  • Espruino — интерпретатор JavaScript для микроконтроллеров с флэш-памятью всего 128 КБ и ОЗУ 8 КБ.

Что дальше?

Похоже, что экосистема среды выполнения JavaScript/TypeScript все еще развивается. Десятки тысяч человеко-часов ушли на то, чтобы сделать JavaScript быстрее, но Бан показывает, что еще есть большой потенциал для улучшения. Тем временем Deno демонстрирует важность удобства использования и простоты в современных инструментах разработки. Я с нетерпением жду возможности увидеть, как ландшафт JavaScript продолжит меняться в будущем.

Изменить (15.08.22): Deno только что объявила, что они работают над улучшением совместимости с npm и что их цель — сделать Deno самой быстрой средой выполнения JavaScript. Может ли это быть их ответом Бану? Я взволнован, чтобы увидеть, как это обернется.

Повышение уровня кодирования

Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь:

  • 👏 Хлопайте за историю и подписывайтесь на автора 👉
  • 📰 Смотрите больше контента в публикации Level Up Coding
  • 🔔 Подписывайтесь на нас: Twitter | ЛинкедИн | "Новостная рассылка"

🚀👉 Присоединяйтесь к коллективу талантов Level Up и найдите прекрасную работу