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

2.6 KiB
Raw Blame History

Модернизация пакета @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

{
  "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 и т.п.).