+-
FE.TOOL-npm(v7) js包管理扫盲与进阶
首页 专栏 javascript 文章详情
0
头图

FE.TOOL-npm(v7) js包管理扫盲与进阶

seasonley 发布于 3 月 2 日

扫盲

npm init

普通模块用 npm init
作用域模块用 npm init --scope=@scope-name
npm init --yes or -y 会从当前目录提取的默认值

    name:当前目录名称
    version: 总是 1.0.0
    description:自述文件中的信息,或者为空字符串 ""
    scripts:默认情况下会创建一个空test脚本
    keywords: 空
    author: 空
    license: ISC
    bugs:来自当前目录的信息(如果存在)
    homepage:来自当前目录的信息(如果存在)

为 init 命令设置配置选项

    npm set init.author.email "[email protected]"
    npm set init.author.name "example_user"
    npm set init.license "MIT"

npm install

npm install (with no args, in package dir)
npm install [<@scope>/]<name>
npm install [<@scope>/]<name>@<tag>
npm install [<@scope>/]<name>@<version>
npm install [<@scope>/]<name>@<version range>
npm install <git-host>:<git-user>/<repo-name>
npm install <git repo url>
npm install <tarball file>
npm install <tarball url>
npm install <folder>

alias: npm i
common options: [-P|--save-prod|-D|--save-dev|-O|--save-optional] [-E|--save-exact] [-B|--save-bundle] [--no-save] [--dry-run]

npm uninstall

npm uninstall [<@scope>/]<pkg>[@<version>]... [-S|--save|--no-save]

aliases: remove, rm, r, un, unlink

这将卸载软件包,从而完全删除代表该软件包安装的所有 npm。也从 dependencies,devDependencies,optionalDependencies,peerDependencies 和 package.json 删除软件包。

此外,如果您使用 npm-shrinkwrap.json 或 package-lock.json,则 npm 也会更新这些文件。

--no-save 会告诉 NPM 不会从你删除软件包 package.json,npm-shrinkwrap.json 或 package-lock.json 文件。

--save 或者-S 会告诉 NPM 从您删除软件包 package.json,npm-shrinkwrap.json 以及 package-lock.json 文件。这是默认设置,但是如果您 save=false 的 npmrc 文件中有实例,则可能需要使用它

在全局模式下(-g 或--global),它将当前程序包上下文作为全局程序包卸载。 --no-save 在这种情况下将被忽略。

关于包格式

软件包是以下任意一种:

