Vendoring зависимостей представляет собой процесс включения сторонних библиотек непосредственно в проект вместо их загрузки из внешних источников во время сборки или выполнения. В экосистеме Fresh, построенной на Deno и ориентированной на использование ES-модулей, подход к vendoring имеет свои особенности и преимущества.
Стабильность проекта Сторонние библиотеки могут изменяться или удаляться. Если проект напрямую ссылается на URL-пакет, любое изменение на стороне поставщика может привести к ошибкам. Vendoring позволяет фиксировать версию зависимости и контролировать её наличие локально.
Производительность сборки Когда все зависимости уже находятся в проекте, время на загрузку при сборке или развертывании значительно сокращается.
Безопасность Локальные зависимости уменьшают риск подмены пакета на внешнем сервере или случайной загрузки вредоносного кода.
Fresh построен на Deno, который имеет встроенную поддержку управления
модулями через кэш. Однако стандартный кэш Deno не фиксируется в проекте
и может очищаться. Vendoring в Fresh обычно реализуется с использованием
команды deno vendor.
Пример использования команды:
deno vendor deps.ts
Где deps.ts — это файл, который импортирует все внешние
зависимости проекта. Команда создаёт каталог vendor/,
содержащий все необходимые модули с их исходным кодом.
После выполнения vendoring проект обычно имеет следующую структуру:
my-fresh-app/
│
├─ main.ts
├─ deps.ts
├─ routes/
├─ components/
├─ vendor/
│ ├─ preact/
│ ├─ fresh/
│ └─ ...
└─ import_map.json
deps.ts используется для централизованного импорта всех
внешних модулей, что облегчает управление зависимостями.vendor/ содержит физические файлы всех
зависимостей.import_map.json позволяет перенаправлять импорты на
локальные файлы в vendor/.После создания vendor/ необходимо изменить маппинг
импортов, чтобы Deno использовал локальные файлы:
{
"imports": {
"preact/": "./vendor/preact/",
"fresh/": "./vendor/fresh/"
}
}
Все импорты в коде через deps.ts остаются прежними, но
фактически подгружаются из локальной папки.
При необходимости обновления библиотек процесс выглядит так:
deps.ts (изменить URL на новую
версию).deno vendor deps.ts, чтобы заменить
старые файлы в vendor/.Такой подход позволяет строго контролировать, какая версия каждой зависимости используется, и обеспечивает воспроизводимость сборок.
Fresh автоматически поддерживает работу с vendored зависимостями через import maps. Все функции маршрутизации, рендеринга компонентов и сервера остаются совместимыми с локально закэшированными библиотеками. Использование vendoring не требует изменения синтаксиса импортов в файлах приложения.
Преимущества:
Ограничения:
Vendoring является важной практикой для крупных проектов на Fresh, где критична стабильность сборки и предсказуемость поведения всех модулей. Контроль версий и локальное хранение библиотек создают надежную основу для разработки и развертывания современных приложений.