Я представляю param.macro - плагин для Babel, который добавляет лямбда-параметры и частичное применение функции в JavaScript во время компиляции. Вы можете попробовать это прямо сейчас, в своем браузере, с его онлайн-площадкой. В этом посте я расскажу вам, что это такое.
Форма вещей
Не так давно в месте не обязательно так далеко, Кент С. Доддс создал babel-plugin-macros
из воздуха и немного вдохновения. Проект в основном представляет собой абстракцию надстроек Babel, которая позволяет совместно использовать макросы с нулевой конфигурацией - фрагменты кода, которые изменяют свое окружение во время компиляции.
Обратите внимание, что
babel-plugin-macros
на момент первоначальной публикации был известен какbabel-macros
и с тех пор был переименован. Эта история была обновлена, чтобы отразить это.
Оказывается, babel-plugin-macros
полностью соответствует целям моего плагина: явное синтаксическое частичное приложение и лямбда-параметры. Он разделяет идею о том, что все должно быть ясным и ясным, в то же время сокращая шаблонный код. Его даже легко настроить: все, что вам нужно сделать, это установить его и добавить в конфигурацию ваших плагинов Babel. С этого момента любой пакет макросов, например param.macro
, находится на расстоянии import
в каждом файле.
Хотя
param.macro
предназначен в первую очередь для использования сbabel-plugin-macros
, его также можно использовать как автономный плагин Babel. См. Раздел автономный плагин в readme для использования.
Выражения как функции, функции как выражения
Такие языки, как Scala и Kotlin, которые послужили источником вдохновения для этого проекта, имеют концепцию лямбда-параметров. В частности, в Kotlin это сокращение для анонимных функций, где, если вы не укажете аргумент, он будет автоматически существовать с именем it:
Так уж получилось, что этот пример точно отображает то, как мы сможем сделать это в JavaScript с помощью нашего подключаемого модуля макросов:
Поддерживаются практически любые выражения, включая вложенные свойства и методы, логические операторы и операторы сравнения, литералы шаблонов и т. Д.
Не частичное приложение вашего ES5
Вы, вероятно, знакомы с Function.prototype.bind
методом JavaScript, а это значит, что вы уже сталкивались с частичным приложением. Вы также можете знать о многих библиотеках, которые обеспечивают частичное применение через вспомогательную функцию, например Lodash или пятна.
Проблема в том, что bind
имеет ограничения, поскольку вы можете связывать аргументы только по порядку, а понятие «заполнители» отсутствует. А библиотеки - некоторые из которых действительно поддерживают заполнители - представляют собой конструкции среды выполнения, которые могут существенно снижать производительность. Чтобы избежать этих проблем, вы можете просто использовать анонимные функции и обрабатывать аргументы, как хотите. Но мы хотим сократить шаблон, а не вводить больше.
Что, если вы хотите, чтобы z
было 2, а не x
? Что ж, это исключает использование bind
, но вы все равно можете использовать Lodash или анонимную функцию:
Но мы можем сделать это намного слаще. Время сиять param.macro
:
За кулисами это сводится к простым старым анонимным функциям, как если бы вы писали сами. Это означает отсутствие чрезмерных накладных расходов во время выполнения и отсутствие производственных зависимостей, поскольку импорт param.macro
удаляется во время компиляции.
И, чтобы не отставать от макроса лямбда-параметра, заполнители также поддерживают произвольные выражения, включая, помимо прочего, вложенные свойства и методы.
Но разве не it
=== _
?
Прямо сейчас я должен указать на два очень важных различия между двумя символами, предоставляемыми плагином, и все сводится к тому, что они выводят. Причина, по которой в первую очередь используются два отдельных символа, состоит в том, чтобы во всех случаях иметь четкую семантику.
Первое отличие заключается в области видимости:
Хотя они выглядят так, как будто они могут быть одинаковыми, они выглядят совсем иначе:
Частичный символ приложения _
всегда будет заключать в оболочку вызов ближайшей родительской функции, в то время как неявный параметр it
всегда будет преобразован на месте.
Второе важное отличие состоит в том, что it
всегда будет ссылаться на первый аргумент сгенерированной функции, тогда как каждый _
будет ссылаться на следующий аргумент сгенерированной функции.
Причина и следствие
param.macro
предлагает несколько преимуществ, как само по себе, так и по сравнению с такими альтернативами, как библиотеки.
Использование явное
Чтобы использовать макросы, они должны быть сначала import
ed. Это означает, что каждый раз, когда они используются, символ определяется в области видимости, и любой, кто читает код, сможет следить за хлебными крошками.
Поощряет хорошие практики кода
Частичное приложение способствует созданию и использованию составных многоразовых функций. Эти макросы - попытка сделать эту практику как можно более элегантной.
Производительность сохраняется
Уменьшая зависимости среды выполнения по сравнению с библиотекой, вы уменьшаете размер развертывания, а также избегаете потенциальных проблем с производительностью, которые могут возникнуть при использовании альтернатив среды выполнения. Библиотеки, обеспечивающие частичное применение, должны при каждом вызове проверять, какие аргументы они предоставили и являются ли какие-либо из них заполнителями, что может стать дорогостоящим.
Знакомит вас с растущей экосистемой макросов
babel-plugin-macros
действительно только началось. Наряду с param.macro
, у плагинов есть много возможностей для оптимизации времени компиляции. После его настройки все, что вам нужно сделать, чтобы использовать другой макрос, - это установить и импортировать; нет необходимости в настройке для каждого плагина (хотя это возможно).
Дом, который мы построили
Я надеюсь, что это дало вам представление о том, что param.macro
может для вас сделать, но, пожалуйста, посетите онлайн-площадку, где вы можете сразу же проверить это в своем браузере. Вы также можете посетить репозиторий на GitHub, чтобы увидеть код самостоятельно. Стоит отметить, что плагин загружается - он использует сам себя в своем исходном коде!
Помните, что любые предложения всегда приветствуются, и обязательно открывайте вопрос, если вы столкнетесь с чем-то неуклюжим, некрасивым или неподходящим . Я тоже существую в Твиттере.
И я не могу упустить эту возможность поблагодарить всех людей, которые делают феноменальную работу над Babel и Kent C. Dodds, за его работу над babel-plugin-macros.
Увидимся!