a)包含由 package.json 文件描述的程序的文件夹 b)gzipped 压缩包含(a) c)解析为(b)的 URL d)在注册表(比如官方的是 https://registry.npmjs.org )上发布的形如(c)的 <name>@<version> e)指向(d)的 <name>@<tag> (比如 vue@next ) f)具有“latest”标签的 <name>满足(e) g)解析为(a)的 <git remote url>

npm 包 git URL 格式

可以通过以下方式格式化用于 npm 软件包的 Git URL:

    git://github.com/user/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 可以是任何的 tag, sha 或 branch 等能够 git checkout 的参数. 默认 commit-ish= master.

依赖

如果 npm 尝试安装的软件包之一是本机节点模块,并且需要编译 C ++代码,则 npm 将使用 node-gyp 来完成该任务。对于 Unix 系统,node-gyp 需要 Python,make 和 GCC 之类的构建链。在 Windows 上,需要 Python 和 Microsoft Visual Studio C ++。node-gyp 不支持 Python 3

目录

npm 具有两种操作模式:

本地模式:npm 将软件包安装到当前项目目录中,该目录默认为当前工作目录。软件包安装到 ./node_modules,并装箱到./node_modules/.bin 全局模式:npm 将软件包安装到的安装前缀中,$npm_config_prefix/lib/node_modules 并将容器装 到 $npm_config_prefix/bin。

本地模式是默认模式。在任何命令上使用-g 或--global 在全局模式下运行。

发布

普通模块用 npm publish 作用域模块用 npm publish --access public 发布 tag: npm publish --tag <tag> 将 dist 标签添加到您的软件包的特定版本中 npm dist-tag add <package-name>@<version> [<tag>] 只跟新 README.md npm version patch && npm publish .npmignore .gitignore 等用来防止发布无关信息

依赖项

"dependencies":在生产中所需的软件包。 npm install <package-name> [--save-prod] "devDependencies":仅本地开发和测试所需的软件包。 npm install <package-name> --save-dev

语义版本控制

三段数字从左导到右:主版本.副版本.补丁。参考semver
指定依赖的版本(参考):

起第一个非零位固定,其他位可增,使用 ^ 范围表示:使用>,<,=,>=或<=用于比较,或-以指定一个包含范围 多个版本使用 || 大于等于该版本,小于主版本 使用 ~

使用node-semver 判断是否合法

弃用包

弃用包 npm deprecate <package-name> "<message>" 弃用指定版本的包 npm deprecate <package-name>@<version> "<message>" 撤销弃用 npm deprecate <package-name>@<version> ""

取消发布

作为软件包所有者或合作者,如果您的软件包没有依赖项,则可以使用 CLI 从 npm 注册表中永久删除它。你可以取消发布 72 小时内最初的发布。超过 72 小时后,如果符合特定条件,您仍然可以取消发布软件包。

取消发布程序包 npm unpublish <package-name> -f会从注册表中永久删除该程序包,因此其他用户将无法再使用该程序包进行安装。 取消发布软件包的单个版本 npm unpublish <package-name>@<version>

更新包

确定哪些全局软件包需要更新 npm outdated -g --depth=0 更新单个全局包 npm update -g <package_name> 更新所有全局安装的软件包 npm update -g

删除包

从 node_modules 目录中删除本地软件包 npm uninstall <package_name> 从 package.json 依赖项中删除本地程序包 npm uninstall --save <package_name> 卸载全局软件包 npm uninstall -g <package_name>

安全

通过运行安全审核 npm audit npm audit 要求软件包具有 package.json 和 package-lock.json 文件。(解决 EAUDITNOPJSON 和 EAUDITNOLOCK 错误) 如果找到安全漏洞并且有可用的更新 npm audit fix

关闭 npm audit

单个包 npm install example-package-name --no-audit 全局 npm set audit false

进阶

v7 新增功能与变化

git diff类似比较 2 个包差异 npm diff 从本地或远程 npm 程序包运行命令 npm exec 打印依赖链 npm explain <folder | specifier> (当试图弄清楚为什么要复制给定的依赖项以满足项目中相互冲突的版本要求时,这可能会很有用。) npm 的安装算法的局限性 在 npm7 中解决了。原本不允许安装和自身重名的包,防止递归无限 install。 支持workplace

包的初始化

源码用的init-package-json

默认情况下,npm 已预先配置为使用 npm 的公共注册表,网址为 https://registry.npmjs.org
如果软件包使用 git URL 列出了依赖关系,则 npm 将使用 git 命令安装该依赖关系,如果未安装,则会生成错误。

npm init [--force|-f|--yes|-y|--scope]
npm init <@scope> (same as `npx <@scope>/create`)
npm init [<@scope>/]<pkg> (same as `npx [<@scope>/]create-<pkg>`)

npm init <initializer>可用于设置新的或现有的 npm 包。

在这种情况下, initializer 程序是一个名为create-<initializer>的 npm 程序包,它将由 npxnpx 安装,然后执行其主程序仓库 - 可能会创建或更新 package.json 并运行任何其他与初始化相关的操作。

init 命令被转换为相应的 npx 操作,如下所示:

npm init foo - > npx create-foo
npm init @usr/foo - > npx @usr/create-foo
npm init @usr - > npm init @usr npx @usr/create

任何其他选项都将直接传递给命令,因此npm init foo --hello将映射到npx create-foo --hello

如果初始化程序被省略(通过调用 npm init ),init 将回退到传统的 init 行为。 它会问你一堆问题,然后为你写一个 package.json。 它会尝试根据选择的现有字段,依赖关系和选项进行合理的猜测。 它是严格相加的,所以它会保留已经设置的任何字段和值。 您也可以使用-y / --yes来完全跳过调查问卷。 如果你传递--scope ,它将创建一个范围包。

简单但实用的一些命令

用编辑器打开包 npm edit react --editor code(在 vscode 打开 node_modules/react) 尝试浏览器打开包的 bug URL npm bugs 尝试浏览器打开包的说明文档 URL npm docs 尝试浏览器打开包的存储库 URL npm repo 打印 npm 将在其中安装可执行文件的文件夹。 npm bin 添加用户帐户 npm adduser npm login 注销 npm logout 在所有 npm 命令中启用制表符补全 npm completion 简化依赖树 npm ddp 可以暂时定位到包的目录 npm explore some-dependency -- git pull origin master 对于 node_modules 文件夹中的 git submodule,特别方便

npm doctor运行一组检查,以确保您的 npm 安装具有管理 JavaScript 软件包所需的内容。包括:

npm ping npm -v node -v npm config get registry which git 权限检查 验证缓存包的校验和 npm ls将以--all 树状结构将已安装的所有版本的软件包及其指定的依赖项打印到标准输出。 npm ping ping npm 注册表 - npm prefix [-g] 打印包含 package.json 文件或 node_modules 目录的最接近的父目录 npm prune [[<@scope>/]<pkg>...] [--production] [--dry-run] [--json] 删除无关的软件包 npm pack [[<@scope>/]<pkg>...] [--dry-run] 将其提取到缓存中,将 tarball 复制到当前目录工作目录为 <name>-<version>.tgz,然后将文件名写出到 stdout。 npm rebuild [[<@scope>/]<name>[@<version>] ...] node 版本切换后,必须重新编译 c++的库 npm restart 等同于 npm run-script restart npm test 等同于 npm run-script test npm root 打印 node_modules 文件夹 npm set-script [<script>] [<command>] 在 package.json 中创建任务 npm shrinkwrap 生成 shrinkwrap 的 package lock 文件,作用优于 package-lock.json npm stars [<user>] 收藏用户 npm star [<pkg>...] 收藏库 npm unstar [<pkg>...] 取消收藏库 npm stop [-- <args>]如果未定义 stop,则不会运行默认脚本

npm view [<@scope>/]<name>[@<version>] ...] 查看注册表信息

