Официальный SWC плагин может быть использован для SSR и более удобного опыта отладки в проектах, использующих SWC, таких как Next.js или Vite с плагином vite-react-swc.

Плагин обладает той же функциональностью, что и встроенный babel-plugin.
Он предоставляет всем Юнитам уникальные сиды (Стабильные Идентификаторы) и имена, а также другую отладочную информацию.

Нестабильно

Этот SWC плагин, как и все другие SWC плагины, в настоящее время считается экспериментальным и нестабильным.

SWC и Next.js могут не следовать semver, когда речь идет о совместимости плагинов.

Установка

Установите @effector/swc-plugin с помощью предпочитаемого менеджера пакетов.

npm install -ED @effector/swc-plugin

Версионирование

Чтобы избежать проблем с совместимостью, вызванных критическими изменениями в SWC или Next.js, этот плагин публикует разные ‘метки’ для разных версий @swc/core. Обратитесь к таблице ниже, чтобы выбрать правильную версию плагина для вашей настройки.

Примечание

Для большей стабильности мы рекомендуем зафиксировать версии как вашей среды выполнения (например, Next.js или @swc/core), так и версию @effector/swc-plugin.

Используйте опцию --exact/--save-exact в вашем менеджере пакетов, чтобы установить конкретные, совместимые версии. Это гарантирует, что обновления одной зависимости не сломают ваше приложение.

Версия @swc/coreВерсия Next.jsПравильная версия плагина
>=1.4.0 <1.6.0>=14.2.0 <=14.2.15@swc1.4.0
>=1.6.0 <1.7.0>=15.0.0-canary.37 <=15.0.0-canary.116@swc1.6.0
>=1.7.0 <1.8.0>=15.0.0-canary.122 <=15.0.2@swc1.7.0
>=1.9.0 <1.10.0>=15.0.3 <=15.1.6@swc1.9.0
>=1.10.0 <1.11.0>=15.2.0 <15.2.1@swc1.10.0
>=1.11.0>=15.2.1@swc1.11.0

Для получения дополнительной информации о совместимости обратитесь к документации SWC по Выбору версии SWC и интерактивной таблице совместимости на сайте SWC.

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

Чтобы использовать плагин, просто добавьте его в конфигурацию вашего инструмента.

Next.js

Если вы используете Next.js Compiler, работающий на SWC, добавьте этот плагин в ваш next.config.js.

const nextConfig = {
  experimental: {
    // даже если пусто, передайте объект опций `{}` в плагин
    swcPlugins: [["@effector/swc-plugin", {}]],
  },
};

Вам также нужно установить официальные @effector/next привязки, чтобы включить SSR/SSG.

Turbopack

Обратите внимание, что некоторые функции могут не работать при использовании Turbopack с NextJS, особенно с относительными factories. Используйте на свой страх и риск.

.swcrc

Добавьте новую запись в опцию jsc.experimental.plugins в вашем .swcrc.

{
  "$schema": "https://json.schemastore.org/swcrc",
  "jsc": {
    "experimental": {
      "plugins": [["@effector/swc-plugin", {}]]
    }
  }
}

Конфигурация

factories

Укажите массив имен модулей или файлов, которые следует рассматривать как пользовательские фабрики. При использовании SSR фабрики необходимы для обеспечения уникальных SID по всему вашему приложению.

Примечание

Пакеты (patronum, @farfetched/core, atomic-router и @withease/factories) всегда включены в список фабрик, поэтому вам не нужно явно их перечислять.

Формула

["@effector/swc-plugin", { "factories": ["./path/to/factory", "factory-package"] }]
  • Тип: string[]
  • По умолчанию: []

Если вы предоставляете относительный путь (начинающийся с ./), плагин рассматривает его как локальную фабрику относительно корневой директории вашего проекта. Эти фабрики могут быть импортированы только с использованием относительных импортов в вашем коде.

В противном случае, если вы указываете имя пакета или алиас TypeScript, это интерпретируется как точный спецификатор импорта. Вы должны использовать такой импорт точно так, как указано в конфигурации.

Примеры

