package.json 字段详解:Node.js 项目的核心配置文件完全指南

3 阅读17分钟

引言

package.json 是 Node.js 生态系统中任何项目的核心配置文件,它采用 JSON 格式存储,包含了项目的元数据、依赖关系、脚本命令以及各类配置信息。无论是开发一个简单的 JavaScript 工具库,还是构建复杂的前端应用框架,理解 package.json 中每个字段的含义和适用场景都是开发者必须掌握的基础技能。一个配置得当的 package.json 不仅能够提升项目的可维护性,还能优化构建过程、改善包的分发体验,并帮助其他开发者快速理解和使用你的项目。

本文将从基础字段开始,逐步深入到高级配置,全面介绍 package.json 中的每一个字段,帮助读者建立完整的知识体系。无论你是初学者还是经验丰富的开发者,都能从本文中获得实用的参考信息。

一、项目标识字段:name 与 version

1.1 name 字段

name 字段用于指定项目的名称,这是 package.json 中最重要的字段之一。当你的包发布到 npm 注册表时,这个名称必须是唯一的,因为 npm 不允许重复名称的包共存。对于有作用域的包(如 @scope/package-name),作用域内的名称可以保持唯一性。

命名规则与限制:

{
  "name": "my-awesome-package"
}

首先,名称的长度不能超过 214 个字符(包括作用域前缀),这一点在命名较长的包时需要特别注意。其次,名称必须使用小写字母,可以包含短横线(-)或下划线(_),但不能包含大写字母、空格或其他特殊字符。此外,名称中不能包含与 Node.js 核心模块相同的名称(如 fshttppath 等),也不能在名称中包含 jsnode,因为这会与 JavaScript 和 Node.js 的默认设定产生歧义。

作用域包的命名:

{
  "name": "@company/my-library"
}

作用域包以 @ 符号开头,后面跟着作用域名称(如 @company)和斜杠,再是包名。这种方式非常适合组织内部或企业发布的私有包,能够有效避免与公共包的命名冲突。

最佳实践建议: 在确定包名之前,建议先在 npm 官网(www.npmjs.com/)搜索是否已存在同名包…

1.2 version 字段

version 字段表示项目的当前版本号,它遵循语义化版本规范(Semantic Versioning),格式为 主版本号.次版本号.修订号,即 major.minor.patch。这个字段在发布包时是强制的,npm 使用 name 和 version 的组合来唯一标识一个特定的包版本。

{
  "version": "1.2.3"
}

语义化版本规范解读:

主版本号(major)在进行不兼容的 API 变更时递增,比如移除了某个被废弃的方法或改变了方法的签名。次版本号(minor)在保持向后兼容的前提下添加了新功能时递增,例如新增了一个可选参数或工具方法。修订号(patch)在保持向后兼容的前提下修复了 bug 时递增,比如修正了某个函数的错误返回值。

预发布版本与构建元数据:

{
  "version": "2.0.0-alpha.1",
  "version": "1.0.0-beta.3",
  "version": "1.0.0+build.123"
}

除了标准版本号,你还可以使用预发布版本标识(如 alphabetarc)来标记开发中的版本,以及构建元数据(+build.123)来标识同一版本的不同构建。

二、项目描述与元数据字段

2.1 description 字段

description 字段是一个字符串,用于简要描述项目的功能和用途。这个描述会出现在 npm 网站的搜索结果中,因此一个好的描述能够帮助其他开发者更容易地发现你的包。

{
  "description": "一个轻量级的数据处理工具库,提供链式调用和函数式编程支持"
}

写作建议: 描述应该简洁明了,尽量在 100 个字符以内说明核心功能。可以提及主要特性、使用场景或解决的问题,但避免堆砌关键词。

2.2 keywords 字段

keywords 字段是一个字符串数组,用于添加项目的关键词。这些关键词同样会出现在 npm 搜索中,有助于提高包的曝光度。

{
  "keywords": [
    "utility",
    "helper",
    "data-processing",
    "functional-programming",
    "chainable"
  ]
}

优化建议: 选择与项目功能紧密相关的关键词,既不要太宽泛(如 javascript),也不要过于狭窄。可以参考同类热门包的关键词来选择。

2.3 homepage 字段

homepage 字段指定项目官方主页的 URL,通常是项目文档或 GitHub Pages 的地址。

{
  "homepage": "https://github.com/username/project#readme"
}

这个字段会在 npm 注册表页面显示,点击后可以直接跳转到你的项目主页。

2.4 bugs 字段

