基础信息
name
包的名称是package.json
中最重要的字段之一,必须唯一且不能包含非URL安全字符。建议不要在名字中包含node
或js
,因为默认假定它是一个JavaScript模块。这个名字会作为URL的一部分、命令行参数或文件夹名称。
注意:
- 在你爱上你的名字之前,你可能需要去NPM Registry检查一下这个名字是否已经被使用了。
version
版本号,必须遵循semver规范,确保每次修改包时都更新版本号。name
和version
共同组成一个唯一的标识符。
description
简短描述,有助于用户通过npm search
发现你的包。
keywords
关键词数组,帮助用户更容易找到你的包。
homepage
项目主页链接,区别于url
字段。注意:如果使用url
字段,可能会被误认为是重定向地址。
bugs
提交问题的URL或邮箱地址,这对于遇到问题的开发者非常有帮助。
license
指定许可证,可以是标准许可证名称(如"MIT")或包含类型和URL的对象。提供许可证文件也是个好主意。
people fields: author, contributors
- author: 包作者信息,支持对象或字符串格式。
- contributors: 贡献者列表,每个贡献者的信息与
author
相同。
文件相关
files
发布包时应包括的文件列表。也可以使用.npmignore
来排除某些文件。此字段定义了哪些文件会被包含进打包后的tarball中。
main
模块入口文件路径,相对根目录。当用户调用require('your-package')
时,返回的就是这个文件导出的内容。
bin
可执行文件映射,用于添加命令到PATH中。如果只有一个可执行文件且其名称与包名相同,可以直接指定文件路径。
man
手册页文件路径,可以是单个文件或数组。如果文件名不是以包名开头,则会自动加上前缀。
directories
指定包内特定类型的文件夹位置,如lib
, doc
, man
等。这些信息目前主要用于元数据。
CommonJS Packages 规范说明
- directories.lib: 指向库文件夹的位置。
- directories.bin: 如果指定了“bin”目录,该文件夹中的所有文件都会被当作
bin
字段使用。 - directories.man: 放满man页面的文件夹,自动生成一个
man
数组。 - directories.doc: 存放Markdown文档的地方。
- directories.example: 存放示例脚本的地方。
版本控制与脚本
repository
指向代码仓库的URL,便于贡献者参与开发。URL应该是公开的、直接由版本控制系统处理的链接。
scripts
定义了生命周期事件对应的命令,例如安装、构建、测试等。参见npm-scripts(7)。
生命周期事件
preinstall
: 在安装之前运行。install
: 安装过程中运行。postinstall
: 安装完成之后运行。prepublish
: 发布之前运行。prepare
: 在prepublish
和prepublishOnly
之后,在npm publish
前运行。prepublishOnly
: 类似prepublish
,但仅在npm publish
时触发。start
: 启动服务。test
: 运行测试。stop
: 停止服务。restart
: 重启服务。
依赖关系
dependencies
生产环境中必需的依赖及其版本范围。请勿将测试或临时依赖放在dependencies
中,而应该放入devDependencies
。详见semver(7)。
devDependencies
开发环境所需的额外工具或库。它们会在根目录执行npm link
或npm install
时初始化,并可以像其他npm配置参数一样管理。
peerDependencies
声明插件与其宿主之间的兼容性需求,通常用于引用宿主工具或库。这能保证你的包只能与特定版本的宿主一起初始化。
optionalDependencies
可选安装的依赖,允许安装失败而不影响整体初始化。需要注意的是,程序需要能够适当地处理缺失的依赖。
bundledDependencies
发布时捆绑在一起的依赖,也接受拼写为bundleDependencies
。
依赖URL
可以指定一个tarball URL,这个tarball将在包被初始化的时候下载并初始化。
依赖Git URL
Git URLs 可以是以下几种形式:
git://github.com/user/project.git#commit-ish
git+ssh://user@hostname:project.git#commit-ish
git+ssh://user@hostname/project.git#commit-ish
git+http://user@hostname/project/blah.git#commit-ish
git+https://user@hostname/project/blah.git#commit-ish
commit-ish
是可以被git checkout的任何tag、sha或者branch。默认为master。
GitHub URLs
从1.1.65版后,你可以仅仅用“user/foo-project”引用GitHub urls。
{
"dependencies": {
"express": "visionmedia/express"
}
}
运行环境
engines
指定Node.js和npm版本要求,确保包能在正确的环境中运行。
engineStrict
强制执行engines
字段中的版本限制,除非你非常确定,否则不推荐使用。
os
允许运行的操作系统列表,可以通过黑名单形式(前置!
)禁止某些操作系统。
cpu
支持的CPU架构,同样支持黑名单形式(前置!
)。
发布设置
preferGlobal
推荐全局安装的标志,若设为true
,则提醒用户最好全局安装该包。
private
防止意外发布私有库,设为true
则npm不会发布此包。
publishConfig
发布时使用的特殊配置选项,比如指定标签或注册表地址。任何配置都可以被重写,但通常只有tag
和registry
与发布的意图有关。
默认值
npm会根据包的内容自动设置某些默认值:
- 如果存在
server.js
,则为start
命令设置默认值。 - 若根目录下有
wscript
或binding.gyp
,则为preinstall
命令提供编译指令。 - 从
AUTHORS
文件解析contributors
。
高级特性与最佳实践
使用.npmrc
文件
可以在项目的根目录创建一个.npmrc
文件来覆盖全局配置,适用于团队内部或不同项目间共享配置。
定义config
字段
config
hash可以用来配置用于包脚本中的跨版本参数。例如,如果一个包有下面的配置:
{
"name": "foo",
"config": {
"port": "8080"
}
}
然后有一个“start”命令引用了npm_package_config_port
环境变量,用户可以通过npm config set foo:port 8001
来重写它。
使用peerDependencies
进行插件开发
当你开发一个插件时,使用peerDependencies
来声明对宿主包的依赖,确保插件只与特定版本的宿主一起工作。
管理依赖版本
尽量使用宽松的版本范围,避免锁定到具体版本,以便更好地适应上游的变化。同时,考虑使用resolutions
字段来固定某些依赖的具体版本,以减少潜在的兼容性问题。