npm & yarn
包
包实际上是一个存档文件,即一个目录直接打包为.zip或tar.gz格式的文件,安装后解压还原为目录
完全符合CommonJS规范的包目录应该包含如下这些文件。
❑ package.json:包描述文件。
❑ bin:用于存放可执行二进制文件的目录。
❑ lib:用于存放JavaScript代码的目录。
❑ doc:用于存放文档的目录。
❑ test:用于存放单元测试用例的代码。
npm
install(i)
dependencies与devDependencies的区别
dependencies:包含的依赖包是需要发布到生产环境中的,是项目正常运行必须依赖的包DevDependencies:包含的依赖包只在开发时使用,不用于生产环境,如果只需要项目正常运行,则不必安装这里面的包
npm install package安装包
- 无参数(默认情况)
npm install packageName- 会安装包,并将依赖包的名称添加package.json中的dependencies字段
--save参数npm install packageName --save- 缩写
-S - 与默认情况效果相同(npm@5以后)
--save-dev参数npm install packageName --save-dev- 缩写
-D - 会安装包,并将依赖包的名称添加到package.json中的devDependencies字段
--global参数npm install packageName --global- 缩写
-g - 将一个包安装为全局可用的可执行命令, 安装之后的包将位于系统预设的目录之下
安装某个包时,这个包中package.json的dependencies字段中的依赖会被自动安装,而devDependencies字段中的依赖不会被安装。
npm install初始化项目
- 无参数直接初始化
- 项目package.json中dependencies字段和devDependencies字段中的依赖包都会被安装
--production参数- 只有dependencies字段中的依赖包会被安装,devDependencies中的依赖包不会被安装
--only=dev参数- 只有devDependencies字段中的依赖包会被安装,dependencies字段中的依赖包不会被安装
变体
npm install package-name@tag
npm install package-name@version
npm install package-name@version-range # 例: express@">4.1.0<5.0"
全局安装的位置
使用npm root -g
- macOS或Linux上:
/usr/local/lib/node_modules - Windows上:
C:\Users\YOU\AppData\Roaming\npm\node_modules - nvm:
/Users/YOU/.nvm/versions/node/v14.17.0/lib/node_modules
npm脚本
-
定义:在
package.json文件中用scripts字段定义 -
命名规则:
通过前缀来区分
-
查看:用
npm run查看当前项目中的所有脚本 -
原理:
- 每当执行
npm run就会自动新建一个Shell来执行命令 - 新建的Shell,会将当前目录的
node_modules/.bin子目录加入PATH变量 -
执行结束后,会将
PATH恢复原样 -
通配符:
*表示任意文件名**表示任意一层子目录-
必要的话用
\转义 -
二进制命令简化:NPM 中所有依赖的
node_modules/.bin都可以在脚本中直接访问,就像在路径中被引用的一样
{
"scripts": {
"lint": "./node_modules/.bin/eslint .",
}
}
// 此写法与上面效果相同
{
"scripts": {
"lint": "eslint ."
}
}
- 传参:
- 需要用
--分割来标明 -
例:
npm run lint -- --reporter checkstyle > checkstyle.xml -
执行多个脚本:
-
如果是并行执行(即同时的平行执行),可以使用
&符号注意:这仅适用于 Unix 环境。在 Windows 中,它将按顺序运行。
-
如果是继发执行(即只有前一个任务成功,才执行下一个任务),可以使用
&&符号 -
钩子:
- 有
pre和post两个钩子 - 举例:
build脚本命令的钩子是prebuild和postbuild- 执行
npm run build时会自动按照npm run prebuild && npm run build && npm run postbuild执行
- 默认提供的钩子:
- prepublish,postpublish
- preinstall,postinstall
- preuninstall,postuninstall
- preversion,postversion
- pretest,posttest
- prestop,poststop
- prestart,poststart
- prerestart,postrestart
-
自定义的脚本命令也可以加上
pre和post钩子 -
简写:
// 一组的都一样效果
npm run-script start
npm run start
npm start
npm run stop
npm stop
npm run-script test
npm run test
npm test
npm t
npm run stop && npm run restart && npm run start
npm restart
- 变量:
- 通过
npm_package_前缀可以拿到package.json里面的字段 - 例:
npm_package_name可以拿到name的值 -
嵌套的值可以通过添加下划线拿到
-
静默消息:
- 日志等级:
-
默认值为"notice"
-
可以使用
--loglevel <loglevel>来明确定义运行命令时使用的日志级别 -
简化:
-
从文件中引用路径
{
"scripts": {
"hello:js": "node scripts/helloworld.js",
"hello:bash": "bash scripts/helloworld.sh",
"hello:cmd": "cd scripts && helloworld.cmd"
}
}
- 使用
node <path.js>来执行JS文件 - 使用
node <path.sh>来执行bash文件
值得注意的是,如果是 cmd 或 bat 文件, 则需要先 cd 导航到对应的文件夹目录,不能像 sh, js 文件一样,直接执行,否则会报错。
package.json
创建
属性
name
- 长度不大于214个字符,大写字母不被允许
- 名称会成为URL,命令行参数或者文件夹名称的一部分,所以不能包含
non-URL-safe字符(小写字母和连字符下划线) - 不要使用
js或者node这两个名称
version
- 项目当前版本(格式:major.minor.patch)
- name和version组成npm内部的唯一标识符,如果不想发布的话可以不填
description
- 项目描述
- 会出现在
npm search中
keywords
- 字符串的列表
- 会在
npm search中列出
homepage
- 例:
bugs
-
项目的问题追踪器
-
url和email任一或者皆有都可以,如果提供了url那么会出现在npm bugs中 -
例:
license
- 过时的写法:
// Not valid metadata
{
"license" : {
"type" : "ISC",
"url" : "https://opensource.org/licenses/ISC"
}
}
// Not valid metadata
{
"licenses" : [
{
"type": "MIT",
"url": "https://www.opensource.org/licenses/mit-license.php"
},
{
"type": "Apache-2.0",
"url": "https://opensource.org/licenses/apache2.0.php"
}
]
}
- 如果不希望授权他人使用:
author, contributors
-
author是一个人,contributors是一组人 -
author是一个包含name(必填)和url,email(选填)的对象:
- 也可以全部合并入一个字符串中,npm会解析:
contributors例:
funding
- 可以指定一个包含捐助信息URL的对象来让人们帮助项目成长
- 会出现在
npm fund中
files
-
定义了哪些文件应该被包括在
npm install后的node_modules中 -
例(
vite):
main, browser, module
main字段决定了别人require('xxx')时,引用的是哪个模块对象。在不设置main字段时,默认值是index.js。- 如果你开发的包是用于浏览器端的,那么用
browser指定入口文件是最佳的选择。 module则代表你开发的包支持ESM,并指定了一个ESM入口。
bin
- bin 列出了可执行文件,表示你这个包要对外提供哪些脚本。
- 在这个包被 install 安装时,如果是全局安装 -g,bin 列出的可执行文件会被添加到 PATH 变量(全局可执行);如果是局部安装,则会进入到
node_modules/.bin/目录下。
man
-
用于指定
man命令时返回的帮助文件 -
可以使单个文件或者文件名的列表
-
必须以数字结尾
-
例:
directories
- CommonJS规范指定的目录结构
repository
-
说明程序包仓库的位置, 如果是托管在GitHub上的,那么
npm docs可以列出 -
例:
scripts
- 例:
{
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"deploy": "rsync --archive --delete local-dir user@host:/path/to/dest-dir",
"prepublish": "npm run test"
},
}
config
-
通过
config配置的参数xxx,可以在脚本中通过npm_package_config_xxx的形式引用,比如port -
例:
dependencies
dependencies可以理解为生产依赖- 通过
npm install --save安装的依赖包都会进入到dependencies中
devDependencies
devDependencies可以理解为开发环境依赖,通常是一些工具类的包,比如 webpack, babel等- 通过
npm install --save-dev安装的依赖包都会进入到devDependencies中
peerDependencies
- 为了避免重复安装
- 常见于开发组件或者库
bundleDependencies
-
配置上不是键值对的形式,而是一个数组
-
在运行
npm pack时,会将对应依赖打包到tgz文件中 -
例:
optionalDependencies
- 用于配置可选依赖
- 执行
npm install --no-optional时会阻止这些依赖被安装
engines
-
指定node或者yarn的版本
-
例:
os
-
指定模块运行的操作系统
-
可以使用
process.platform查看 -
例:
cpu
-
指定CPU架构
-
可以使用
process.arch查看 -
例:
private
- 如果设置了
"private": true那么npm会拒绝发布
dist-tags
-
列出符号标签帮助用户选择版本
-
例:
browserslist
-
常见于前端项目中,指定兼容的浏览器版本
-
例:
语义版本控制
当发布新的版本时,要遵循以下规则:
- 当进行不兼容的 API 更改时,则升级主版本。
- 当以向后兼容的方式添加功能时,则升级次版本。
- 当进行向后兼容的缺陷修复时,则升级补丁版本。
npm的版本规则:
^: 只会执行不更改最左边非零数字的更新。- 如果写入的是
^0.13.0,则当运行npm update时,可以更新到0.13.1、0.13.2等,但不能更新到0.14.0或更高版本。 - 如果写入的是
^1.13.0,则当运行npm update时,可以更新到1.13.1、1.14.0等,但不能更新到2.0.0或更高版本。 ~: 如果写入的是〜0.13.0,则当运行npm update时,会更新到补丁版本:即0.13.1可以,但0.14.0不可以。>: 接受高于指定版本的任何版本。>=: 接受等于或高于指定版本的任何版本。<=: 接受等于或低于指定版本的任何版本。<: 接受低于指定版本的任何版本。=: 接受确切的版本。-: 接受一定范围的版本。例如:2.1.0 - 2.6.2。||: 组合集合。例如< 2.1 || > 2.6。
可以合并其中的一些符号,例如 1.0.0 || >=1.1.0 <1.2.0,即使用 1.0.0 或从 1.1.0 开始但低于 1.2.0 的版本。
还有其他的规则:
- 无符号: 仅接受指定的特定版本(例如
1.2.1)。 latest: 使用可用的最新版本。
npx
调用项目安装的模块
npx 想要解决的主要问题,就是调用项目内部安装的模块
# 以执行项目内部测试工具Mocha为例
# 方法1: 在`package.json`的`scripts`字段里面定义
# 方法2: 在项目的根目录下执行
node-modules/.bin/mocha --version
# 方法3: 使用npx
npx mocha --version
其原理便是到node_modules/.bin路径和环境变量$PATH里面,检查命令是否存在
如果不存在,则会在安装后执行
避免全局安装模块
上面代码运行时,npx 将create-react-app下载到一个临时目录,使用以后再删除。
所以,以后再次执行上面的命令,会重新下载create-react-app
使用不同的Node.js版本运行代码
使用 @ 指定版本,并将其与 node npm 软件包 结合使用:
这有助于避免使用 nvm 之类的工具或其他 Node.js 版本管理工具。
直接从URL运行任意代码片段
可以运行位于GitHub gist中的代码
参数
-p --package <package>: 指定安装的包,只在安装多个包时有必要使用--no-install:只执行命令不安装--cache <path>:指定npm缓存位置--userconfig <path>:指定用户设置文件位置--shell <string>:如果指定则用shell运行--ignore-existing:不去检查$PATH或node_modules/.bin中是否存在再下载-q --quiet:npx自身的输出不会输出,子命令中的输出依旧会被显示
npm CLI命令
npm-config
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
outdated
update
list
view
uninstall(un)
npm uninstall <package-name>
npm uninstall -S <package-name>
npm uninstall -D <package-name>
npm uninstall -g <package-name>
yarn
安装
npm install -g yarn # 实际安装的是1.X Classic版本
cd ~/path/to/project
yarn set version berry # 使用yarn 2
yarn set version latest # 升级yarn自身
yarn和npm命令对比
| npm | yarn |
|---|---|
| npm help | yarn help |
| npm init | yarn init |
| npm install / npm i | yarn install / yarn |
| (N/A) | yarn install --flat |
| (N/A) | yarn install --har |
| (N/A) | yarn install --no-lockfile |
| (N/A) | yarn install --pure-lockfile |
| npm uninstall /un | yarn remove |
| npm i <模块名> --global/-g | yarn global add |
| npm i <模块名> --save/-S | yarn add xxx |
| npm i <模块名> --save-dev/-D | yarn add <模块名> -d |
| npm run <命令> | yarn <命令> |
| npm update | yarn update |
| upm update -g | yarn global update |
| npm cache clean | yarn cache clean |
| npm upgrade | yarn upgrade |