bugs 字段用于指定项目的问题反馈渠道,通常是一个对象,包含 urlemail 属性。

{
  "bugs": {
    "url": "https://github.com/username/project/issues",
    "email": "support@project.com"
  }
}
{
  "bugs": {
    "url": "https://github.com/username/project/issues"
  }
}

只需要提供 URL 或 email 中的一个即可,两者都提供也是可以的。npm 的 npm bugs 命令会使用这个字段来打开问题追踪页面。

三、作者与贡献者信息字段

3.1 author 字段

author 字段表示包的作者信息,可以是一个字符串或一个对象。

{
  "author": "张三 <zhangsan@example.com> (https://example.com)"
}
{
  "author": {
    "name": "张三",
    "email": "zhangsan@example.com",
    "url": "https://example.com"
  }
}

对象格式允许更详细地记录作者信息,包括姓名、邮箱和网址。在 npm 网站上,作者信息通常会显示在包的详情页面。

3.2 contributors 字段

contributors 字段是一个数组,用于列出项目的所有贡献者。

{
  "contributors": [
    "李四 <lisi@example.com> (https://example.com)",
    {
      "name": "王五",
      "email": "wangwu@example.com",
      "url": "https://example.com"
    }
  ]
}

这个数组可以混合使用字符串和对象格式,按贡献重要程度或时间顺序排列。

四、入口与模块解析字段

4.1 main 字段

main 字段指定了当其他包引用你的包时,应该加载哪个文件作为入口。它是 Node.js 项目中最传统的入口文件指定方式。

{
  "main": "./dist/index.js"
}
{
  "main": "index.js"
}

当别人执行 const myPackage = require('my-package') 时,Node.js 会加载 main 字段指定的文件。对于纯 JavaScript 库来说,main 通常指向编译后的 CommonJS 版本,而源代码可能位于 srclib 目录。

4.2 module 字段

module 字段用于指定 ES Module(ESM)格式的入口文件。当打包工具(如 webpack、Rollup)进行打包时,它们会优先使用 module 字段指定的文件,因为它支持更好的 tree-shaking。

{
  "main": "./dist/cjs/index.js",
  "module": "./dist/esm/index.js"
}

这种配置方式常见于同时发布 CommonJS 和 ES Module 两种格式的库。main 供 Node.js 环境使用,而 module 供打包工具在浏览器环境中进行静态分析和优化。

4.3 type 字段

type 字段用于指定 package.json 所在目录中所有 .js 文件的模块类型,可选值为 "module""commonjs"

{
  "type": "module"
}
{
  "type": "commonjs"
}

type 设置为 "module" 时,项目中的 .js 文件会被视为 ES Module,默认使用 importexport 语法。当设置为 "commonjs" 时,则使用 require()module.exports 语法。如果不指定这个字段,默认为 "commonjs"

注意事项: 如果你使用 type: "module",但需要引入 CommonJS 格式的模块,可以使用动态导入(import())或者确保模块文件使用 .cjs 扩展名。相反,如果默认是 CommonJS,但想使用 ES Module,可以将文件命名为 .mjs

4.4 exports 字段

exports 字段是现代 package.json 中最强大的模块解析配置,它允许你为包定义不同的入口点,支持条件导出和环境特定的路径。

{
  "exports": {
    ".": {
      "import": "./dist/esm/index.js",
      "require": "./dist/cjs/index.js",
      "types": "./dist/types/index.d.ts"
    },
    "./utils": "./dist/utils/index.js",
    "./package.json": "./package.json"
  }
}

exports 字段的路径必须是相对路径,不能指向外部路径或包含变量。点(.)表示主入口,其他路径用于包的子模块导出。使用 exports 字段时,主入口文件也应该被包含在 files 字段中。

4.5 types 与 typesVersions 字段

types 字段(也可以命名为 typings)指定 TypeScript 类型定义的入口文件。

{
  "types": "./dist/types/index.d.ts"
}
{
  "typings": "./dist/types/index.d.ts"
}

对于使用 TypeScript 编写的库,这个字段告诉 TypeScript 编译器在哪里找到类型定义。

typesVersions 字段 则允许你为不同版本的 TypeScript 提供不同的类型定义,这对于兼容多个 TypeScript 版本很有用:

{
  "typesVersions": {
    ">=4.0.0": {
      "ts4": "./dist/ts4.0/types"
    },
    ">=3.8.0": {
      "ts3.8": "./dist/ts3.8/types"
    }
  }
}

4.6 bin 字段

