Skip to content

[Bug]: Windows 下加载 mock 入口时直接 import 绝对路径导致启动失败 #8734

Description

@hgchenhao

版本信息

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给出的方案

Image

复现链接

复现步骤

  1. 在 Windows 环境启动 Modern.js 项目
  2. 项目中存在 mock 入口文件:

apps/web/config/mock/index.js

  1. 执行:

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) 后也可以规避该问题。

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Fields

No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions