ESM build cannot be imported in Node.js: `dist/` emits extensionless relative specifiers

未关闭 适合新手
#4 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

评估

难度
2/5
预计耗时
1-3 小时
新手友好度
72/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
活跃
领域
build-system

调研方向

ESM 输出由 tsconfig.build.json 生成,该文件将 module 设为 ESNext,将 moduleResolution 设为 bundler,因此 ./api 这类相对导入在 dist/*.js 中保持无扩展名。请先阅读该配置以及 package.json 中的构建脚本,然后运行构建并用 node 导入 dist/index.js 来复现问题。完成的标准是:ESM 版 dist 能在 Node 下加载且不出现 ERR_MODULE_NOT_FOUND,并且 CJS 输出仍然可用。

由索引模型根据 Issue 内容生成。

描述

Importing @craftycodie/cstruct in a Node.js ES module fails at load time with ERR_MODULE_NOT_FOUND, whereas require("@craftycodie/cstruct") works via dist-cjs/index.js.

npm init -y && npm install @craftycodie/[email protected]
node --input-type=module -e 'import { c } from "@craftycodie/cstruct"; console.log(c.sizeof(c.struct({ x: c.u8() })));'

Actual output:

Error [ERR_MODULE_NOT_FOUND]: Cannot find module '.../node_modules/@craftycodie/cstruct/dist/api' imported from .../node_modules/@craftycodie/cstruct/dist/index.js

Expected output:

1

tsconfig.build.json compiles the ESM output with "module": "ESNext" and "moduleResolution": "bundler", so tsc preserves extensionless relative and directory specifiers (such as "./api" and "./field-types") in dist/*.js, which Node's ESM resolver rejects.

Versions tested: @craftycodie/[email protected] and main (9421e72), Node.js v26.13.0.

Credit: https://ucsbplse.github.io/

主要语言
TypeScript
星标
4
派生
0
平均合并
21 天 8 小时
30 天内合并 PR
1

环境准备

  • 没有 Dockerfile 或 Docker Compose 文件
  • 没有 Pull Request 模板
  • 阅读贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

相似的 Issue

更多 TypeScript Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。