React Remove Properties

В трансформационном пайплайне SWC удаление свойств из JSX используется как часть этапа оптимизации кода, ориентированного на продакшн-сборки. Механизм работает на уровне AST и позволяет исключать из итогового бандла атрибуты React-компонентов, которые не должны попадать в браузер: отладочные идентификаторы, служебные флаги, тестовые селекторы и внутренние метаданные. Основная цель этого преобразования — уменьшение размера результирующего JavaScript-кода и предотвращение утечки внутренних деталей реализации в клиентскую среду. В отличие от ручной фильтрации или постобработки, SWC выполняет удаление свойств на этапе компиляции, что делает процесс детерминированным и быстрым. ### Механизм работы трансформации JSX-атрибутов SWC анализирует JSX-деревья, представленные в виде AST (Abstract Syntax Tree). Каждый JSX-элемент содержит список атрибутов, представленных узлами `JSXAttribute` и `JSXSpreadAttribute`. При включении механизма удаления свойств происходит следующий процесс: 1. Парсинг JSX в AST. 2. Обход узлов `JSXOpeningElement`. 3. Фильтрация списка атрибутов. 4. Исключение атрибутов, соответствующих заданным правилам. 5. Генерация финального JavaScript-кода. Фильтрация выполняется синхронно в процессе трансформации и не требует дополнительного прохода по дереву. ### Конфигурация SWC для удаления свойств В SWC данная функциональность включается через секцию трансформации React: ```json { "jsc": { "transform": { "react": { "runtime": "automatic", "development": false, "refresh": false, "removeProperties": true, "removePropertiesPatterns": ["^data-test", "^data-testid", "^debug-"] } } } } ``` Ключевой параметр `removeProperties` активирует механизм фильтрации. Массив `removePropertiesPatterns` определяет регулярные выражения, по которым происходит удаление атрибутов. Каждое выражение применяется к имени свойства JSX-элемента. Если имя совпадает хотя бы с одним паттерном, атрибут исключается из результирующего дерева. ### Принцип сопоставления паттернов Сопоставление выполняется через регулярные выражения JavaScript-совместимого формата. Это означает, что: * проверяется только имя атрибута; * значение атрибута не учитывается; * регистр символов имеет значение, если не задан флаг `i` в регулярном выражении; * поддерживаются сложные шаблоны, включая группы и альтернативы. Пример набора правил: ```json "removePropertiesPatterns": [ "^data-", "^aria-debug", "internal$" ] ``` В данном случае будут удалены: * `data-id` * `data-test` * `aria-debug-mode` * `component-internal` ### Пример трансформации кода Исходный JSX: ```jsx export function Button(props) { return ( ); } ``` После применения SWC-трансформации: ```jsx export function Button(props) { return ( ); } ``` Удалены все атрибуты, попадающие под заданные паттерны, при этом функциональные свойства компонента сохранены без изменений. ### Работа с JSXSpreadAttributes Особое внимание требуется при обработке spread-операторов: ```jsx