Conversation
Backport of 3257a97 from next. `jsx: 'preserve'` in optimizeDeps.rolldownOptions.transform was self-defeating: the scanner re-parses the transformed output as plain JS (the js-glob transform force-tags glob-containing modules as moduleType js), so any .tsx with JSX failed with PARSE_ERROR: Unexpected JSX expression, the whole scan aborted and pre-bundling was skipped. The classic runtime lowers JSX to bare React.createElement calls without injecting an import; the scan output is never executed, so the undefined identifier is inert. Verified with a packed tarball against vite 8.3.0 + solid-js 1.9.15: `vite optimize`, the dev server and `vite build` all succeed on a .tsx file that uses import.meta.glob. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
🦋 Changeset detectedLatest commit: 8909380 The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
commit: |
…ителя Отказ пришёл с демки-потребителя: 500 на модуле обвязки горячей замены. На живой базе её уже не было, зато нашлось третье место утечки вендора — и оба его отказа живут в предварительной оптимизации зависимостей. 1. JSX-плагин вписывает вендора и его подпути в список предварительной оптимизации, а тот разрешается от папки потребителя, где вендора нет: пять строк «Failed to resolve dependency» на старте. Записи снимаем — пре-бандлить вендора не нужно, он приходит через фасад. 2. Сканер зависимостей транспайлит файлы, в которых есть import.meta.glob (иначе шаблон не развернуть), а разметку опускает по своей настройке — которую JSX-плагин выставляет в «сохранить как есть». Сканер получает файл с неразобранной разметкой и падает парсером, предварительная оптимизация пропускается целиком. Лечим классическим рантаймом для скана: решение рыночное, сверка 2026-09-24 по vitejs/vite#22057 и solidjs/solid-vite-plugin#363. Код скана не исполняется, он нужен лишь чтобы обойти граф импортов. Обе правки — своим плагином и обязательно ПОСЛЕ чужих: иначе их затирает тот же JSX-плагин. Правим конфиг на месте, а не возвратом своего куска — возвращённый список сборщик склеил бы с прежним, и снятое вернулось бы. Почему не поймалось прошлым заходом, хотя стенд уже был: стенд живёт внутри общего воркспейса и вендор доставался ему подъёмом зависимостей наверх, а демка держит свой корень — там подъёма нет. Второй отказ ловится только на файле, где import.meta.glob и разметка лежат вместе, — стенд теперь держит такой файл нарочно. Проверено: на демке корень, модуль обвязки и модуль с glob отдают 200, лог дев-сервера чист; на стенде скан проходит без единой ошибки; build, typecheck, lint, test зон build/solid/ui и стенда зелёные, кроме давно красной build:test (проб у самой зоны нет). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Tested this build against a minimal repro (vite 8.3.1, solid-js 1.9.15) with a It doesn't cover environments other than client. Vite applies top-level Separately, the pkg.pr.new link in the bot comment above 404s, probably because of the repo rename. This path works: |
Fixes #262 on the 2.x line. Backport of 3257a97 (already on
next/@solidjs/vite-plugin3.0.0-next).Problem
For Vite 8+ the plugin set
optimizeDeps.rolldownOptions.transform.jsx: 'preserve'so the Rolldown scanner would not injectreact/jsx-dev-runtimeimports. But the scanner re-parses the transformed output as plain JS (Vite'svite:dep-scan:transform:js-globeven force-tags glob-containing modules asmoduleType: 'js'), so any.tsxwith JSX failed withPARSE_ERROR: Unexpected JSX expression. The whole scan aborted and pre-bundling was skipped:Fix
Use the classic JSX runtime for the scan transform (
jsx: { runtime: 'classic' }). It lowers JSX to bareReact.createElementcalls without injecting any import; the scan output is never executed, it only exists so rolldown can walk the import graph, so the undefined identifier is harmless.Note for anyone testing locally: the string form
jsx: 'classic'(as tried in the issue thread) is not a valid rolldown option and fails withInvalid jsx option. It has to be the object form.Verification
Packed this branch (
pnpm pack) and installed the tarball in a minimal project (vite 8.3.0, solid-js 1.9.15) with a.tsxthat callsimport.meta.globand returns JSX:vite optimize --forceandvite devfail with the parse error above.vite optimize --forcepre-bundlessolid-js, solid-js/web, solid-js/store, solid-js/html, solid-js/h; the dev server serves the file with the glob expanded;vite buildsucceeds.🤖 Generated with Claude Code