bin 字段用于指定可执行文件的路径,使得安装包后可以直接从命令行运行这些脚本。

{
  "bin": "./bin/cli.js"
}
{
  "bin": {
    "my-cli": "./bin/cli.js",
    "my-app": "./bin/app.js"
  }
}

当包被安装为全局依赖时,npm 会创建符号链接指向 bin 字段指定的文件。在脚本文件的开头,通常需要添加 shebang 行:

#!/usr/bin/env node

console.log('Hello from CLI!');

五、依赖管理字段

5.1 dependencies 字段

dependencies 字段指定了项目运行时必需的依赖包,这些包在生产环境中也需要使用。

{
  "dependencies": {
    "lodash": "^4.17.21",
    "axios": "~1.6.0",
    "express": "5.0.0"
  }
}

版本号语法说明:

  • ^4.17.21:允许次版本号和补丁版本号更新(>=4.17.21 <5.0.0
  • ~1.6.0:允许补丁版本号更新(>=1.6.0 <1.7.0
  • 1.6.0:精确版本号
  • >=1.0.0:版本范围
  • latest:最新版本
  • *"":任意版本

常见的运行时依赖包括 UI 框架、数据处理库、网络请求库、日期处理库等。

5.2 devDependencies 字段

devDependencies 字段指定仅在开发过程中需要的依赖,这些包不会在生产环境中安装。

{
  "devDependencies": {
    "typescript": "^5.3.0",
    "eslint": "^8.55.0",
    "jest": "^29.7.0",
    "@types/node": "^20.10.0"
  }
}

常见的开发依赖包括构建工具(webpack、vite)、测试框架(jest、mocha)、代码检查工具(eslint、prettier)、TypeScript 编译器以及类型定义包。

5.3 peerDependencies 字段

peerDependencies 字段用于声明你的包与某个宿主包或环境的兼容性,通常用于插件系统。

{
  "peerDependencies": {
    "react": ">=16.8.0",
    "react-dom": ">=16.8.0"
  }
}

当插件被安装时,npm 会检查宿主环境是否已安装 peerDependencies 中声明的包,并输出警告(如果没有安装)。这种方式可以让插件依赖于宿主包,同时避免将宿主包重复安装到 node_modules 中。

5.4 optionalDependencies 字段

optionalDependencies 字段用于指定可选依赖,这些依赖即使安装失败也不会影响项目的正常运行。

{
  "optionalDependencies": {
    "fsevents": "^2.3.3"
  }
}

使用可选依赖时,你的代码应该能够处理该包不存在的情况。这常用于平台特定的依赖,比如原生模块。

5.5 bundledDependencies 字段

bundledDependencies 字段是一个数组,指定在发布包时需要包含的依赖。

{
  "bundledDependencies": ["lodash", "axios"]
}
{
  "bundname": ["lodash", "axios"]
}

当包被发布时,这些依赖会被捆绑到 tarball 中,下载该包的用户不需要单独安装这些依赖。这常用于确保某些依赖的特定版本与包一起分发。

5.6 overrides 字段

overrides 字段允许你强制使用特定版本的依赖,覆盖传递依赖中的版本。

{
  "overrides": {
    "lodash": "4.17.21"
  }
}
{
  "overrides": {
    "some-package": {
      "nested-dependency": "2.0.0"
    }
  }
}

这个功能常用于解决依赖冲突或安全漏洞,但应谨慎使用,因为它可能引入不稳定因素。

六、脚本配置字段

6.1 scripts 字段

scripts 字段定义了一系列可以通过 npm runyarn run 执行的脚本命令。

{
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview",
    "test": "jest",
    "lint": "eslint src --ext .js,.ts",
    "prepare": "husky install"
  }
}

npm 钩子脚本: 一些特殊的脚本名称会在特定时机自动执行:

  • preinstall:在包安装之前执行
  • install:在包安装之后执行
  • postinstall:在包安装完成之后执行
  • preuninstall:在包卸载之前执行
  • uninstall:在包卸载之后执行
  • postuninstall:在包卸载完成之后执行
  • prepublish:在包发布之前执行(也包括不带参数的本地 npm publish 之前)
  • preprepare:在准备打包和发布之前执行
  • prepare:在包被打包和发布之前执行
  • postprepare:在包被打包和发布之前完成之后执行
  • preshrinkwrap:在包被压缩之前执行
  • shrinkwrap:在包被压缩之后执行
  • postshrinkwrap:在包被压缩完成之后执行

便捷简写: npm 提供了一些可以直接使用不带 run 的命令:

npm start     # npm run start
npm test      # npm run test
npm stop      # npm run stop
npm restart   # npm run restart
npm ci        # clean install

脚本中使用 npm 包: 在 scripts 中可以直接调用 node_modules 中的二进制文件,不需要使用完整路径:

{
  "scripts": {
    "build": "esbuild src/index.ts --bundle --outfile=dist/index.js"
  }
}

七、发布配置字段

7.1 files 字段

files 字段指定了发布包时需要包含的文件或目录,数组中可以使用 glob 模式。

{
  "files": [
    "dist",
    "lib",
    "package.json"
  ]
}

默认情况下,npm 会忽略以下文件和目录:

  • .git
  • .npmignore 中列出的内容(如果有)
  • node_modules(除非单独指定)
  • package-lock.json

你可以在 files 数组中使用通配符模式,如 dist/*.js 只包含 dist 目录下的 JS 文件。

7.2 repository 字段

repository 字段指定项目源代码仓库的地址。

{
  "repository": {
    "type": "git",
    "url": "https://github.com/username/project.git"
  }
}
{
  "repository": "github:username/project"
}
{
  "repository": "gitlab:username/project"
}

这个字段会被 npm 用于生成项目链接,也在一些工具中用于确定代码来源。

7.3 license 字段

license 字段指定项目的开源许可证,这关系到其他开发者如何使用你的代码。

{
  "license": "MIT"
}
{
  "license": "(MIT OR Apache-2.0)"
}

常见的开源许可证包括:

  • MIT:宽松许可,允许自由使用、修改和分发,但必须保留版权声明
  • Apache-2.0:允许闭源使用,要求保留版权声明和许可协议
  • GPL-3.0:要求衍生作品也必须开源
  • ISC:类似 MIT,但更简洁
  • BSD-3-Clause:允许闭源使用,要求保留版权声明

7.4 private 字段

private 字段用于防止意外发布私有包到 npm 注册表。

{
  "private": true
}

设置为 true 后,npm publish 命令会拒绝发布。这对于不想公开发布但又想使用 npm scripts 和依赖管理功能的项目很有用。

7.5 publishConfig 字段

publishConfig 字段用于在发布时覆盖某些配置。

{
  "publishConfig": {
    "registry": "https://npm.example.com",
    "access": "restricted",
    "tag": "beta"
  }
}

常见的配置项包括 registry(发布到的仓库地址)、access(公开或受限)、tag(发布的标签)等。

八、构建与优化字段

8.1 sideEffects 字段

sideEffects 字段是 webpack、Rollup 等打包工具用于 tree-shaking 优化的关键配置。

{
  "sideEffects": false
}
{
  "sideEffects": [
    "*.css",
    "*.scss",
    "./src/polyfill.js"
  ]
}

当设置为 false 时,表示所有文件都没有副作用,未使用的导出可以被安全地移除。当设置为数组时,指定哪些文件有副作用,这些文件不会被 tree-shaking 移除。

副作用的定义: 副作用是指模块在被导入时,除了导出变量或函数外,还会执行一些影响外部环境的操作,如修改全局变量、设置原型方法、添加 DOM 节点等。

// 有副作用的代码示例
Array.prototype.myMethod = function() { /* ... */ };

