Официальный 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. Перевод документации на другие языки осуществляется сообществом по мере наличия сил и желания.
Помните, что переведенные статьи могут быть неактуальными, поэтому для получения наиболее точной и актуальной информации рекомендуем использовать оригинальную англоязычную версию документации.