版本信息
System:
OS: Windows 10 / Windows 11
Node: 22.12.0
pnpm: 10.33.2
npmPackages:
@modern-js/app-tools: 3.1.5
@modern-js/runtime: 3.1.5
@modern-js/server: 3.1.5
问题详情
在 Windows 环境运行 Modern.js 项目时,只要存在 mock 入口文件,项目启动就会失败。
我们的 mock 入口路径是:
apps/web/config/mock/index.js
如果删除或重命名整个 apps/web/config/mock 目录,项目可以正常启动。因此问题看起来和 Modern.js 加载 mock 入口的逻辑有关。
参考下AI给出的方案
复现链接
无
复现步骤
- 在 Windows 环境启动 Modern.js 项目
- 项目中存在 mock 入口文件:
apps/web/config/mock/index.js
- 执行:
pnpm dev
启动失败,报错类似:
Error [ERR_UNSUPPORTED_ESM_URL_SCHEME]: Only URLs with a scheme in: file, data, and node are supported by the default ESM loader.
On Windows, absolute paths must be valid file:// URLs.
Received protocol 'e:'
出错路径是 Windows 绝对路径,例如:
E:\javaworkspace\company\idim\idim_front\apps\web\config\mock\index.js
期望表现
Modern.js 在 Windows 下也可以正常加载 mock 入口文件,项目可以正常启动。
可能原因
看起来是 Modern.js 在加载 mock 文件时,把 Windows 绝对路径直接传给了 ESM dynamic import。
相关源码位置可能是:
packages/server/server/src/helpers/mock.ts
当前逻辑类似:
const { default: mockHandlers, config } = await import(mockFilePath);
但 Windows 下 mockFilePath 是类似这样的路径:
E:\xxx\apps\web\config\mock\index.js
Node.js ESM loader 会把 E: 当成 URL scheme,因此抛出 ERR_UNSUPPORTED_ESM_URL_SCHEME。
这里可能需要先转换为 file:// URL:
import { pathToFileURL } from 'node:url';
const { default: mockHandlers, config } = await import(
pathToFileURL(mockFilePath).href
);
相关信息
看起来和这个 issue 属于同类问题:
另外 Modern.js 之前也有类似 Windows dynamic import 路径问题的修复,使用了 pathToFileURL:
临时规避方式
把 mock 入口改名或删除后可以启动:
apps/web/config/mock/index.js
-> apps/web/config/mock/index.disabled.js
但这样 mock 功能会失效。
本地临时 patch @modern-js/server,把 import(mockFilePath) 改成 import(pathToFileURL(mockFilePath).href) 后也可以规避该问题。
版本信息
System: OS: Windows 10 / Windows 11 Node: 22.12.0 pnpm: 10.33.2 npmPackages: @modern-js/app-tools: 3.1.5 @modern-js/runtime: 3.1.5 @modern-js/server: 3.1.5问题详情
在 Windows 环境运行 Modern.js 项目时,只要存在 mock 入口文件,项目启动就会失败。
我们的 mock 入口路径是:
apps/web/config/mock/index.js
如果删除或重命名整个 apps/web/config/mock 目录,项目可以正常启动。因此问题看起来和 Modern.js 加载 mock 入口的逻辑有关。
参考下AI给出的方案
复现链接
无
复现步骤
apps/web/config/mock/index.js
pnpm dev
启动失败,报错类似:
Error [ERR_UNSUPPORTED_ESM_URL_SCHEME]: Only URLs with a scheme in: file, data, and node are supported by the default ESM loader.
On Windows, absolute paths must be valid file:// URLs.
Received protocol 'e:'
出错路径是 Windows 绝对路径,例如:
E:\javaworkspace\company\idim\idim_front\apps\web\config\mock\index.js
期望表现
Modern.js 在 Windows 下也可以正常加载 mock 入口文件,项目可以正常启动。
可能原因
看起来是 Modern.js 在加载 mock 文件时,把 Windows 绝对路径直接传给了 ESM dynamic import。
相关源码位置可能是:
packages/server/server/src/helpers/mock.ts
当前逻辑类似:
const { default: mockHandlers, config } = await import(mockFilePath);
但 Windows 下 mockFilePath 是类似这样的路径:
E:\xxx\apps\web\config\mock\index.js
Node.js ESM loader 会把 E: 当成 URL scheme,因此抛出 ERR_UNSUPPORTED_ESM_URL_SCHEME。
这里可能需要先转换为 file:// URL:
import { pathToFileURL } from 'node:url';
const { default: mockHandlers, config } = await import(
pathToFileURL(mockFilePath).href
);
相关信息
看起来和这个 issue 属于同类问题:
另外 Modern.js 之前也有类似 Windows dynamic import 路径问题的修复,使用了 pathToFileURL:
临时规避方式
把 mock 入口改名或删除后可以启动:
apps/web/config/mock/index.js
-> apps/web/config/mock/index.disabled.js
但这样 mock 功能会失效。
本地临时 patch @modern-js/server,把 import(mockFilePath) 改成 import(pathToFileURL(mockFilePath).href) 后也可以规避该问题。