npm view connect直接接包名查看包信息 npm view [email protected] dependencies查看包依赖 npm view connect versions查看包历史版本列表,如果 version 不加 s 则表示查看包最新版本。 npm whoami 打印 username 配置

npm cache 包缓存

npm cache add <tarball file>
npm cache add <folder>
npm cache add <tarball url>
npm cache add <name>@<version>

npm cache clean
aliases: npm cache clear, npm cache rm

npm cache verify
add:将指定的软件包添加到本地缓存中。该命令主要供 npm 在内部使用,但是它可以提供一种将数据显式添加到本地安装缓存的方法。 clean:从缓存文件夹中删除所有数据。请注意,这通常是不必要的,因为 npm 的缓存具有自我修复功能并且可以抵抗数据损坏问题。 verify:验证缓存文件夹的内容,对所有不需要的数据进行垃圾回收,并验证缓存索引和所有缓存数据的完整性

npm ci 自动化环境安装

此命令与相似 npm install,不同之处在于它用于自动化环境(例如测试平台,持续集成和部署),或者在任何情况下都要确保干净安装依赖项。

npm ci 在以下情况下将显着提高速度:

有一个 package-lock.jsonnpm-shrinkwrap.json文件。 该 node_modules 文件夹丢失或为空。

简而言之,使用 npm install 和 npm ci 之间的主要区别是:

该项目必须具有现有的 package-lock.json 或 npm-shrinkwrap.json。 如果程序包锁中的依赖项与中的不匹配 package.json, npm ci 则将退出并显示错误,而不是更新程序包锁。 npm ci 一次只能安装整个项目:不能使用此命令添加单个依赖项。 如果 node_modules 已经存在,它将在 npm ci 开始安装之前被自动删除。 它永远不会写入 package.json 或执行任何程序包锁定:安装实际上是冻结的。

npm 钩子

npm hook ls [pkg]
npm hook add <entity> <url> <secret>
npm hook update <id> <url> [secret]
npm hook rm <id>

钩子允许您配置 URL 端点,只要任何受支持的实体类型发生更改,就会通知这些端点。

npm install 相关

使用--production 标志(或者当 NODE_ENV 环境变量设置为 production ), npm install将不会安装 devDependencies 列出的模块。 npm install-ci-test 此命令运行 npm ci 然后立即执行 npm test (别名: npm cit)。 npm install-test这个命令运行一个 npm install 然后立即执行 npm test。它采用与 npm install 完全相同的参数。

npm link

首先,包文件夹中的 npm link 将在全局文件夹{prefix}/lib/node_modules/<package>中创建一个链接到执行 npm link 命令的包。 (请参阅 npm-config 了解 prefix 的值)。 它还会将软件包中的任何 bin 链接到{prefix}/bin/{name} 。

接下来,在其他某个位置, npm link package-name 将创建一个从全局安装的 package-name 到当前文件夹的 node_modules/的符号链接。

也就是说,它首先创建一个全局链接,然后将全局安装目标链接到项目的 node_modules 文件夹中。

npm token

npm token list [--json|--parseable]
  npm token create [--read-only] [--cidr=1.1.1.1/24,2.2.2.2/16]
  npm token revoke <id|token>
list 显示所有活动身份验证令牌的表 create 创建一个新的身份验证令牌。 revoke 立即从注册表中删除身份验证令牌

npm script

前置和后置脚本

{
  "scripts": {
    "precompress": "{{ executes BEFORE the `compress` script }}",
    "compress": "{{ run command to compress files }}",
    "postcompress": "{{ executes AFTER `compress` script }}"
  }
}

工作区(v7 新增)

这组功能弥补了本地文件系统中处理链接包的工作流的简化,避免手动使用链接 npm link

// package.json
{
  "name": "my-workspaces-powered-project",
  "workspaces": ["workspace-a"]
}

install 后目录结构

