npm 学习笔记
npm
# npm 学习笔记
# 安装
- 安装
Node.js的时候,会连带一起安装npm - 安装最新版
npm:npm install npm@latest -g
# npx
- npm 从5.2版开始,增加了 npx 命令。npx 想要解决的主要问题,就是调用项目内部安装的模块。
- 对于一些全局安装的工具包,比如
create-react-app,执行npx create-react-app my-react-app,那么npx执行的逻辑是:将create-react-app下载到临时目录,使用以后再删除;若后面再次执行这个命令,会重新下载create-react-app
# 全局链接
- 查看所有全局链接:
npm ls --global --depth 0 - 删除某个全局链接:
npm uninstall --global pkg
# npm link
- 在一个npm的项目中执行
npm link会创建一个全局的npm链接,指向当前执行命令的目录。 - 链接的名字对应的是
package.json中的name,比如叫做:pkgName - 记得给项目添加
main属性,指定主入口。 - 如果要在其他的项目中使用这个全局链接,则在项目的根目录中执行,
npm link pkgName。生成链接后,每次修改代码,都会同步。不需要再做二次链接。 - 如果测试完成后,务必记得删除
pkgName,先在项目中删除模块,执行npm unlink pkgName - 然后进入
pkgName项目根目录,执行npm unlink
# 使用模块
npm link pkgName- 如果
pkgName中指定了"main":"index.js"属性,那么在require的时候,就会去查找pkgName/index.js - 如果
pkgName的package.json中还使用了bin属性,那么会在本地的{prefix}/bin/下面再建立一个软连接,这样就可以直接在命令行中使用bin配置的属性。 - 如果
bin下面有多个命令,则会在{prefix}/bin下面,生成多个全局的软连接。 - 如果执行
bin下面对应命令提示没有权限的话,需要将npm的{prefix}/bin路径,添加到$PATH中。 - 例如,你可以在
.zshrc中,添加代码:export PATH={home}/.nvm/versions/node/v12.16.1/bin。作者本人是使用的nvm管理node,所以PATH可能跟大家的不一样,仅供参考。
# 注意
- 在
pkgName项目中删除的时候,直接npm unlink会删除不掉,错误信息为:Must provide a package name to remove。然后又执行npm unlink pkgName,还是删除不掉。后来使用了npm unlink pkgName -g才能删除成功。不知道是不是使用了nvm的关系。如果是使用原生的node安装包安装,可能会不一样。笔者在这里没有做进一步的测试。 - 测试的
npm版本为7.22.0,这时候,{prefix}/lib/node_modules和{prefix}/bin/下面的软连接都会一起删除掉。 - 也可以进入到目录下,手动删除:
rm linkName
# npm ci
npm ci基于一个独立的库libcipm安装依赖,功能类似npm install。当它安装依赖时,默认是缓存优先的,从而加速装包。- 使用限制:
- 必须包含
package-lock.json - npm 版本
>=5.7
- 必须包含
# npm install
- 在项目中执行
npm install pkgName,pkgName被安装到当前目录的node_modules子目录;其次,node_modules/.bin目录会生成一个符号链接node_modules/.bin/pkgName,指向pkgName模块的可执行脚本。 - 安装成功后,就可以在
package.json的script属性里面,不带路径的引用pkgName这个脚本。
# peerDependency
- 可以用来避免核心依赖库被重复下载的问题。提示宿主环境去安装满足插件
peerDependencies所指定依赖的包。 - 比如
antd就指定了peerDependencies
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
- 我在自己的本地项目中显式的安装依赖
"react": "^17.0.2",然后再安装antd - 最终在本地项目的
node_modules下,安装了"react": "17.0.2"和"react-dom": "17.0.2" - 删除
node_modules和package-lock.json,先安装react@16.0.0,再安装antd,会提示unable to resolve dependency tree - 另外,如果先安装antd,再安装低版本的react,也会提示相应的报错。
# 同yarn比较
# yarn
- 并行安装。二次安装,直接从缓存中读取。速度更快。
- 安装版本统一:生成
yarn.lock文件 - yarn依赖结构是扁平化的。
- 命令:
add, remove - 日志输出更加简洁,仅展示必要的信息。
# npm
- 按照队列进行安装,类似串行安装。
- 5.0版本,默认新增了类似yarn.lock的 package-lock.json
- npm2之前是树形的,npm3以上是扁平化的。
- 命令:
install uninstall,安装的时候打印安装依赖。