diff --git a/packages/vite-plugin-cloudflare/src/cloudflare-environment.ts b/packages/vite-plugin-cloudflare/src/cloudflare-environment.ts index 3f6ab7538783..a22b10f10997 100644 --- a/packages/vite-plugin-cloudflare/src/cloudflare-environment.ts +++ b/packages/vite-plugin-cloudflare/src/cloudflare-environment.ts @@ -1,8 +1,7 @@ import assert from "node:assert"; -import { builtinModules } from "node:module"; import * as vite from "vite"; import { INIT_PATH, UNKNOWN_HOST } from "./shared"; -import { getOutputDirectory } from "./utils"; +import { getOutputDirectory, nodeBuiltInModules } from "./utils"; import type { ResolvedPluginConfig, WorkerConfig } from "./plugin-config"; import type { Fetcher } from "@cloudflare/workers-types/experimental"; import type { @@ -133,6 +132,10 @@ export function createCloudflareEnvironmentOptions( noExternal: true, // We want to use `workerd` package exports if available (e.g. for postgres). conditions: [...defaultConditions, "development|production"], + // The Cloudflare ones are proper builtins in the environment + builtins: [...cloudflareBuiltInModules], + // The Node.js ones are no proper builtins in the environment since we also polyfill them using unenv + external: [...nodeBuiltInModules], }, dev: { createEnvironment(name, config) { @@ -155,7 +158,6 @@ export function createCloudflareEnvironmentOptions( // dev pre-bundling crawling (were we not to set this input field we'd have to appropriately set // optimizeDeps.entries in the dev config) input: workerConfig.main, - external: [...cloudflareBuiltInModules], }, }, optimizeDeps: { @@ -163,9 +165,8 @@ export function createCloudflareEnvironmentOptions( noDiscovery: false, entries: workerConfig.main, exclude: [ - ...cloudflareBuiltInModules, // we have to exclude all node modules to work in dev-mode not just the unenv externals... - ...builtinModules.concat(builtinModules.map((m) => `node:${m}`)), + ...nodeBuiltInModules, ], esbuildOptions: { platform: "neutral", diff --git a/packages/vite-plugin-cloudflare/src/miniflare-options.ts b/packages/vite-plugin-cloudflare/src/miniflare-options.ts index 4c2386244ec1..4ae6da4b164f 100644 --- a/packages/vite-plugin-cloudflare/src/miniflare-options.ts +++ b/packages/vite-plugin-cloudflare/src/miniflare-options.ts @@ -16,6 +16,7 @@ import { } from "./constants"; import { getWorkerConfigPaths } from "./deploy-config"; import { MODULE_PATTERN } from "./shared"; +import { nodeBuiltInModules } from "./utils"; import type { CloudflareDevEnvironment } from "./cloudflare-environment"; import type { PersistState, @@ -328,22 +329,16 @@ export function getDevMiniflareOptions( const [moduleId] = invokePayloadData.data; const moduleRE = new RegExp(MODULE_PATTERN); - // Externalize Worker modules (CompiledWasm, Text, Data) - if (moduleRE.test(moduleId)) { - const result = { - externalize: moduleId, - type: "module", - } satisfies vite.FetchResult; + const shouldExternalize = + // Worker modules (CompiledWasm, Text, Data) + moduleRE.test(moduleId) || + // Node.js builtin node modules (they will be resolved to unenv aliases) + nodeBuiltInModules.has(moduleId); - return MiniflareResponse.json({ result }); - } - - // For some reason we need this here for cloudflare built-ins (e.g. `cloudflare:workers`) but not for node built-ins (e.g. `node:path`) - // See https://github.com/flarelabs-net/vite-plugin-cloudflare/issues/46 - if (moduleId.startsWith("cloudflare:")) { + if (shouldExternalize) { const result = { externalize: moduleId, - type: "builtin", + type: "module", } satisfies vite.FetchResult; return MiniflareResponse.json({ result }); diff --git a/packages/vite-plugin-cloudflare/src/utils.ts b/packages/vite-plugin-cloudflare/src/utils.ts index 61b7382237f0..8652c510dddc 100644 --- a/packages/vite-plugin-cloudflare/src/utils.ts +++ b/packages/vite-plugin-cloudflare/src/utils.ts @@ -1,8 +1,13 @@ +import { builtinModules } from "node:module"; import * as path from "node:path"; import { Request as MiniflareRequest } from "miniflare"; import * as vite from "vite"; import type { IncomingHttpHeaders } from "node:http"; +export const nodeBuiltInModules = new Set( + builtinModules.concat(builtinModules.map((m) => `node:${m}`)) +); + export function getOutputDirectory( userConfig: vite.UserConfig, environmentName: string