读懂 package.json
打开一个 JavaScript 或 TypeScript 项目时,先看根目录的 package.json,通常就能找到启动命令、检查命令、依赖和运行条件。它是供工具读取的 JSON 文件,字段的作用取决于读取它的工具;它本身不会编译代码,也不会启动服务。
本文聚焦阅读已有项目。库的类型声明与发布示例见 TypeScript 项目使用 npm 模块,具体版本范围和安装方式见 依赖版本与锁文件。
从一个小项目开始
下面是自编的配置示例,版本号仅用于解释字段,不表示推荐使用的最新版本。
{
"name": "reading-example",
"version": "1.0.0",
"private": true,
"type": "module",
"scripts": {
"check": "tsc --noEmit",
"build": "tsc -p tsconfig.json",
"start": "node dist/index.js"
},
"devDependencies": {
"typescript": "^5.7.3"
},
"engines": {
"node": ">=20"
}
}这份文件表达了几个独立的意图:项目暂不发布到 npm;包作用域内的 .js 使用 ES 模块规则;检查与构建由 TypeScript 负责;运行入口是构建后的 dist/index.js。build 是否真的生成这个文件,还要看 tsconfig.json 的文件范围和输出设置。
先读 scripts:项目怎样工作
scripts 将名字映射到命令。check、dev、build 是项目自行约定的名字,不能只凭名称判断做了哪些检查。
npm run
npm run check
npm run build
npm run check -- --pretty falsenpm run 不带脚本名时列出可用脚本;带脚本名时执行对应命令。最后一行把 --pretty false 传给 check 中的命令。npm 会把本地依赖提供的命令目录加入脚本的 PATH,所以安装了项目依赖后,脚本里的 tsc 可以使用本项目的版本。它不要求你先全局安装 TypeScript。依据:npm run
阅读脚本时还要看是否存在 prebuild、postbuild 等前后钩子。安装流程也可能执行生命周期脚本,不能把 npm install 理解成纯粹下载文件。脚本最终由命令解释器执行,操作系统和 script-shell 设置会影响语法;例如,直接写 Unix 环境变量赋值的脚本未必能在默认 Windows shell 下工作。依据:npm Scripts
再看依赖与运行条件
| 字段 | 阅读时要确认什么 |
|---|---|
dependencies |
本包正常使用所依赖的包;结合实际运行和打包方式判断用途 |
devDependencies |
本项目开发、检查、测试、构建所需的工具 |
peerDependencies |
本包期望与使用方共享的依赖及其兼容范围 |
engines |
作者声明适用的 Node.js、npm 等版本范围 |
private |
为 true 时,npm 会拒绝发布这个包 |
workspaces |
一个仓库包含多个本地包时,其所在目录 |
这些字段的定义来自 npm package.json 文档。engines 不会自动安装或切换 Node.js;是否严格拒绝不匹配的版本还取决于安装工具及其配置。private 也不会把 Git 仓库变成私有仓库,更不等同于内容许可。
看到 workspaces 时,继续读相关子目录的 package.json。根目录的脚本可能只负责调度,实际包的入口和依赖写在子包里。本文只需识别这一层结构,不要求掌握所有多包仓库工具。依据:npm Workspaces
入口字段:给谁看的
| 字段 | 主要作用 |
|---|---|
main |
包的传统主入口 |
exports |
公开的包入口、子路径及条件入口 |
types / typings |
TypeScript 类型声明入口 |
type |
在 Node.js 包作用域中解释 .js 的模块格式 |
bin |
包提供的命令行入口 |
files |
打包时纳入发布包的文件范围 |
main 和 exports 指向使用方加载的入口,不是“执行 npm start 的文件”。npm start 读取的是脚本规则。支持 exports 的 Node.js 会优先使用它;磁盘上存在某个内部文件,不代表使用方可以通过包子路径导入它。依据:Node.js 包入口
types 指向类型声明,声明文件描述接口,不是可执行实现。不同模块解析模式以及 exports 中的条件会影响 TypeScript 的具体选择,不能只检查一个 types 字段就判定整个包的类型解析正确。依据:TypeScript 发布声明文件
常见误区与阅读顺序
package.json必须是合法 JSON,不能直接写注释、单引号或尾随逗号。教程中带省略号的片段不应原样保存为配置。build成功不自动证明类型检查执行过;先看它调用的是tsc、某个打包器,还是自定义脚本。devDependencies中的工具可能是生产构建必需的。应区分“构建环境需要安装”与“部署产物运行时需要安装”。"type": "module"不会把 CommonJS 源码自动改写成 ES 模块,也不等于 TypeScript 的module选项。
实际阅读时,按“scripts → 脚本读取的配置 → 依赖与版本 → 入口文件”的顺序追踪一次。以示例为例,先确认 tsc -p tsconfig.json 的配置,再确认产物是 dist/index.js,最后查看 start 的运行环境。有关各工具分工,继续阅读 模块解析与构建分工。
来源与适用范围
本站依据 npm、Node.js 和 TypeScript 官方文档独立整理,示例为本站编写。核查日期:2026-10-13;npm 链接固定为 v11 文档系列。本文说明字段和阅读方法,不承诺示例适用于每个项目,也不宣称覆盖所有配置字段。