Я представляю 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 предлагает несколько преимуществ, как само по себе, так и по сравнению с такими альтернативами, как библиотеки.

Использование явное

Чтобы использовать макросы, они должны быть сначала imported. Это означает, что каждый раз, когда они используются, символ определяется в области видимости, и любой, кто читает код, сможет следить за хлебными крошками.

Поощряет хорошие практики кода

Частичное приложение способствует созданию и использованию составных многоразовых функций. Эти макросы - попытка сделать эту практику как можно более элегантной.

Производительность сохраняется

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

Знакомит вас с растущей экосистемой макросов

babel-plugin-macros действительно только началось. Наряду с param.macro, у плагинов есть много возможностей для оптимизации времени компиляции. После его настройки все, что вам нужно сделать, чтобы использовать другой макрос, - это установить и импортировать; нет необходимости в настройке для каждого плагина (хотя это возможно).

Дом, который мы построили

Я надеюсь, что это дало вам представление о том, что param.macro может для вас сделать, но, пожалуйста, посетите онлайн-площадку, где вы можете сразу же проверить это в своем браузере. Вы также можете посетить репозиторий на GitHub, чтобы увидеть код самостоятельно. Стоит отметить, что плагин загружается - он использует сам себя в своем исходном коде!

Помните, что любые предложения всегда приветствуются, и обязательно открывайте вопрос, если вы столкнетесь с чем-то неуклюжим, некрасивым или неподходящим . Я тоже существую в Твиттере.

И я не могу упустить эту возможность поблагодарить всех людей, которые делают феноменальную работу над Babel и Kent C. Dodds, за его работу над babel-plugin-macros.

Увидимся!