Официальный 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 version | Next.js version | Correct plugin version |
---|---|---|
>=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.2.0 | @swc1.9.0 |
>=1.10.0 <1.11.0 | >=15.2.0 <15.2.1 | @swc1.10.0 |
>=1.11.0 | >=15.2.1 <15.4.0 | @swc1.11.0 |
>=1.12.0 | >=15.4.0 | @swc1.12.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 с Next.js, особенно с относительными путями в 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
, effector-action
и @withease/factories
) включены в список фабрик по умолчанию, поэтому вам не нужно явно их перечислять.
Формула
["@effector/swc-plugin", { "factories": ["./path/to/factory", "factory-package"] }]
- Тип:
string[]
- По умолчанию:
[]
Если вы предоставляете относительный путь (начинающийся с ./
), плагин рассматривает его как локальную фабрику относительно корневой директории вашего проекта. Эти фабрики могут быть импортированы только с использованием относительных импортов в вашем коде.
В противном случае, если вы указываете имя пакета или алиас TypeScript, это интерпретируется как точный спецификатор импорта. Вы должны использовать такой импорт точно так, как указано в конфигурации.
Примеры
["@effector/swc-plugin", { "factories": ["./src/factory"] }]
import { createStore } from "effector";
/* createBooleanStore — это фабрика */export const createBooleanStore = () => createStore(true);
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. Это предотвращает двойное срабатывание эффектов и наблюдателей.
Hot Module Replacement работает лучше, когда все фабрики в проекте правильно описаны. Правильная конфигурация фабрик помогает плагину понять, какие подписки нужно удалять при обновлении.
Формула
["@effector/swc-plugin", { "hmr": "es" }]
- Тип:
"es"
|"cjs"
|false
"es"
: Использует API HMRimport.meta.hot
в сборщиках, основанных на ESM, таких как Vite и Rollup"cjs"
: Использует API HMRmodule.hot
в сборщиках, использующих CommonJS модули, таких как Webpack, Next.js или Metro (React Native)false
: Отключает Hot Module Replacement.
- По умолчанию:
false
При сборке для продакшена убедитесь, что установили опцию hmr
в false
, чтобы уменьшить размер бандла и улучшить производительность в runtime.
addNames
Добавляет имена к Юнитам при вызове фабрик (таких как createStore
или createDomain
). Это полезно для отладки во время разработки и тестирования, но рекомендуется отключать это для минификации.
Формула
["@effector/swc-plugin", { "addNames": true }]
- Тип:
boolean
- По умолчанию:
true
addLoc
Включает информацию о местоположении (пути к файлам и номера строк) для Юнитов и фабрик. Это полезно для отладки с такими инструментами, как effector-logger
.
Формула
["@effector/swc-plugin", { "addLoc": true }]
- Тип:
boolean
- По умолчанию:
false
forceScope
Внедряет forceScope: true
во все хуки или вызовы @effector/reflect
, чтобы гарантировать, что ваше приложение всегда использует Scope
во время рендеринга. Если Scope
отсутствует, будет выброшена ошибка, что устраняет необходимость в импортах /scope
или /ssr
.
Подробнее о принудительном использовании Scope в документации effector-react
.
Формула
[ "@effector/swc-plugin", { "forceScope": { "hooks": true, "reflect": 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
и другой отладочной информации к этим создателям юнитов. Убедитесь, что ваш код не зависит от методов домена перед отключением.
Вместо использования создателей юнитов напрямую на домене, рассмотрите использование аргумента domain
в обычных методах.
Формула
["@effector/swc-plugin", { "transformLegacyDomainMethods": false }]
- Тип:
boolean
- По умолчанию:
true
Документация на английском языке - самая актуальная, поскольку её пишет и обновляет команда effector. Перевод документации на другие языки осуществляется сообществом по мере наличия сил и желания.
Помните, что переведенные статьи могут быть неактуальными, поэтому для получения наиболее точной и актуальной информации рекомендуем использовать оригинальную англоязычную версию документации.