// 无副作用的代码示例
export const add = (a, b) => a + b;

注意事项: 如果你的包包含 CSS 文件或必须在模块加载时执行的初始化代码,应该在 sideEffects 数组中明确指定,否则这些文件可能被 tree-shaking 意外移除。

8.2 browserslist 字段

browserslist 字段用于指定项目支持的目标浏览器环境,被 Autoprefixer、PostCSS 和 Babel 等工具使用。

{
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not dead"
  ]
}

常见查询语法:

  • > 5%:市场份额大于 5% 的浏览器
  • last 2 versions:每个浏览器的最后两个版本
  • not dead:不是已停止支持的浏览器
  • not IE 11:排除 IE 11
  • iOS 7:iOS 7 的特定版本
  • maintained node versions:Node.js 仍在维护的版本

8.3 engines 字段

engines 字段用于指定项目运行所需的 Node.js 版本或其他运行时版本。

{
  "engines": {
    "node": ">=16.0.0",
    "npm": ">=8.0.0"
  }
}

这个字段主要用于提供信息性警告,帮助开发者了解项目的运行环境要求。当包被安装时,如果版本不匹配,默认只会产生警告,但可以通过配置 engine-strict 使其报错。

8.4 cpu 与 os 字段

cpuos 字段用于指定项目支持的 CPU 架构和操作系统。