.
+-- node_modules
|  `-- workspace-a -> ../workspace-a
+-- package-lock.json
+-- package.json
`-- workspace-a
   `-- package.json

使用

// ./workspace-a/index.js
module.exports = "a";

// ./lib/index.js
const moduleA = require("workspace-a");
console.log(moduleA); // -> a

生命周期脚本

有一些特殊的生命周期脚本仅在某些情况下发生。除了“ pre”和“ post”脚本之外,还会发生这些脚本。
prepare,prepublish(已弃用),prepublishOnly,prepack,postpack

生命周期操作顺序

npm publish
    prepublishOnly
    prepare
    prepublish
    publish
    postpublish
npm pack
    prepack
    postpack
npm install
    preinstall
    install
    postinstall
Also triggers
    prepublish (when on local)
    prepare (when on local or workspaces)
npm start
    prestart
    start
    poststart

默认值

"start": "node server.js" "install": "node-gyp rebuild"

如果要在所有包的特定生命周期事件中运行特定脚本,则可以使用挂钩脚本。将可执行文件放在 node_modules/.hooks/{eventname}

包安装路径

todo

npm 配置

npm config set <key>=<value> [<key>=<value> ...]
npm config get [<key> [<key> ...]]
npm config delete <key> [<key> ...]
npm config list [--json]
npm config edit
npm set <key>=<value> [<key>=<value> ...]
npm get [<key> [<key> ...]]
alias: c

npm 从命令行,环境变量,npmrc 文件以及某些情况下(从 package.json 文件中)获取其配置设置。

支持的 npmrc 路径:

每个项目的配置文件(/path/to/my/project/.npmrc) 每个用户的配置文件(~/.npmrc) 全局配置文件($PREFIX/etc/npmrc) npm 内置配置文件(/path/to/npm/npmrc)

npm 配置项

支持环境变量:任何以 npmconfig开头的环境变量 npmconfig将被解释为配置参数。 例如,将 npm_config_foo=bar 放入您的环境中将会将 foo 配置参数设置为 bar 。 任何未赋予值的环境配置都将被赋予 true 值。 配置值不区分大小写,所以 NPM_CONFIG_FOO=bar 会起同样的作用。

npm v7 config 文档
npm v6 config 中文 非官方

package.json 配置项

name

该名称必须小于或等于 214 个字符。 这包括范围包的范围。 名称不能以点或下划线开头。 新包名称中不能包含大写字母。 该名称最终成为 URL 的一部分,命令行中的参数以及文件夹名称。 因此,该名称不能包含任何非 URL 安全字符。 version 版本号

description

字符串。 这有助于人们发现你的包,因为它在 npm search 列出 homepage 主页 URL

bugs 字符串或对象

{
  "url": "https://github.com/owner/project/issues",
  "email": "[email protected]"
}

license

如果您的软件包使用多个通用许可证进行许可,请使用SPDX 许可证表达式语法版本 2.0 字符串

author 或 contributors

对象

{
  "name": "Barney Rubble",
  "email": "[email protected]",
  "url": "http://barnyrubble.tumblr.com/"
}

文本

{
  "author": "Barney Rubble <[email protected]> (http://barnyrubble.tumblr.com/)"
}

files

它描述了将软件包作为依赖项安装时要包含的条目,遵循与.gitignore相似的语法 还可以在包的根目录或子目录中提供一个.npmignore文件,这将防止包含文件 如果有.gitignore文件,并且缺少.npmignore ,则会使用.gitignore的内容

无论设置如何,都会包含某些文件:

package.json README CHANGES / CHANGELOG / HISTORY

-LICENSE / LICENCE

NOTICE 在“main”字段中的文件

相反,一些文件总是被忽略:

.git CVS .svn .hg .lock-wscript .wafpickle-N .*.swp .DS_Store ._* npm-debug.log .npmrc node_modules config.gypi *.orig package-lock.json (如果想发布用 npm-shrinkwrap.json) main 主入口

bin

在安装时,npm会将文件符号链接到prefix/bin以进行全局安装或./node_modules/.bin/本地安装。 单执行文件 “ bin” :“ ./path/to/program”

多入口

    "bin": {
        "my-program": "./path/to/program"
    }
请确保您引用的文件以 #!/usr/bin/env node 开头,否则不会用node执行

man

指定要放置的单个文件或文件名数组,以供man程序查找

directories CommonJS

bin man

repository 指定您的代码所在的地方。

{
    "repository": {
        "type": "git",
        "url": "https://github.com/npm/cli.git"
    }
}
scripts` config 对象 用于设置软件包脚本中使用的配置参数,这些配置脚本会在升级期间持续存在。 dependencies devDependencies 下载并构建您使用的外部测试或文档框架用到的库。 peerDependencies 表达软件包与主机工具或库的兼容性

peerDependenciesMeta 用户安装您的软件包时,如果peerDependencies尚未安装中指定的软件包,npm将发出警告。该 peerDependenciesMeta字段用于向npm提供有关如何使用对等依赖项的更多信息。

"peerDependenciesMeta": {
    "soy-milk": {
    "optional": true
    }
}
bundledDependencies 这些软件包名称将在发布软件包时捆绑在一起。 optionalDependencies 如果找不到依赖项或安装失败,则希望npm继续,则可以将其放在 optionalDependencies对象中。

engines 指定版本

{
"engines": {
    "node": ">=0.10.3 <15",
    "npm": "~1.0.20"
}
}
engineStrict 废除

os 指定操作系统

{
    "os": [
        "darwin",
        "linux",
        "!win32"
    ]
}

cpu 指定cpu

{
    "cpu": [
        "x64",
        "ia32",
        "!arm",
        "!mips"
    ]
}
private 设置 "private": true 防止意外发布私有存储库 publishConfig 这是将在发布时使用的一组配置值。如果要设置tag,registry或access,这特别方便,这样可以确保给定的程序包不标记为“latest”,不发布到全局公共注册表,或者默认情况下作用域模块是私有的。 workspaces 见上
javascript node.js npm
阅读 42 更新于 3 月 2 日
收藏
分享
本作品系原创, 采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议
解决方案库
面对不同问题选择简单高效的解决方案
关注专栏
avatar
seasonley

