Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

SvelteKit deploy: the framework Worker packager resolves external packages with browser conditions, so `@sentry/sveltekit` fails to bundle

オープン
#422 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

まだ誰も着手していません。

評価

難易度
4/5
見積もり時間
1〜2日
初心者へのやさしさ
51/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
typescript, vite
領域
build-system

調査の方向性

Read packages/void/src/cli/wrapper.ts around bundleEntry and its WORKER_CONDITIONS, then compare the lib build in packages/void/src/cli/cf-build-output.ts. Add a fixture package with both browser and workerd exports and check that both packaging paths resolve the Worker entry to the workerd file. Done means the regression test passes and the Sentry and postgres repros package with Worker conditions.

索引モデルが issue の本文から書いたものです。

説明

bug

Problem

A SvelteKit + Void app imports @sentry/sveltekit (11.7.0) in src/hooks.server.ts. vp build passes. void deploy then fails at the packaging step, before anything is uploaded:

● sveltekit framework deploy
● Found 1 migration
◇ Bundling worker...
■ Build failed with 1 error:

  Error: [vite+]: Rolldown failed to resolve import "$app/stores" from
  "…/node_modules/@sentry/sveltekit/build/esm/client/svelte4BrowserTracing.js".
  This is most likely unintended because it can break your application at
  runtime.
  If you do want to externalize this module explicitly add it to
  `build.rolldownOptions.external`

The void deploy --platform cloudflare packager has the same problem and gives the same error.

pg/MySQL SvelteKit apps hit it too after #413, with the same error.

The same cause can also fail without any error at build time. postgres (3.4.9) packages fine, but the packager picks its Node build. Node's net/crypto/stream become an empty stub, so the first query fails in workerd:

  • nodejs_als (the SvelteKit preset default): ReferenceError: Buffer is not defined
  • nodejs_als + nodejs_compat: TypeError: import___vite_browser_external.default.Socket is not a constructor

Repro

Start from playground/sveltekit (D1 + KV, @sveltejs/adapter-cloudflare 8, Kit 3).

  1. Add a dependency: "@sentry/sveltekit": "11.7.0".
  2. Add src/hooks.server.ts:
    import * as Sentry from '@sentry/sveltekit';
    import { sequence } from '@sveltejs/kit/hooks';
    
    export const handle = sequence(
      Sentry.initCloudflareSentryHandle({ dsn: 'https://[email protected]/1', tracesSampleRate: 1 }),
      Sentry.sentryHandle(),
    );
    export const handleError = Sentry.handleErrorWithSentry();
    
  3. Run:
    vp build                   # passes
    void deploy --skip-build   # fails at "Bundling worker..."
    
    For the native path, call prepareCfFrameworkBuildOutput (void deploy --platform cloudflare runs it as a preflight) on the same build. It fails with the same error.

Cause

Kit's server build leaves @sentry/sveltekit as a bare import (.svelte-kit/output/server/entries/hooks.server.js: import * as Sentry from "@sentry/sveltekit"). Void then bundles the adapter's _worker.js with a Vite lib build. That build has no ssr and no resolve.conditions, so Vite uses its client environment, with conditions ["module","browser","development|production"].

vp build (Kit + adapter-cloudflare)
  └─ .svelte-kit/cloudflare/_worker.js ──> hooks.server.js ──> "@sentry/sveltekit" (external)
            │
  void deploy                                void deploy --platform cloudflare
  runFrameworkDeploy                         prepareCfFrameworkBuildOutput
  bundleEntry  (wrapper.ts:520)              prepareBundledBuildOutput (cf-build-output.ts:205)
            └──── vite build({ build: { lib } }) → client env, "browser" condition ────┘
                                     │
   @sentry/sveltekit → build/esm/index.client.js → … → client/svelte4BrowserTracing.js
                                     └─ import "$app/stores"  ✗ (exists only inside Kit's build)

Code (on main, b58300ff8):

  • packages/void/src/cli/preset.ts:115-124: the sveltekit preset sets bundle: true (:123). It is the only preset that does.
  • packages/void/src/cli/deploy-managed-framework.ts:133-135: the hosted deploy calls bundleEntry(root, originalEntry).
  • packages/void/src/cli/wrapper.ts:520-553: bundleEntry runs build({ root, build: { lib: { entry, formats: ['es'] }, … } }) and sets no conditions.
  • packages/void/src/cli/deploy-cloudflare-build.ts:326-336: the native deploy runs prepareCfFrameworkBuildOutput for every worker-output preset (SvelteKit, Nuxt, Analog, Astro), as a preflight before remote changes. Only SvelteKit was tested.
  • packages/void/src/cli/cf-build-output.ts:205-229: prepareBundledBuildOutput is the same kind of lib build (configFile: false, lib at :225).
  • packages/void/src/plugin-framework.ts:280-321: for pg/MySQL, the void:sveltekit-worker-build plugin moves only void, drizzle-orm, the driver and packages that import void into Kit's workerd build. "Other dependencies stay external" (:287), so they still reach the browser-condition packager.

@sentry/[email protected] package.json → exports["."]:

{
  "types": "./build/types/index.types.d.ts",
  "workerd": { "import": "./build/esm/index.workerd.js", "require": "./build/cjs/index.workerd.js" },
  "worker":  { "import": "./build/esm/index.worker.js",  "require": "./build/cjs/index.worker.js" },
  "browser": { "import": "./build/esm/index.client.js",  "require": "./build/cjs/index.client.js" },
  "node":    { "import": "./build/esm/index.server.js",  "require": "./build/cjs/index.server.js" },
  "default": { "import": "./build/esm/index.server.js",  "require": "./build/cjs/index.server.js" }
}

With the client conditions, only browser matches, so the import resolves to index.client.js. That file is browser code: it pulls in Kit's $app/* modules and does not export initCloudflareSentryHandle or sentryHandle.

[email protected] exports["."] is { "workerd": "./cf/src/index.js", "import": "./src/index.js", … }. The client conditions skip workerd and match import, which is the Node build.

Check: the same bundleEntry options plus only resolve.conditions: ['workerd','worker','browser','module','import','default']:

  • @sentry/sveltekit resolves to index.workerd.js. The build passes, and the Worker returns 200 for / in Miniflare with nodejs_als.
  • postgres resolves to cf/src/index.js. The query reaches a real socket connect.

Suggested fix

Give both lib builds Worker resolve conditions. wrapper.ts:315-316 already defines WORKER_CONDITIONS and uses it for the SQL driver bundle (wrapper.ts:353-357). Use it in bundleEntry and prepareBundledBuildOutput (resolve: { conditions: WORKER_CONDITIONS }). prepareCfStaticBuildOutput (cf-build-output.ts:256) shares prepareBundledBuildOutput, so it gets the same change. Add a regression test with a fixture package that has both browser and workerd exports, and check that the packaged Worker uses the workerd file.

🤖 Generated with Claude Code

https://claude.ai/code/session_0123r5HnanmW2VUrZ7VWDufH

主要言語
TypeScript
スター
402
フォーク
32
平均マージ
12時間 28分
マージ済み PR(30日)
77

環境構築

このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

voidzero-dev/void のほかの issue

voidzero-dev/void の issue をすべて見る

似ている issue

TypeScript の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。