{
  "cpu": [
    "x64",
    "ia32"
  ]
}
{
  "os": [
    "darwin",
    "linux",
    "win32"
  ]
}

这些字段可以防止在不兼容的平台上安装包,os 字段支持 win32darwinlinux 等常见值,也可以使用 !win32 这样的否定语法。

九、工作区与高级配置字段

9.1 workspaces 字段

workspaces 字段用于管理 monorepo(单一仓库多包)项目,允许在根目录的 package.json 中统一管理多个子包。

{
  "workspaces": [
    "packages/*"
  ]
}
{
  "workspaces": [
    "packages/a",
    "packages/b",
    "packages/c"
  ]
}

使用 workspaces 后,所有子包的依赖都会被提升到根目录的 node_modules 中,子包之间可以相互引用,适合管理大型项目的多个相关包。

9.2 packageManager 字段

packageManager 字段指定项目使用的包管理器及其版本。

{
  "packageManager": "pnpm@9.5.0"
}

这个字段可以帮助团队确保使用相同版本的包管理器,从而避免因包管理器行为差异导致的问题。用户在首次运行项目时,如果使用的包管理器版本不匹配,会收到提示。

9.3 workspaces 高级用法

workspaces 支持更复杂的配置,包括条件依赖和共享配置:

{
  "workspaces": {
    "packages": [
      "packages/*"
    ],
    "nohoist": [
      "**/react-native"
    ]
  }
}

某些 monorepo 工具(如 yarn workspaces)支持 nohoist 配置,用于阻止将特定依赖提升到根目录。

十、类型定义与兼容性字段

10.1 typesVersions 高级配置

typesVersions 支持更复杂的版本匹配语法:

{
  "typesVersions": {
    ">=4.0": {
      "*": ["ts4/*"],
      "react": ["ts4/react"]
    },
    ">=3.7.0": {
      "*": ["ts3.7/*"]
    }
  }
}

这种配置可以为不同版本的 TypeScript 提供不同的类型定义文件,或者为不同的子模块提供专门的类型定义。

10.2 exports 的条件导出

exports 字段支持更复杂的环境特定导出:

{
  "exports": {
    ".": {
      "types": {
        "import": "./dist/esm/index.d.ts",
        "require": "./dist/cjs/index.d.ts"
      },
      "module": "./dist/esm/index.js",
      "import": "./dist/esm/index.js",
      "require": {
        "types": "./dist/cjs/index.d.ts",
        "default": "./dist/cjs/index.js"
      },
      "default": "./dist/esm/index.js"
    },
    "./features": {
      "import": "./dist/esm/features/index.js",
      "require": "./dist/cjs/features/index.js"
    }
  }
}

完整的条件导出配置可以确保各种环境(Node.js、浏览器、打包工具)都能正确加载模块。

十一、安全与维护相关字段

11.1 funding 字段

funding 字段用于指定项目的资助信息,帮助用户了解如何支持项目维护。

{
  "funding": "https://opencollective.com/project"
}
{
  "funding": {
    "type": "opencollective",
    "url": "https://opencollective.com/project"
  }
}
{
  "funding": [
    {
      "type": "patreon",
      "url": "https://www.patreon.com/project"
    },
    {
      "type": "opencollective",
      "url": "https://opencollective.com/project"
    }
  ]
}

11.2 release 字段

release 字段用于配置自动化发布流程的设置,通常与 release-it 等工具配合使用。

{
  "release": {
    "branches": ["main", "beta"],
    "plugins": {
      "@semantic-release/commit-analyzer": {},
      "@semantic-release/release-notes-generator": {},
      "@semantic-release/npm": {},
      "@semantic-release/github": {}
    }
  }
}

11.3 files 字段的高级配置

在某些 monorepo 工具中,files 字段可能支持更复杂的模式:

{
  "files": [
    "dist",
    "!dist/**/*.map",
    "LICENSE"
  ]
}

使用 ! 前缀可以排除特定的文件或目录。

十二、常用配置示例与最佳实践

12.1 库项目的完整配置示例