一切皆数据

579 声望
172 粉丝
关注作者
0 条评论
得票 时间
提交评论
avatar
seasonley

一切皆数据

579 声望
172 粉丝
关注作者
宣传栏
目录

扫盲

npm init

普通模块用 npm init
作用域模块用 npm init --scope=@scope-name
npm init --yes or -y 会从当前目录提取的默认值

    name:当前目录名称
    version: 总是 1.0.0
    description:自述文件中的信息,或者为空字符串 ""
    scripts:默认情况下会创建一个空test脚本
    keywords: 空
    author: 空
    license: ISC
    bugs:来自当前目录的信息(如果存在)
    homepage:来自当前目录的信息(如果存在)

为 init 命令设置配置选项

    npm set init.author.email "[email protected]"
    npm set init.author.name "example_user"
    npm set init.license "MIT"

npm install

npm install (with no args, in package dir)
npm install [<@scope>/]<name>
npm install [<@scope>/]<name>@<tag>
npm install [<@scope>/]<name>@<version>
npm install [<@scope>/]<name>@<version range>
npm install <git-host>:<git-user>/<repo-name>
npm install <git repo url>
npm install <tarball file>
npm install <tarball url>
npm install <folder>

alias: npm i
common options: [-P|--save-prod|-D|--save-dev|-O|--save-optional] [-E|--save-exact] [-B|--save-bundle] [--no-save] [--dry-run]

npm uninstall

npm uninstall [<@scope>/]<pkg>[@<version>]... [-S|--save|--no-save]

aliases: remove, rm, r, un, unlink

这将卸载软件包,从而完全删除代表该软件包安装的所有 npm。也从 dependencies,devDependencies,optionalDependencies,peerDependencies 和 package.json 删除软件包。

此外,如果您使用 npm-shrinkwrap.json 或 package-lock.json,则 npm 也会更新这些文件。

--no-save 会告诉 NPM 不会从你删除软件包 package.json,npm-shrinkwrap.json 或 package-lock.json 文件。

--save 或者-S 会告诉 NPM 从您删除软件包 package.json,npm-shrinkwrap.json 以及 package-lock.json 文件。这是默认设置,但是如果您 save=false 的 npmrc 文件中有实例,则可能需要使用它

在全局模式下(-g 或--global),它将当前程序包上下文作为全局程序包卸载。 --no-save 在这种情况下将被忽略。

关于包格式

软件包是以下任意一种:

