Одноранговые зависимости и удаление неиспользуемого кода
Объявляйте React одноранговой зависимостью, включайте удаление кода без побочных эффектов и тестируйте опубликованный пакет
«Одноранговые зависимости и удаление неиспользуемого кода» — бесплатный урок React Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.
Что такое одноранговые зависимости?
Одноранговые зависимости объявляют пакеты, которые требуются вашей библиотеке, но должны предоставляться пользователем. В package.json вашей библиотеки React должен находиться в peerDependencies, а не в dependencies. При установке библиотеки пользователь npm/yarn не устанавливает React автоматически — в приложении пользователя React уже есть, и ваша библиотека использует тот же экземпляр.
Почему не следует помещать React в dependencies?
Если React находится в dependencies вашей библиотеки, npm может установить вторую копию React рядом с копией пользователя. Два экземпляра React в одном приложении нарушают работу всех хуков и вызывают ошибку «Invalid hook call». Объявляя React как peerDependency, вы сообщаете npm: «React нужен, но используйте тот экземпляр, который уже есть у пользователя».
peerDependenciesMeta для необязательных зависимостей
Некоторые одноранговые зависимости могут быть необязательными — например, библиотека может поддерживать и styled-components, и CSS Modules. Обозначьте необязательные зависимости с помощью peerDependenciesMeta: { 'styled-components': { optional: true } }. npm не будет предупреждать пользователей об отсутствующих необязательных зависимостях, но типы TypeScript по-прежнему можно предоставить, если необязательный пакет установлен.
Поле sideEffects
Поле sideEffects в package.json сообщает сборщикам, безопасно ли удалять неиспользуемый код вашей библиотеки. Установка "sideEffects": false сообщает webpack, Rollup и подобным инструментам, что импорт любого модуля вашей библиотеки не вызывает побочных эффектов, поэтому все неиспользуемые экспорты можно безопасно удалить из сборки пользователя.
sideEffects при импорте CSS
Импорты CSS — распространённый побочный эффект: при импорте они добавляют стили на страницу. Если ваша библиотека импортирует CSS-файлы, задайте "sideEffects": ["*.css", "*.scss"], чтобы сообщить сборщикам: JS-файлы можно безопасно обрабатывать для удаления неиспользуемого кода, но CSS-файлы всегда нужно включать при импорте.
Точное удаление неиспользуемого кода с помощью именованных экспортов
Для максимально эффективного удаления неиспользуемого кода экспортируйте каждый компонент как именованный экспорт из собственного файла. В index.ts повторно экспортируйте всё: export { Button } from './Button'. Если пользователь импортирует только Button, сборщик сможет удалить все остальные компоненты. Файлы-агрегаторы с повторными экспортами позволяют использовать этот подход.
Проверка эффективности удаления неиспользуемого кода
Используйте bundlejs.com, чтобы проверить удаление неиспользуемого кода: вставьте оператор импорта, и сервис сообщит фактический размер сборки. Пакет npm size-limit позволяет задать ограничения размера в package.json и завершить работу CI с ошибкой, если размер импорта превышает ограничение: "size-limit": [{ "path": "dist/index.js", "limit": "10 KB" }].
Бюджет размера при публикации
Задайте бюджет размера для импортов вашей библиотеки. Запускайте npx size-limit в CI, чтобы контролировать его соблюдение. Постепенный рост влияния сборки указывает на расползание области ответственности. В целенаправленной библиотеке компонентов размер импорта отдельного компонента должен составлять не более нескольких килобайт. Предупреждайте о регрессиях до того, как они затронут пользователей.
Библиотеки CSS-in-JS в библиотеках компонентов
Избегайте styled-components и Emotion в библиотеках компонентов, которые планируете распространять. Эти решения CSS-in-JS во время выполнения требуют, чтобы пользователь установил ту же библиотеку и версию, что создаёт конфликты одноранговых зависимостей. Даже если пользователь применяет Tailwind или обычный CSS, ему всё равно придётся включить среду выполнения CSS-in-JS в свою сборку. Предпочитайте CSS Modules, которые во время сборки преобразуются в обычный CSS.
CSS Modules в библиотеках
CSS Modules хорошо подходят для библиотек в сочетании со сборщиком, который их обрабатывает. tsup и Rollup могут встроить результат CSS Modules в виде имён классов с ограниченной областью действия. Пользователю не нужно ничего настраивать: стили уже изолированы и включены в JS-сборку либо представлены отдельным CSS-файлом, который импортируется.
devDependencies и peerDependencies
Ваши инструменты разработки (tsup, TypeScript, библиотеки для тестирования, Storybook) относятся к devDependencies — они нужны только во время разработки и исключаются из установки npm для пользователей. React указывается и в peerDependencies (требование среды выполнения), и в devDependencies (он нужен для локальной компиляции и тестирования библиотеки).
Значение поля sideEffects
Что сообщает сборщикам установка "sideEffects": false в package.json библиотеки?
Повторение урока: одноранговые зависимости и удаление неиспользуемого кода
Объявляйте React в peerDependencies (а не dependencies), чтобы пользователи использовали экземпляр React из своего приложения. sideEffects: false включает полное удаление неиспользуемого кода вашей библиотеки. Используйте sideEffects: ['*.css'], чтобы защитить импорты CSS от удаления. Именованные экспорты из отдельных файлов обеспечивают максимальную точность удаления неиспользуемого кода. Устанавливайте бюджет размера с помощью size-limit в CI. В библиотеках предпочитайте CSS Modules вместо CSS-in-JS, чтобы избежать конфликтов одноранговых зависимостей.
Часто задаваемые вопросы
Урок «Одноранговые зависимости и удаление неиспользуемого кода» бесплатный?
Да — полный текст урока «Одноранговые зависимости и удаление неиспользуемого кода» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.
Чему я научусь в уроке «Одноранговые зависимости и удаление неиспользуемого кода»?
Объявляйте React одноранговой зависимостью, включайте удаление кода без побочных эффектов и тестируйте опубликованный пакет Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать React Academy?
Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Одноранговые зависимости и удаление неиспользуемого кода»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке React Academy?
Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Сборка библиотек с Rollup и tsup
- Двойной выходной формат ESM и CJS
- Одноранговые зависимости и удаление неиспользуемого кода
- Публикация в npm и семантическое версионирование