{
  "name": "my-awesome-library",
  "version": "1.0.0",
  "description": "一个强大的 JavaScript 工具库",
  "keywords": [
    "utility",
    "helper",
    "toolkit"
  ],
  "main": "./dist/cjs/index.js",
  "module": "./dist/esm/index.js",
  "types": "./dist/types/index.d.ts",
  "exports": {
    ".": {
      "types": "./dist/types/index.d.ts",
      "module": "./dist/esm/index.js",
      "import": "./dist/esm/index.js",
      "require": "./dist/cjs/index.js"
    },
    "./utils": {
      "types": "./dist/types/utils.d.ts",
      "module": "./dist/esm/utils.js",
      "import": "./dist/esm/utils.js",
      "require": "./dist/cjs/utils.js"
    },
    "./package.json": "./package.json"
  },
  "type": "module",
  "sideEffects": false,
  "files": [
    "dist",
    "LICENSE",
    "README.md"
  ],
  "scripts": {
    "build": "tsup",
    "test": "vitest run",
    "lint": "eslint src --ext .ts",
    "prepare": "npm run build"
  },
  "author": "开发者名称 <email@example.com>",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "https://github.com/username/my-awesome-library.git"
  },
  "bugs": {
    "url": "https://github.com/username/my-awesome-library/issues"
  },
  "homepage": "https://github.com/username/my-awesome-library#readme",
  "peerDependencies": {
    "react": ">=16.8.0"
  },
  "devDependencies": {
    "typescript": "^5.3.0",
    "tsup": "^8.0.0",
    "vitest": "^1.0.0",
    "eslint": "^8.55.0",
    "@typescript-eslint/parser": "^6.15.0",
    "@typescript-eslint/eslint-plugin": "^6.15.0"
  },
  "engines": {
    "node": ">=16.0.0"
  },
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not dead"
  ]
}

12.2 Web 应用项目的配置示例

{
  "name": "my-web-app",
  "version": "1.0.0",
  "private": true,
  "description": "我的 Web 应用程序",
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview",
    "test": "vitest",
    "lint": "eslint . --ext .js,.jsx,.ts,.tsx",
    "format": "prettier --write \"src/**/*.{js,jsx,ts,tsx}\"",
    "prepare": "husky install"
  },
  "dependencies": {
    "react": "^18.2.0",
    "react-dom": "^18.2.0",
    "react-router-dom": "^6.21.0",
    "zustand": "^4.4.0",
    "axios": "^1.6.0"
  },
  "devDependencies": {
    "@types/react": "^18.2.0",
    "@types/react-dom": "^18.2.0",
    "@vitejs/plugin-react": "^4.2.0",
    "vite": "^5.0.0",
    "typescript": "^5.3.0",
    "vitest": "^1.0.0",
    "@testing-library/react": "^14.1.0",
    "@testing-library/jest-dom": "^6.1.0",
    "eslint": "^8.55.0",
    "prettier": "^3.1.0",
    "husky": "^8.0.0",
    "lint-staged": "^15.2.0"
  },
  "lint-staged": {
    "*.{js,jsx,ts,tsx}": [
      "eslint --fix",
      "prettier --write"
    ]
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }
}

12.3 Monorepo 根目录配置示例

{
  "name": "my-monorepo",
  "version": "1.0.0",
  "private": true,
  "workspaces": [
    "packages/*"
  ],
  "scripts": {
    "dev": "npm run dev --workspaces --if-present",
    "build": "npm run build --workspaces --if-present",
    "test": "npm run test --workspaces --if-present",
    "lint": "npm run lint --workspaces --if-present",
    "clean": "npm run clean --workspaces --if-present"
  },
  "devDependencies": {
    "typescript": "^5.3.0",
    "eslint": "^8.55.0",
    "prettier": "^3.1.0",
    "husky": "^8.0.0"
  },
  "engines": {
    "node": ">=18.0.0",
    "npm": ">=9.0.0"
  }
}

结语

package.json 作为 Node.js 项目的核心配置文件,承载着项目的元数据定义、依赖管理、脚本自动化、打包优化等多项重要职责。通过本文的详细介绍,相信读者已经对 package.json 中的各个字段有了全面而深入的理解。

在实际项目中,合理配置 package.json 不仅能够提升开发效率,还能优化最终产物的体积和性能,改善团队协作体验。建议开发者在配置项目时,参考本文提供的最佳实践,根据项目类型和需求选择合适的字段配置。对于库项目,要特别关注入口文件、类型定义、模块格式和 tree-shaking 相关的配置;对于应用项目,则应重视脚本配置、依赖管理和浏览器兼容性设置。

最后,建议开发者定期查阅 npm 官方文档(docs.npmjs.com/cli/v11/con… package.json 字段的最新规范和推荐用法,因为 Node.js 生态系统仍在不断发展和完善。


相关资源链接: