Files
homepage/spec/predictor.md
2026-03-07 12:10:50 +03:00

55 lines
2.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Модернизация пакета @anwinged/predictor
## Проблема
Пакет собран через webpack в UMD-формат с `eval()` внутри чанков. Это создает проблемы при использовании в современных проектах на Vite/Astro:
1. **UMD-обертка использует `window`** — падает в SSR/Node.js окружении.
2. **`eval()` в бандле** — нарушает Content Security Policy, мешает Vite анализировать зависимости.
3. **Нет ESM-экспорта** — в `package.json` только поле `"main"`, указывающее на UMD-бандл. Vite не может подключить пакет без принудительного пре-бандлинга (`optimizeDeps.include`).
4. **Нет поля `"exports"`** — современные бандлеры не могут автоматически выбрать подходящий формат.
5. **TypeScript-исходники не используются напрямую** — хотя `src/` лежит в пакете, точка входа ведет только на собранный `dist/predictor.js`.
## Что нужно изменить
### 1. Заменить webpack на tsc (или tsup/unbuild)
Исходники уже на TypeScript. Достаточно компилировать их напрямую:
- ESM-вариант: `dist/index.mjs`
- CJS-вариант (опционально): `dist/index.cjs`
- Типы: `dist/index.d.ts`
Webpack для библиотеки из пяти файлов без внешних зависимостей избыточен.
### 2. Обновить package.json
```json
{
"type": "module",
"main": "dist/index.cjs",
"module": "dist/index.mjs",
"types": "dist/index.d.ts",
"exports": {
".": {
"import": "./dist/index.mjs",
"require": "./dist/index.cjs",
"types": "./dist/index.d.ts"
}
},
"files": ["dist"]
}
```
### 3. Убрать привязку к `window`
Текущий UMD-бандл передает `window` как глобальный объект. При сборке через tsc/tsup это уходит автоматически.
### 4. Убрать `eval()`
Webpack в dev-режиме оборачивает модули в `eval()`. При переходе на tsc/tsup проблема исчезает.
## Результат
После этих изменений пакет будет работать в Vite/Astro/Next.js без дополнительной конфигурации (`optimizeDeps.include`, `ssr.noExternal` и т.п.).