NPM使用笔记
NPM 是随同 NodeJS 一起安装的包管理工具,能解决 NodeJS 代码部署上的很多问题。
常见的使用场景有以下几种:
允许用户从NPM服务器下载别人编写的第三方包到本地使用。
允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。
通过输入 npm -v
来测试 npm 是否成功安装
npm install 安装模块
npm 安装 Node.js 模块语法格式如下:npm install <Module Name>
npm install 命令用来安装模块到node_modules目录。
安装之前,npm install会先检查node_modules目录之中是否已经存在指定模块。如果存在,就不再重新安装了,即使远程仓库已经有了一个新版本,也是如此。
如果你希望,一个模块不管是否安装过,npm 都要强制重新安装,可以使用-f
或--force
参数。npm install <packageName> --force
使用package.json
npm install 模块
:安装好后不写入package.json中npm install 模块 --save
安装好后写入package.json的dependencies中(生产环境依赖)npm install 模块 --save-dev
安装好后写入package.json的devDepencies中(开发环境依赖)
npm install <Module Name> --save
:安装的同时,将信息写入package.json中。
项目路径中如果有package.json文件时,直接使用npm install
方法就可以根据dependencies配置安装所有的依赖包
全局安装与本地安装
npm 的包安装分为本地安装(local)、全局安装(global)两种,从敲的命令行来看,差别只是有没有 -g
而已。
本地安装npm install
将安装包放在./node_modules
下(运行npm
命令时所在的目录),如果没有node_modules
目录,会在当前执行npm
命令的目录下生成node_modules
目录。
可以通过require()
来引入本地安装的包。
全局安装npm install -g
将安装包放在/usr/local
下。
可以直接在命令行里使用。
不能通过require()
来引入本地安装的包。
什么时候用本地/全局安装?
1 当你试图安装命令行工具的时候,例如 grunt CLI的时候,使用全局安装
全局安装的方式:npm install -g 模块名称
2 当你试图通过npm install 某个模块,并通过require(‘XXX’)的方式引入的时候,使用本地安装
本地安装的方式:npm install 模块名称
npm install --unsafe-perm
就是说 npm 出于安全考虑不支持以 root 用户运行,即使你用 root 用户身份运行了,npm 会自动转成一个叫 nobody 的用户来运行,而这个用户几乎没有任何权限。这样的话如果你脚本里有一些需要权限的操作,比如写文件(尤其是写 /root/.node-gyp ),就会崩掉了。
为了避免这种情况,要么按照 npm 的规矩来,专门建一个用于运行 npm 的高权限用户;要么加 –unsafe-perm 参数,这样就不会切换到 nobody 上,运行时是哪个用户就是哪个用户,即使是 root。
一劳永逸的方法:npm config set unsafe-perm
针对当前用户的npm config -g set unsafe-perm
全局的
https://docs.npmjs.com/misc/config#unsafe-perm
permission denied 问题
npm install 的时候,经常会碰到一个非常匪夷所思的错误,那就是:即使使用了 sudo,也可能会报权限错误 permission denied。
例如 sudo npm update hexo
时
$ sudo npm update hexo
Password:
> fsevents@1.2.9 install /Users/si.ma/git/madaimeng_backup/node_modules/hexo-fs/node_modules/fsevents
> node install
node-pre-gyp WARN Using needle for node-pre-gyp https download
node-pre-gyp WARN Pre-built binaries not installable for fsevents@1.2.9 and node@10.4.0 (node-v64 ABI, unknown) (falling back to source compile with node-gyp)
node-pre-gyp WARN Hit error EACCES: permission denied, mkdir '/Users/si.ma/git/madaimeng_backup/node_modules/hexo-fs/node_modules/fsevents/lib'
gyp ERR! configure error
gyp ERR! stack Error: EACCES: permission denied, mkdir '/Users/si.ma/git/madaimeng_backup/node_modules/hexo-fs/node_modules/fsevents/build'
gyp ERR! System Darwin 17.7.0
gyp ERR! command "/usr/local/bin/node" "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "configure" "--fallback-to-build" "--module=/Users/si.ma/git/madaimeng_backup/node_modules/hexo-fs/node_modules/fsevents/lib/binding/Release/node-v64-darwin-x64/fse.node" "--module_name=fse" "--module_path=/Users/si.ma/git/madaimeng_backup/node_modules/hexo-fs/node_modules/fsevents/lib/binding/Release/node-v64-darwin-x64" "--napi_version=3" "--node_abi_napi=napi" "--napi_build_version=0" "--node_napi_label=node-v64"
gyp ERR! cwd /Users/si.ma/git/madaimeng_backup/node_modules/hexo-fs/node_modules/fsevents
gyp ERR! node -v v10.4.0
gyp ERR! node-gyp -v v5.0.3
gyp ERR! not ok
解决方法:
在npm install的时候,同时使用sudo
和--unsafe-perm
sudo npm install --unsafe-perm
$ sudo npm install --unsafe-perm
Password:
> fsevents@1.2.9 install /Users/si.ma/git/madaimeng_backup/node_modules/hexo-fs/node_modules/fsevents
> node install
node-pre-gyp WARN Using needle for node-pre-gyp https download
[fsevents] Success: "/Users/si.ma/git/madaimeng_backup/node_modules/hexo-fs/node_modules/fsevents/lib/binding/Release/node-v64-darwin-x64/fse.node" is installed via remote
> fsevents@1.2.9 install /Users/si.ma/git/madaimeng_backup/node_modules/nunjucks/node_modules/fsevents
> node install
node-pre-gyp WARN Using needle for node-pre-gyp https download
[fsevents] Success: "/Users/si.ma/git/madaimeng_backup/node_modules/nunjucks/node_modules/fsevents/lib/binding/Release/node-v64-darwin-x64/fse.node" is installed via remote
added 138 packages from 35 contributors and audited 7136 packages in 7.598s
found 6 vulnerabilities (2 low, 3 moderate, 1 high)
run `npm audit fix` to fix them, or `npm audit` for details
sudo npm install 时,报错 permission denied 的解决方案
https://newsn.net/say/sudo-npm-install-permission.html
npm list查看已安装模块
npm list --depth=0
查看本地安装包–depth
表示深度,我们使用的模块会有依赖,深度为零的时候,不会显示依赖模块
npm list --depth --global
查看全局安装包
npm update 更新模块
npm update <Module Name>
它会先到远程仓库查询最新版本,然后查询本地版本。如果本地版本不存在,或者远程版本较新,就会安装。
使用npm update <package>
可以把当前目录下node_modules子目录里边的对应模块更新至最新版本。
使用npm update <package> -g
可以把全局安装的对应命令行程序更新至最新版。
npm uninstall 删除模块
删除全局模块npm uninstall -g <package>
删除本地模块npm uninstall 模块
删除本地模块时你应该思考的问题:是否将在 package.json
上的相应依赖信息也消除?npm uninstall 模块
:删除模块,但不删除模块留在package.json中的对应信息npm uninstall 模块 --save
删除模块,同时删除模块留在package.json中dependencies下的对应信息npm uninstall 模块 --save-dev
删除模块,同时删除模块留在package.json中devDependencies下的对应信息
例如
sudo npm uninstall hexo-generator-search --save
Password:
removed 1 package and audited 7132 packages in 4.202s
found 6 vulnerabilities (3 low, 2 moderate, 1 high)
run `npm audit fix` to fix them, or `npm audit` for details
npm search 搜索模块
npm search <Module Name>
package.json
package.json 中最重要的属性是 name 和 version 两个属性,这两个属性是必须要有的,否则模块就无法被安装,这两个属性一起形成了一个 npm 模块的唯一标识符。
dependencies
dependencies 属性是一个对象,配置模块依赖的模块列表,key是模块名称,value是版本范围,版本范围是一个字符,可以被一个或多个空格分割。
dependencies 也可以被指定为一个 git 地址或者一个压缩包地址。
不要把测试工具或 transpilers 写到 dependencies 中。
下面是一些写法,详见 https://docs.npmjs.com/misc/semver
version 精确匹配版本
>version 必须大于某个版本
>=version 大于等于
<version 小于
<=versionversion 小于
~version "约等于",具体规则详见semver文档
^version "兼容版本"具体规则详见semver文档
1.2.x 仅一点二点几的版本
http://... 见下面url作为denpendencies的说明
任何版本
"" 空字符,和*相同
version1 - version2 相当于 >=version1 <=version2.
range1 || range2 范围1和范围2满足任意一个都行
git... 见下面git url作为denpendencies的说明
user/repo See 见下面GitHub仓库的说明
tag 发布的一个特殊的标签,见npm-tag的文档 https://docs.npmjs.com/getting-started/using-tags
path/path/path 见下面本地模块的说明
下面的写法都是可以的:
{
"dependencies" : {
"foo" : "1.0.0 - 2.9999.9999",
"bar" : ">=1.0.2 <2.1.2",
"baz" : ">1.0.2 <=2.3.4",
"boo" : "2.0.1",
"qux" : "<1.0.0 || >=2.3.1 <2.4.5 || >=2.5.2 <3.0.0",
"asd" : "http://asdf.com/asdf.tar.gz",
"til" : "~1.2",
"elf" : "~1.2.3",
"two" : "2.x",
"thr" : "3.3.x",
"lat" : "latest",
"dyl" : "file:../dyl"
}
}
npm-check-updates
npm-check-updates
https://www.npmjs.com/package/npm-check-updates
npm-check-updates(NCU) 更新 package.json 中的依赖到最新版本,忽略指定的版本号。
安装npm-check-updates
npm install -g npm-check-updates
ncu 检测版本更新
进入 package.json 所在目录,执行 ncu
检查 package.json 中依赖的可用版本更新
这里以 hexo 为例:
# ncu
Checking /home/centos/git/hexo/package.json
[====================] 12/12 100%
hexo ^3.9.0 → ^5.4.0
hexo-deployer-git ^0.1.0 → ^3.0.0
hexo-generator-archive ^0.1.4 → ^1.0.0
hexo-generator-category ^0.1.3 → ^1.0.0
hexo-generator-index ^0.2.0 → ^2.0.0
hexo-generator-tag ^0.2.0 → ^1.0.0
hexo-renderer-ejs ^0.2.0 → ^1.0.0
hexo-renderer-marked ^1.0.1 → ^4.0.0
hexo-renderer-stylus ^0.3.1 → ^2.0.1
hexo-server ^0.2.0 → ^2.0.0
hexo-tag-bootstrap 0.0.8 → 0.2.1
hexo-wordcount ^2.0.1 → ^6.0.1
Run ncu -u to upgrade package.json
ncu -u 更新package.json
进入 package.json 所在目录,执行 ncu -u
可以更新 package.json 中的依赖版本到最新。
之后再执行 npm install
根据 package.json 中的版本号更新依赖包。
注意:ncu -u
只是更新 package.json 文件中的版本号,并不是真的安装依赖包的新版本,之后还需执行 npm install
来安装更新。
ncu -g 检查全局包更新
npm does not support Node.js v8.17.0
npm WARN npm npm does not support Node.js v8.17.0
npm WARN npm You should probably upgrade to a newer version of node as we
npm WARN npm can't make any promises that npm will work with this version.
npm WARN npm You can find the latest version at https://nodejs.org/
查看 node 和 npm 版本号
# node -v
v12.14.0
# npm -v
6.13.4
原因:
node 版本太新,npm版本太旧,不支持新版node
解决:
更新 npm 版本
切换到 root 用户:
# npm install -g npm
# npm -v
7.20.0
上一篇 Java-RMI
页面信息
location:
protocol
: host
: hostname
: origin
: pathname
: href
: document:
referrer
: navigator:
platform
: userAgent
: