Package.json 的imports 和 exports

也就是说imports只对当前包内的文件生效,而exports 可以根据 其他人如何导入我的包内的文件生效

对,准确说是这样

imports 和 exports 的作用域不一样,而且语义也不一样。

imports

它是"当前包内部"的解析规则。

也就是在这个包里,代码写:

js 复制代码
import x from '#/foo'

时,Node/Vite 会在"当前 package"的上下文里查 package.json#imports,并把它映射成真正的文件路径。

它不关心"别人怎么从外部 import 你的包";它关心的是:

  • 这个包内部的源代码
  • 当前模块如何解析 # 开头的 specifier

所以它只对当前包内的模块生效。


exports

它是"对外发布接口"的规则。

比如你在包里配置:

json 复制代码
{
  "name": "my-lib",
  "exports": {
    ".": {
      "import": "./dist/index.mjs",
      "require": "./dist/index.cjs"
    },
    "./foo": {
      "import": "./dist/foo.mjs",
      "require": "./dist/foo.cjs"
    }
  }
}

这种配置决定的是:

  • 外部代码怎么从你的包里 import
  • 允许哪些入口暴露出来
  • 根据 import / require / node / browser 等条件返回不同文件

也就是说,exports 控制的是:

  • 别人如何导入我这个包
  • 这个包对外暴露哪些文件
  • 入口如何按环境区分 ESM / CJS

一句话区分

  • imports:当前包自己内部用
  • exports:别人外部使用这个包时用

举个例子

你的包内

json 复制代码
{
  "imports": {
    "#/*": "./src/*"
  }
}

在这个包内部写:

ts 复制代码
import a from '#/utils/a'

能用。

但外部项目:

js 复制代码
import myLib from 'your-package'

不会去读这个 imports。


你的包对外

json 复制代码
{
  "exports": {
    ".": {
      "import": "./dist/index.mjs",
      "require": "./dist/index.cjs"
    }
  }
}

外部项目再用:

js 复制代码
import myLib from 'your-package'

或者

js 复制代码
const myLib = require('your-package')

就会按条件走不同入口。


所以你的理解是对的

imports 只对当前包内的文件生效;

exports 影响的是其他人如何导入这个包里的内容。

这两个字段是不同层面的规则,别混在一起。

如果你愿意,我可以再补一个"imports / exports / resolve.alias / tsconfig.paths"的四者对照图,最容易记住。

相关推荐
hasty3 天前
不上传新包,也能改变用户拿到的版本:npm dist-tag 的 OIDC 权限治理
前端·npm·node.js
玖石书5 天前
HiSH 通过 apk 安装 Node.js、npm 与 pnpm
npm·node.js·鸿蒙·hish
FACELESS VOID5 天前
wsl下使用npm,错误识别到了windows下的npm
linux·windows·npm
搬砖的小码农_Sky7 天前
AI Agent:Windows上Node.js安装后 npm -v报错
前端·npm·node.js·人机交互
梅孔立9 天前
Codex 完整教程(Node.js安装 + npm安装Codex + DeepSeek配置 + 快捷键 + 设置)
前端·npm·node.js
AlfredZhao16 天前
npm 源切换:一条命令搞定
npm
@tangguo12317 天前
npm 和 yarn 配置说明
前端·javascript·npm·node.js·yarn
钝挫力PROGRAMER21 天前
npx 与 npm 全局安装/更新/卸载
npm·npx·mcp·dsh
天若有情67323 天前
开源轻量双语工具|一键批量查询 NPM 包历史下载量,支持按作者批量统计
javascript·npm·github pages·开源工具·netlify·前端开源·npm克隆量
柚稚姐姐1 个月前
npm install pnpm -g npm error code EACCES npm error syscall symlink
前端·npm·node.js