前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
返回 AI 情报前线
All News · 全部资讯9258
  • AI评委也会上当:评测模型审查作弊代码的深度测试
  • 生产级LLM系统的状态架构设计要点
  • LLM输出JSON解析的正确做法
  • 2026年MCP Server实战入门:从零构建可用的工具服务器
  • Meta Muse Mac应用安全漏洞:零日与文件系统泄露
  • GitHub Actions添加cancel-in-progress:节省30%构建分钟数
  • MCP工具描述即指令:信任边界的安全教训
  • 7种数据格式Token消耗对比:JSON缩进比CSV多花3倍
  • LLM推理工程:KV-Cache瓶颈与PagedAttention
  • GitHub Copilot 代码审查支持 API 调用,默认改为 Balanced 级别
  • Cloudflare 开源 Clef 决策模型:39ms 完成 AI Agent 决策,无需人工介入
  • jev-ultrafast:把浏览器操作变成多选题
  • AI Agent库的兼容性不止语义版本号
  • OpenAI悄然发布GPT-6官方使用指南
  • 远程MCP长时任务:Agent实际收到什么
  • AI Agent合规审计链路工程观察
  • Go+DiskANN+MCP 构建 AI Agent 时序记忆引擎实战
  • Copilot 桌面控制能力上线:权限模型与安全护栏详解
  • Node 拒绝 package 导入?一 CLI 告诉你根因
  • K8s"单体"经验对AI Agent架构的启示
  • GPT-6模型家族选型指南发布
  • AWS Quick+ MCP模式实现大规模合规审查
  • Bedrock AgentCore为Claude Desktop添加安全网页搜索
  • SageMaker多轮RL微调搜索Agent实战
  • Asta 快速报告生成模型 AstaBrief 开源
  • GitHub:AI时代开发者需加强的三项技能
  • 状态机设计:如何让数据字段影响状态流转
  • 收据、副本、SHA:三种验证方式的本质区别
  • 心跳驱动:无存储的 Agent 健康状态追踪
  • LMCP:让 AI 编程工具直接操控 Mac 原生应用的 MCP 服务器
  • Anthropic开放Claude Code模组自定义功能
  • Meta Muse Agent登陆智能眼镜:云端Linux虚拟机运行,可代打电话/购物
  • Cloudflare AI Gateway支持网页搜索API
  • 英伟达DGX Spark 64GB版4999美元开售,支持4机集群扩展
  • DGX Spark深度解析:vLLM/llama.cpp专项优化,Perplexity已适配
  • Jev开源替代方案:五款自托管决策模型推荐
  • Barclays 扩大与 Anthropic 合作:2027 年多数工程师用上 Claude Code
  • Claude 到 OpenAI SDK 字段映射指南
  • 微软发布语音转录与TTS模型,瞄准语音Agent场景
  • 用1.7B小模型跑coding agent实战
  • LLMjacking攻击解析:API密钥泄露的隐形代价
  • LLM并不会真正推理:驳斥AI思考能力
  • Black Forest Labs发布Flux 3图像模型,支持局部编辑
  • 约束如何让开发者更高效
  • 国产模型路由X-Router:Agent场景实测省50%+ Token
  • AWS开源Strands Decider 2B:115ms本地决策模型
  • 2026 Agent上下文工程四原则
  • 模型边界安全测试的教训:我的攻击有效但靶子设错了
  • 跨AI客户端的本地记忆中枢MemTether
  • 已加载 49 / 9258
8.0
热点
AI SCORE
工具产品2026-10-03 01:07

Node 拒绝 package 导入?一 CLI 告诉你根因

dev.to · AI#Node.js#npm#开源工具
Editor brief · 编辑速览

Node exports 字段的导入失败原因多样(exports缺失、条件不匹配、target为null等),作者开源了一个 exportwhy CLI 可自动诊断。

文章思维导图
Knowledge map
拖拽缩放
Full translation

完整中文译文

错误信息很短:Package subpath './internal' is not defined by "exports"。它只告诉你哪失败了,不说为什么,而修复方法取决于具体是哪种原因。

当 Node 拒绝一个包的子路径导入时,原因通常是以下几种之一:

  • 该子路径不在包的 exports 映射中。
  • 键存在,但加载方式没有激活其中任何条件。只写了 import 的条目在 require 下会失败。
  • 目标为 null,这是故意阻塞该子路径。
  • 目标文件在已安装的包中缺失。
  • 包没有 exports 字段,而 ESM 需要完整的文件名。

要找出是哪种原因,需要打开 node_modules/<pkg>/package.json,然后手动在映射中层层查找,types、import、require、module-sync 和 default 条件嵌套好几层。

我写了一个小 CLI 来完成这个遍历。你在报错的项目中运行它:

npx github:Arthur031221/exportwhy tiny-lib/public

它会让你运行它的那个 Node 来解析当前目录下的路径指定符,分别用 import.meta.resolve 和 createRequire 走一遍,所以 npm 和 pnpm 的目录结构表现和运行时一致。然后它读取已安装包的 exports 映射并解释结果:

import   OK   node_modules/tiny-lib/dist/public.mjs
              exports["./public"].import
require  FAIL ERR_PACKAGE_PATH_NOT_EXPORTED

Why  "./public" matches, but none of its conditions is active for require.
     this entry is import only: load it with import(), or from an ES module.

对于缺失的键,它会列出最近的可公开访问的子路径;当文件在磁盘上存在但被 exports 隐藏时,它也会指出来。对于没有 exports 的包,它会显示 ESM 需要的文件名。两种模式都被拒绝时它以退出码 1 退出,--json 可以输出能直接粘贴到 issue 里的结果。

判断结果始终来自 Node。解释部分是我自己实现的 Node 文档中的查找规则,包括 * 模式匹配和条件数组。如果解释和 Node 的结论不一致,exportwhy 会打印 Node 的答案并说明解释未经确认。测试套件以 npm 和 pnpm 两种目录结构构建手写的包,同时也跑真实安装的包。

它只覆盖 Node 自身的解析。Vite、webpack、TypeScript 和 Bun 对同一个路径指定符可能有不同的接受或拒绝结果。目前是 v0.1,所以可以预期野外的 exports 映射中会有它解释得不好的情况。

如果你遇到了,<specifier> --json 的输出是最有用的 bug 报告:https://github.com/Arthur031221/exportwhy

Original source

本文由 AI 翻译整理自 dev.to · AI,原文版权归原作者所有。

阅读英文原文
上一篇
Copilot 桌面控制能力上线:权限模型与安全护栏详解
下一篇
K8s"单体"经验对AI Agent架构的启示