Vendoring зависимостей

Vendoring зависимостей представляет собой процесс включения сторонних библиотек непосредственно в проект вместо их загрузки из внешних источников во время сборки или выполнения. В экосистеме Fresh, построенной на Deno и ориентированной на использование ES-модулей, подход к vendoring имеет свои особенности и преимущества.

Причины использования vendoring

  1. Стабильность проекта Сторонние библиотеки могут изменяться или удаляться. Если проект напрямую ссылается на URL-пакет, любое изменение на стороне поставщика может привести к ошибкам. Vendoring позволяет фиксировать версию зависимости и контролировать её наличие локально.

  2. Производительность сборки Когда все зависимости уже находятся в проекте, время на загрузку при сборке или развертывании значительно сокращается.

  3. Безопасность Локальные зависимости уменьшают риск подмены пакета на внешнем сервере или случайной загрузки вредоносного кода.

Vendoring в Deno и Fresh

Fresh построен на Deno, который имеет встроенную поддержку управления модулями через кэш. Однако стандартный кэш Deno не фиксируется в проекте и может очищаться. Vendoring в Fresh обычно реализуется с использованием команды deno vendor.

Пример использования команды:

deno vendor deps.ts

Где deps.ts — это файл, который импортирует все внешние зависимости проекта. Команда создаёт каталог vendor/, содержащий все необходимые модули с их исходным кодом.

Структура проекта с vendoring

После выполнения vendoring проект обычно имеет следующую структуру:

my-fresh-app/
│
├─ main.ts
├─ deps.ts
├─ routes/
├─ components/
├─ vendor/
│   ├─ preact/
│   ├─ fresh/
│   └─ ...
└─ import_map.json
  • deps.ts используется для централизованного импорта всех внешних модулей, что облегчает управление зависимостями.
  • vendor/ содержит физические файлы всех зависимостей.
  • import_map.json позволяет перенаправлять импорты на локальные файлы в vendor/.

Настройка import_map для vendored зависимостей

После создания vendor/ необходимо изменить маппинг импортов, чтобы Deno использовал локальные файлы:

{
  "imports": {
    "preact/": "./vendor/preact/",
    "fresh/": "./vendor/fresh/"
  }
}

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

Управление обновлениями зависимостей

При необходимости обновления библиотек процесс выглядит так:

  1. Обновить версии в deps.ts (изменить URL на новую версию).
  2. Перезапустить deno vendor deps.ts, чтобы заменить старые файлы в vendor/.
  3. Проверить корректность работы проекта после обновления.

Такой подход позволяет строго контролировать, какая версия каждой зависимости используется, и обеспечивает воспроизводимость сборок.

Поддержка в Fresh

Fresh автоматически поддерживает работу с vendored зависимостями через import maps. Все функции маршрутизации, рендеринга компонентов и сервера остаются совместимыми с локально закэшированными библиотеками. Использование vendoring не требует изменения синтаксиса импортов в файлах приложения.

Преимущества и ограничения

Преимущества:

  • Полный контроль над зависимостями.
  • Повышение безопасности и стабильности.
  • Быстрая сборка и развертывание.

Ограничения:

  • Увеличение размера репозитория, так как все зависимости хранятся локально.
  • Необходимость ручного обновления зависимостей для получения новых версий.

Vendoring является важной практикой для крупных проектов на Fresh, где критична стабильность сборки и предсказуемость поведения всех модулей. Контроль версий и локальное хранение библиотек создают надежную основу для разработки и развертывания современных приложений.