当前位置 : 首页 » 文章分类 :  开发  »  NPM使用笔记

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

下一篇 Hexo博客(05)写作定制与插件

阅读
评论
2.6k
阅读预计12分钟
创建日期 2016-04-18
修改日期 2021-07-18
类别
标签

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论