a)包含由 package.json 文件描述的程序的文件夹 b)gzipped 压缩包含(a) c)解析为(b)的 URL d)在注册表(比如官方的是 https://registry.npmjs.org )上发布的形如(c)的 <name>@<version> e)指向(d)的 <name>@<tag> (比如 vue@next ) f)具有“latest”标签的 <name>满足(e) g)解析为(a)的 <git remote url>

npm 包 git URL 格式

可以通过以下方式格式化用于 npm 软件包的 Git URL:

    git://github.com/user/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 可以是任何的 tag, sha 或 branch 等能够 git checkout 的参数. 默认 commit-ish= master.

依赖

如果 npm 尝试安装的软件包之一是本机节点模块,并且需要编译 C ++代码,则 npm 将使用 node-gyp 来完成该任务。对于 Unix 系统,node-gyp 需要 Python,make 和 GCC 之类的构建链。在 Windows 上,需要 Python 和 Microsoft Visual Studio C ++。node-gyp 不支持 Python 3

目录

npm 具有两种操作模式:

本地模式:npm 将软件包安装到当前项目目录中,该目录默认为当前工作目录。软件包安装到 ./node_modules,并装箱到./node_modules/.bin 全局模式:npm 将软件包安装到的安装前缀中,$npm_config_prefix/lib/node_modules 并将容器装 到 $npm_config_prefix/bin。

本地模式是默认模式。在任何命令上使用-g 或--global 在全局模式下运行。

发布

普通模块用 npm publish 作用域模块用 npm publish --access public 发布 tag: npm publish --tag <tag> 将 dist 标签添加到您的软件包的特定版本中 npm dist-tag add <package-name>@<version> [<tag>] 只跟新 README.md npm version patch && npm publish .npmignore .gitignore 等用来防止发布无关信息

依赖项

"dependencies":在生产中所需的软件包。 npm install <package-name> [--save-prod] "devDependencies":仅本地开发和测试所需的软件包。 npm install <package-name> --save-dev

语义版本控制

三段数字从左导到右:主版本.副版本.补丁。参考semver
指定依赖的版本(参考):

起第一个非零位固定,其他位可增,使用 ^ 范围表示:使用>,<,=,>=或<=用于比较,或-以指定一个包含范围 多个版本使用 || 大于等于该版本,小于主版本 使用 ~

使用node-semver 判断是否合法

弃用包

弃用包 npm deprecate <package-name> "<message>" 弃用指定版本的包 npm deprecate <package-name>@<version> "<message>" 撤销弃用 npm deprecate <package-name>@<version> ""

取消发布

作为软件包所有者或合作者,如果您的软件包没有依赖项,则可以使用 CLI 从 npm 注册表中永久删除它。你可以取消发布 72 小时内最初的发布。超过 72 小时后,如果符合特定条件,您仍然可以取消发布软件包。

取消发布程序包 npm unpublish <package-name> -f会从注册表中永久删除该程序包,因此其他用户将无法再使用该程序包进行安装。 取消发布软件包的单个版本 npm unpublish <package-name>@<version>

更新包

确定哪些全局软件包需要更新 npm outdated -g --depth=0 更新单个全局包 npm update -g <package_name> 更新所有全局安装的软件包 npm update -g

删除包

从 node_modules 目录中删除本地软件包 npm uninstall <package_name> 从 package.json 依赖项中删除本地程序包 npm uninstall --save <package_name> 卸载全局软件包 npm uninstall -g <package_name>

安全

通过运行安全审核 npm audit npm audit 要求软件包具有 package.json 和 package-lock.json 文件。(解决 EAUDITNOPJSON 和 EAUDITNOLOCK 错误) 如果找到安全漏洞并且有可用的更新 npm audit fix

关闭 npm audit

单个包 npm install example-package-name --no-audit 全局 npm set audit false

进阶

v7 新增功能与变化

git diff类似比较 2 个包差异 npm diff 从本地或远程 npm 程序包运行命令 npm exec 打印依赖链 npm explain <folder | specifier> (当试图弄清楚为什么要复制给定的依赖项以满足项目中相互冲突的版本要求时,这可能会很有用。) npm 的安装算法的局限性 在 npm7 中解决了。原本不允许安装和自身重名的包,防止递归无限 install。 支持workplace

包的初始化

源码用的init-package-json

默认情况下,npm 已预先配置为使用 npm 的公共注册表,网址为 https://registry.npmjs.org
如果软件包使用 git URL 列出了依赖关系,则 npm 将使用 git 命令安装该依赖关系,如果未安装,则会生成错误。

npm init [--force|-f|--yes|-y|--scope]
npm init <@scope> (same as `npx <@scope>/create`)
npm init [<@scope>/]<pkg> (same as `npx [<@scope>/]create-<pkg>`)

npm init <initializer>可用于设置新的或现有的 npm 包。

在这种情况下, initializer 程序是一个名为create-<initializer>的 npm 程序包,它将由 npxnpx 安装,然后执行其主程序仓库 - 可能会创建或更新 package.json 并运行任何其他与初始化相关的操作。

init 命令被转换为相应的 npx 操作,如下所示:

npm init foo - > npx create-foo
npm init @usr/foo - > npx @usr/create-foo
npm init @usr - > npm init @usr npx @usr/create

任何其他选项都将直接传递给命令,因此npm init foo --hello将映射到npx create-foo --hello

如果初始化程序被省略(通过调用 npm init ),init 将回退到传统的 init 行为。 它会问你一堆问题,然后为你写一个 package.json。 它会尝试根据选择的现有字段,依赖关系和选项进行合理的猜测。 它是严格相加的,所以它会保留已经设置的任何字段和值。 您也可以使用-y / --yes来完全跳过调查问卷。 如果你传递--scope ,它将创建一个范围包。

简单但实用的一些命令

用编辑器打开包 npm edit react --editor code(在 vscode 打开 node_modules/react) 尝试浏览器打开包的 bug URL npm bugs 尝试浏览器打开包的说明文档 URL npm docs 尝试浏览器打开包的存储库 URL npm repo 打印 npm 将在其中安装可执行文件的文件夹。 npm bin 添加用户帐户 npm adduser npm login 注销 npm logout 在所有 npm 命令中启用制表符补全 npm completion 简化依赖树 npm ddp 可以暂时定位到包的目录 npm explore some-dependency -- git pull origin master 对于 node_modules 文件夹中的 git submodule,特别方便

npm doctor运行一组检查,以确保您的 npm 安装具有管理 JavaScript 软件包所需的内容。包括:

npm ping npm -v node -v npm config get registry which git 权限检查 验证缓存包的校验和 npm ls将以--all 树状结构将已安装的所有版本的软件包及其指定的依赖项打印到标准输出。 npm ping ping npm 注册表 - npm prefix [-g] 打印包含 package.json 文件或 node_modules 目录的最接近的父目录 npm prune [[<@scope>/]<pkg>...] [--production] [--dry-run] [--json] 删除无关的软件包 npm pack [[<@scope>/]<pkg>...] [--dry-run] 将其提取到缓存中,将 tarball 复制到当前目录工作目录为 <name>-<version>.tgz,然后将文件名写出到 stdout。 npm rebuild [[<@scope>/]<name>[@<version>] ...] node 版本切换后,必须重新编译 c++的库 npm restart 等同于 npm run-script restart npm test 等同于 npm run-script test npm root 打印 node_modules 文件夹 npm set-script [<script>] [<command>] 在 package.json 中创建任务 npm shrinkwrap 生成 shrinkwrap 的 package lock 文件,作用优于 package-lock.json npm stars [<user>] 收藏用户 npm star [<pkg>...] 收藏库 npm unstar [<pkg>...] 取消收藏库 npm stop [-- <args>]如果未定义 stop,则不会运行默认脚本

npm view [<@scope>/]<name>[@<version>] ...] 查看注册表信息