// конфигурация
["@effector/swc-plugin", { "factories": ["./src/factory"] }]
// файл: /src/factory.ts
import { createStore } from "effector";

/* createBooleanStore — это фабрика */
export const createBooleanStore = () => createStore(true);
// файл: /src/widget/user.ts
import { createBooleanStore } from "../factory";

const $boolean = createBooleanStore(); /* Рассматривается как фабрика! */

debugSids

Добавляет полный путь к файлу и имя Юнита к сгенерированным сидам для более удобной отладки проблем с SSR.

Формула

["@effector/swc-plugin", { "debugSids": false }]
  • Тип: boolean
  • По умолчанию: false

hmr

Начиная с

@effector/swc-plugin@0.7.0

Включите поддержку Hot Module Replacement (HMR) для очистки связей, подписок и побочных эффектов, управляемых Effector. Это предотвращает двойное срабатывание эффектов и наблюдателей.

Экспериментально

Хотя опция и протестирована, она считается экспериментальной и может иметь неожиданные проблемы в разных сборщиках.

Формула

["@effector/swc-plugin", { "hmr": "es" }]
  • Тип: "es" | "cjs" | "none"
    • "es": Использует API HMR import.meta.hot в сборщиках, соответствующих ESM, таких как Vite и Rollup
    • "cjs": Использует API HMR module.hot в сборщиках, использующих CommonJS модули, таких как Webpack и Next.js
    • "none": Отключает Hot Module Replacement.
  • По умолчанию: none
Обратите внимание

При сборке для продакшена убедитесь, что установили опцию hmr в "none", чтобы уменьшить размер бандла и улучшить производительность в runtime.

addNames

Добавляет имена к Юнитам при вызове фабрик (таких как createStore или createDomain). Это полезно для отладки во время разработки и тестирования, но рекомендуется отключать это для минификации.

Формула

["@effector/swc-plugin", { "addNames": true }]
  • Тип: boolean
  • По умолчанию: true

addLoc

Включает информацию о местоположении (пути к файлам и номера строк) для Юнитов и фабрик. Это полезно для отладки с такими инструментами, как effector-logger.

Формула

["@effector/swc-plugin", { "addLoc": false }]
  • Тип: boolean
  • По умолчанию: false

forceScope

Внедряет forceScope: true во все хуки или вызовы @effector/reflect, чтобы гарантировать, что ваше приложение всегда использует Scope во время рендеринга. Если Scope отсутствует, будет выброшена ошибка, что устраняет необходимость в импортах /scope или /ssr.

Примечание

Подробнее о принудительном использовании Scope в документации effector-react.

Формула

["@effector/swc-plugin", { "forceScope": false }]
  • Тип: boolean | { hooks: boolean, reflect: boolean }
  • По умолчанию: false

hooks

Принудительно заставляет все хуки из effector-react и effector-solid, такие как useUnit и useList, использовать Scope в runtime.

reflect

с

Поддерживается @effector/reflect начиная с 9.0.0

Для пользователей @effector/reflect принудительно заставляет все компоненты, созданные с помощью библиотеки reflect, использовать Scope в runtime.

transformLegacyDomainMethods

Если включено (по умолчанию), эта опция преобразует создатели Юнитов в Доменах, такие как domain.event() или domain.createEffect(). Однако это преобразование может быть ненадежным и может повлиять на несвязанный код. Если это ваш случай, отключение этой опции может исправить эти проблемы.

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

tip

Вместо использования создателей юнитов напрямую на домене, рассмотрите использование аргумента domain в обычных методах.

Формула

["@effector/swc-plugin", { "transformLegacyDomainMethods": true }]
  • Тип: boolean
  • По умолчанию: true
Перевод поддерживается сообществом

Документация на английском языке - самая актуальная, поскольку её пишет и обновляет команда effector. Перевод документации на другие языки осуществляется сообществом по мере наличия сил и желания.

Помните, что переведенные статьи могут быть неактуальными, поэтому для получения наиболее точной и актуальной информации рекомендуем использовать оригинальную англоязычную версию документации.

Соавторы