npm view connect直接接包名查看包信息 npm view [email protected] dependencies查看包依赖 npm view connect versions查看包历史版本列表,如果 version 不加 s 则表示查看包最新版本。 npm whoami 打印 username 配置

npm cache 包缓存

npm cache add <tarball file>
npm cache add <folder>
npm cache add <tarball url>
npm cache add <name>@<version>

npm cache clean
aliases: npm cache clear, npm cache rm

npm cache verify
add:将指定的软件包添加到本地缓存中。该命令主要供 npm 在内部使用,但是它可以提供一种将数据显式添加到本地安装缓存的方法。 clean:从缓存文件夹中删除所有数据。请注意,这通常是不必要的,因为 npm 的缓存具有自我修复功能并且可以抵抗数据损坏问题。 verify:验证缓存文件夹的内容,对所有不需要的数据进行垃圾回收,并验证缓存索引和所有缓存数据的完整性

npm ci 自动化环境安装

此命令与相似 npm install,不同之处在于它用于自动化环境(例如测试平台,持续集成和部署),或者在任何情况下都要确保干净安装依赖项。

npm ci 在以下情况下将显着提高速度:

有一个 package-lock.jsonnpm-shrinkwrap.json文件。 该 node_modules 文件夹丢失或为空。

简而言之,使用 npm install 和 npm ci 之间的主要区别是:

该项目必须具有现有的 package-lock.json 或 npm-shrinkwrap.json。 如果程序包锁中的依赖项与中的不匹配 package.json, npm ci 则将退出并显示错误,而不是更新程序包锁。 npm ci 一次只能安装整个项目:不能使用此命令添加单个依赖项。 如果 node_modules 已经存在,它将在 npm ci 开始安装之前被自动删除。 它永远不会写入 package.json 或执行任何程序包锁定:安装实际上是冻结的。

npm 钩子

npm hook ls [pkg]
npm hook add <entity> <url> <secret>
npm hook update <id> <url> [secret]
npm hook rm <id>

钩子允许您配置 URL 端点,只要任何受支持的实体类型发生更改,就会通知这些端点。

npm install 相关

使用--production 标志(或者当 NODE_ENV 环境变量设置为 production ), npm install将不会安装 devDependencies 列出的模块。 npm install-ci-test 此命令运行 npm ci 然后立即执行 npm test (别名: npm cit)。 npm install-test这个命令运行一个 npm install 然后立即执行 npm test。它采用与 npm install 完全相同的参数。

npm link

首先,包文件夹中的 npm link 将在全局文件夹{prefix}/lib/node_modules/<package>中创建一个链接到执行 npm link 命令的包。 (请参阅 npm-config 了解 prefix 的值)。 它还会将软件包中的任何 bin 链接到{prefix}/bin/{name} 。

接下来,在其他某个位置, npm link package-name 将创建一个从全局安装的 package-name 到当前文件夹的 node_modules/的符号链接。

也就是说,它首先创建一个全局链接,然后将全局安装目标链接到项目的 node_modules 文件夹中。

npm token

npm token list [--json|--parseable]
  npm token create [--read-only] [--cidr=1.1.1.1/24,2.2.2.2/16]
  npm token revoke <id|token>
list 显示所有活动身份验证令牌的表 create 创建一个新的身份验证令牌。 revoke 立即从注册表中删除身份验证令牌

npm script

前置和后置脚本

{
  "scripts": {
    "precompress": "{{ executes BEFORE the `compress` script }}",
    "compress": "{{ run command to compress files }}",
    "postcompress": "{{ executes AFTER `compress` script }}"
  }
}

工作区(v7 新增)

这组功能弥补了本地文件系统中处理链接包的工作流的简化,避免手动使用链接 npm link

// package.json
{
  "name": "my-workspaces-powered-project",
  "workspaces": ["workspace-a"]
}

install 后目录结构

.
+-- node_modules
|  `-- workspace-a -> ../workspace-a
+-- package-lock.json
+-- package.json
`-- workspace-a
   `-- package.json

使用

// ./workspace-a/index.js
module.exports = "a";

// ./lib/index.js
const moduleA = require("workspace-a");
console.log(moduleA); // -> a

生命周期脚本

有一些特殊的生命周期脚本仅在某些情况下发生。除了“ pre”和“ post”脚本之外,还会发生这些脚本。
prepare,prepublish(已弃用),prepublishOnly,prepack,postpack

生命周期操作顺序

npm publish
    prepublishOnly
    prepare
    prepublish
    publish
    postpublish
npm pack
    prepack
    postpack
npm install
    preinstall
    install
    postinstall
Also triggers
    prepublish (when on local)
    prepare (when on local or workspaces)
npm start
    prestart
    start
    poststart

默认值

"start": "node server.js" "install": "node-gyp rebuild"

如果要在所有包的特定生命周期事件中运行特定脚本,则可以使用挂钩脚本。将可执行文件放在 node_modules/.hooks/{eventname}

包安装路径

todo

npm 配置

npm config set <key>=<value> [<key>=<value> ...]
npm config get [<key> [<key> ...]]
npm config delete <key> [<key> ...]
npm config list [--json]
npm config edit
npm set <key>=<value> [<key>=<value> ...]
npm get [<key> [<key> ...]]
alias: c

npm 从命令行,环境变量,npmrc 文件以及某些情况下(从 package.json 文件中)获取其配置设置。

支持的 npmrc 路径:

每个项目的配置文件(/path/to/my/project/.npmrc) 每个用户的配置文件(~/.npmrc) 全局配置文件($PREFIX/etc/npmrc) npm 内置配置文件(/path/to/npm/npmrc)

npm 配置项

支持环境变量:任何以 npmconfig开头的环境变量 npmconfig将被解释为配置参数。 例如,将 npm_config_foo=bar 放入您的环境中将会将 foo 配置参数设置为 bar 。 任何未赋予值的环境配置都将被赋予 true 值。 配置值不区分大小写,所以 NPM_CONFIG_FOO=bar 会起同样的作用。

npm v7 config 文档
npm v6 config 中文 非官方

package.json 配置项

name

该名称必须小于或等于 214 个字符。 这包括范围包的范围。 名称不能以点或下划线开头。 新包名称中不能包含大写字母。 该名称最终成为 URL 的一部分,命令行中的参数以及文件夹名称。 因此,该名称不能包含任何非 URL 安全字符。 version 版本号

description

字符串。 这有助于人们发现你的包,因为它在 npm search 列出 homepage 主页 URL

bugs 字符串或对象

{
  "url": "https://github.com/owner/project/issues",
  "email": "[email protected]"
}

license

如果您的软件包使用多个通用许可证进行许可,请使用SPDX 许可证表达式语法版本 2.0 字符串

author 或 contributors

对象

{
  "name": "Barney Rubble",
  "email": "[email protected]",
  "url": "http://barnyrubble.tumblr.com/"
}

文本

{
  "author": "Barney Rubble <[email protected]> (http://barnyrubble.tumblr.com/)"
}

files

它描述了将软件包作为依赖项安装时要包含的条目,遵循与.gitignore相似的语法 还可以在包的根目录或子目录中提供一个.npmignore文件,这将防止包含文件 如果有.gitignore文件,并且缺少.npmignore ,则会使用.gitignore的内容

无论设置如何,都会包含某些文件:

package.json README CHANGES / CHANGELOG / HISTORY

-LICENSE / LICENCE

NOTICE 在“main”字段中的文件

相反,一些文件总是被忽略:

.git CVS .svn .hg .lock-wscript .wafpickle-N .*.swp .DS_Store ._* npm-debug.log .npmrc node_modules config.gypi *.orig package-lock.json (如果想发布用 npm-shrinkwrap.json) main 主入口

bin

在安装时,npm会将文件符号链接到prefix/bin以进行全局安装或./node_modules/.bin/本地安装。 单执行文件 “ bin” :“ ./path/to/program”

多入口

    "bin": {
        "my-program": "./path/to/program"
    }
请确保您引用的文件以 #!/usr/bin/env node 开头,否则不会用node执行

man

指定要放置的单个文件或文件名数组,以供man程序查找

directories CommonJS

bin man

repository 指定您的代码所在的地方。

{
    "repository": {
        "type": "git",
        "url": "https://github.com/npm/cli.git"
    }
}
scripts` config 对象 用于设置软件包脚本中使用的配置参数,这些配置脚本会在升级期间持续存在。 dependencies devDependencies 下载并构建您使用的外部测试或文档框架用到的库。 peerDependencies 表达软件包与主机工具或库的兼容性

peerDependenciesMeta 用户安装您的软件包时,如果peerDependencies尚未安装中指定的软件包,npm将发出警告。该 peerDependenciesMeta字段用于向npm提供有关如何使用对等依赖项的更多信息。

"peerDependenciesMeta": {
    "soy-milk": {
    "optional": true
    }
}
bundledDependencies 这些软件包名称将在发布软件包时捆绑在一起。 optionalDependencies 如果找不到依赖项或安装失败,则希望npm继续,则可以将其放在 optionalDependencies对象中。

engines 指定版本

{
"engines": {
    "node": ">=0.10.3 <15",
    "npm": "~1.0.20"
}
}
engineStrict 废除

os 指定操作系统

{
    "os": [
        "darwin",
        "linux",
        "!win32"
    ]
}

cpu 指定cpu

{
    "cpu": [
        "x64",
        "ia32",
        "!arm",
        "!mips"
    ]
}
private 设置 "private": true 防止意外发布私有存储库 publishConfig 这是将在发布时使用的一组配置值。如果要设置tag,registry或access,这特别方便,这样可以确保给定的程序包不标记为“latest”,不发布到全局公共注册表,或者默认情况下作用域模块是私有的。 workspaces 见上