npm使用问题汇总

概述

基本命令

安装最新版express
npm install express -g
安装指定版本express
npm install express@2.5.0
删除express
npm remove express -g
npm更新
npm i -g npm
空白目录下执行npm init生成package.json文件
npm init

npm卸载

即需要卸载Node JS。

Windows

步骤:

  1. 打开控制面板,卸载node
  2. where node,如果输出:信息: 用提供的模式无法找到文件说明环境变量已经清除
  3. 重启,为了卸载干净,可省略

修改node.js默认的npm安装目录

减轻C盘负担,先提前创建好目录:

npm config set prefix "D:\Program Files\nodejs\node_global"
npm config set cache "D:\Program Files\nodejs\node_cache"

验证:npm install -g express
确实安装到新的目录。

npm vs cnpm

npm config set registry https://registry.npm.taobao.org
npm install -g cnpm --registry=https://registry.npm.taobao.org

package.json

npm的package.json文件类似于,maven的pom.xml,pip的requirements.txt文件。文件样例:

{
  "name": "test",
  "version": "0.0.1",
  "description": "This is for study gulp project!",
  "homepage": "",
  "repository": {
    "type": "git",
    "url": "https://git.oschina.net/xxxx"
  },
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": {
    "name": "awesome",
    "email": "awesome_me@qq.com"
  },
  "license": "ISC",
  "devDependencies": {
    "gulp": "^3.8.11",
    "gulp-less": "^3.0.0"
  }
}

文件解读:
Node.js 在调用某个包时,会首先检查包中 package.json 文件的 main 字段,将其作为包的接口模块,如果 package.json 或 main 字段不存在,会尝试寻找 index.js 或 index.node 作为包的接口。
package.json 是 CommonJS 规定的用来描述包的文件,完全符合规范的 package.json 文件应该含有以下字段:

  • dependencies - 依赖包列表。如果依赖包没有安装,npm 会自动将依赖包安装在 node_module 目录下。
  • repository - 包代码存放的地方的类型,可以是 git 或 svn,git 可在 Github 上。
  • main - main 字段是一个模块ID,它是一个指向你程序的主要项目。就是说,如果你包的名字叫 express,然后用户安装它,然后require(“express”)。
  • keywords:关键字数组,通常用于搜索。
  • name:包的名称,必须是唯一的,由小写英文字母、数字和下划线组成,不能包含空格。

npm安装package.json时,直接到当前项目目录下用命令npm installnpm install --save-dev即可,自动将package.json中的模块安装到node-modules文件夹下。

Node JS各个目录的含义:

  • node_modules 文件夹下是各种模块,这里是express框架和jade模版引擎。
  • public 文件夹是各种静态文件;
  • routes 文件夹是各种action,routes是路径;
  • views 文件夹是各种模版。

版本格式

major.minor.patch
主版本号·次版本号·修补版本号
~version
大概匹配某个版本,如果minor版本号指定,那么minor版本号不变,而patch版本号任意;如果minor和patch版本号未指定,那么minor和patch版本号任意。
实例:
~1.1.2,表示>=1.1.2 <1.2.0,可以是1.1.2,…,1.1.n
~1.1,表示>=1.1.0 <1.2.0,可以是同上
~1,表示>=1.0.0 <2.0.0,可以是1.0.0,1.0.1,…,1.0.n,1.1.n,1.2.n,…,1.n.n

^version
兼容某个版本,版本号中最左边的非0数字的右侧可以任意;如果缺少某个版本号,则这个版本号的位置可以任意。
示例:
^1.1.2 ,表示>=1.1.2 <2.0.0,可以是1.1.2,1.1.3,…,1.1.n,1.2.n,…,1.n.n
^0.2.3 ,表示>=0.2.3 <0.3.0,可以是0.2.3,0.2.4,…,0.2.n
^0.0,表示 >=0.0.0 <0.1.0,可以是0.0.0,0.0.1,…,0.0.n

x-range
x的位置表示任意版本
1.2.x,表示可以1.2.0,1.2.1,…,1.2.n

*-range
任意版本,""也表示任意版本
如:*,表示>=0.0.0的任意版本

version1 - version2
大于等于version1,小于等于version2

range1 || range2
满足range1或者满足range2,可以多个范围
如:<1.0.0 || >=2.3.1 <2.4.5 || >=2.5.2 ❤️.0.0,表示满足这3个范围的版本都可以

"dependencies": {
	"bluebird": "^3.3.4",
	"body-parser": "~1.15.2"
}

当使用最新的Node运行npm instal --save xxx时,node会优先考虑使用插入符号(^)而不是波浪符号(~)
波浪符号~:会更新到当前minor version中最新的版本。放到我们的例子中就是:body-parser:~1.15.2,这个库会去匹配更新到1.15.x的最新版本,如果出了一个新的版本为1.16.0,则不会自动升级。波浪符号是曾经npm安装时候的默认符号,现在已经变为了插入符号。
插入符号^:把当前库的版本更新到当前major version(也就是第一位数字)中最新的版本。放到我们的例子中就是:bluebird:^3.3.4,这个库会去匹配3.x.x中最新的版本,但是他不会自动更新到4.0.0。
总结:
~1.15.2 := >=1.15.2 <1.16.0
^3.3.4 := >=3.3.4 <4.0.0

因为major version变化表示可能会影响之前版本的兼容性,所以无论是波浪符号还是插入符号都不会自动去修改major version,因为这可能导致程序crush,可能需要手动修改代码。

Error: EPERM: operation not permitted

显而易见,没有权限,一般这种问题出现在Windows系统,以管理员权限执行即可。

connect ETIMEDOUT. In most cases you are behind a proxy or have bad network settings.

环境:windows 10
node版本:v8.11.3
npm版本:5.6.0
以管理员角色执行命令:npm install -g mountebank@1.16.0,报错信息如下:

npm ERR! code ETIMEDOUT
npm ERR! errno ETIMEDOUT
npm ERR! network request to https://registry.npmjs.org/mountebank failed, reason: connect ETIMEDOUT 104.16.21.35:443
npm ERR! network This is a problem related to network connectivity.
npm ERR! network In most cases you are behind a proxy or have bad network settings.
npm ERR! network
npm ERR! network If you are behind a proxy, please make sure that the
npm ERR! network 'proxy' config is set properly.  See: 'npm help config'

npm ERR! A complete log of this run can be found in:
npm ERR!     D:\Users\awesome.wang\AppData\Roaming\npm-cache\_logs\2019-03-15T05_59_45_514Z-debug.log

解决方法:

# 清除缓存
npm config set proxy false
# 清除缓存
npm cache clean

其中执行第二条命令时,输出信息:

npm ERR! As of npm@5, the npm cache self-heals from corruption issues and data extracted from the cache is guaranteed to
 be valid. If you want to make sure everything is consistent, use 'npm cache verify' instead.
npm ERR!
npm ERR! If you're sure you want to delete the entire cache, rerun this command with --force.

npm ERR! A complete log of this run can be found in:
npm ERR!     D:\Users\awesome.wang\AppData\Roaming\npm-cache\_logs\2019-03-15T06_26_44_708Z-debug.log

忽视,执行命令: npm cache clean --force,再次执行安装命令成功;

npm ERR! code EINTEGRITY

报错信息如下:

npm ERR! code EINTEGRITY
npm ERR! sha512-364AI1l/M5TYcFH83JnOH/pSqgaNnKmYgKrm0didZMGKWjQB60dymwWy1rKUgL3J1ffdq9xVi2yGLHdSjjSNog== integrity checksum failed when using sha512: wanted sha512-364AI1l/M5TYcFH83JnOH/pSqgaNnKmYgKrm0didZMGKWjQB60dymwWy1rKUgL3J1ffdq9xVi2yGLHdSjjSNog== but got sha512-iWmhthtl+IsMNAJ9PO042EoelEEy/IB9mub9MMHrY5iCTrZ7G4AcdWPTmZff9QrFcW8EAGjwgukRJq3fXf+U4g==. (25383 bytes)

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\awesome\AppData\Roaming\npm-cache\_logs\2018-10-20T01_44_36_739Z-debug.log

解决方法:
1.如果有package-lock.json文件,就删掉
2.管理员权限进入cmd
3.执行npm cache clean --force
4.之后再npm install
有时候网不好也会出现问题,多试几次。

npm install: Verfication failed while extracting

参考
先删除package-lock.json文件,然后执行:npm install

删除node_modules文件夹

在使用npm时,有时需要删除node_modules文件夹,但是使用管理员权限并不能删除干净,及时退出各种应用程序,也不行;再说一个个程序退出也很麻烦。

npm install rimraf -g
rimraf node_modules

npm ERR! Windows_NT 6.1.7601

执行npm install apidoc -g报错:

npm ERR! Windows_NT 6.1.7601
npm ERR! argv "c:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "install" "apidoc" "-g"
npm ERR! node v6.11.3
npm ERR! npm  v3.10.10
npm ERR! code EPROTO
npm ERR! errno EPROTO
npm ERR! syscall write

npm ERR! write EPROTO 101057795:error:14077419:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert access denied:openssl\ssl\s23_clnt.c:772:
npm ERR!
npm ERR!
npm ERR! If you need help, you may report this error at:
npm ERR!     <https://github.com/npm/npm/issues>

npm ERR! Please include the following file with any support request:
npm ERR!     C:\Program Files\nodejs\npm-debug.log

还有其他一些莫名其妙,不明所以的信息。
解决方法:
npm cache clean --force
记住:重试,管理员权限,清除缓存,可以解决70%的npm使用问题。

Error: call config.load() before reading values

出现这个问题的背景:想要升级npm,当前版本号

npm -v
5.4.2

升级:

npm install npm -g
C:\Users\johnn\AppData\Roaming\npm\npx -> C:\Users\johnn\AppData\Roaming\npm\node_modules\npm\bin\npx-cli.js
C:\Users\johnn\AppData\Roaming\npm\npm -> C:\Users\johnn\AppData\Roaming\npm\node_modules\npm\bin\npm-cli.js
+ npm@7.5.4
added 195 packages, removed 352 packages and updated 58 packages in 58.633s
   │   Update available 5.3.0 → 7.5.4    │
   │     Run npm i -g npm to update      │

此时无论敲入npm i -g npm还是npm -v命令,都输出:

TypeError [ERR_INVALID_ARG_TYPE]: The "original" argument must be of type function
    at promisify (internal/util.js:206:11)
    at Object.<anonymous> (C:\Users\johnn\AppData\Roaming\npm\node_modules\npm\node_modules\@npmcli\move-file\index.js:26:18)
    at Module._compile (module.js:573:30)
    at Object.Module._extensions..js (module.js:584:10)
    at Module.load (module.js:507:32)
    at tryModuleLoad (module.js:470:12)
    at Function.Module._load (module.js:462:3)
    at Module.require (module.js:517:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (C:\Users\johnn\AppData\Roaming\npm\node_modules\npm\node_modules\cacache\lib\util\move-file.js:8:14)
C:\Users\johnn\AppData\Roaming\npm\node_modules\npm\node_modules\@npmcli\config\lib\index.js:163
      throw new Error('call config.load() before reading values')
      ^
Error: call config.load() before reading values
    at Config.get (C:\Users\johnn\AppData\Roaming\npm\node_modules\npm\node_modules\@npmcli\config\lib\index.js:163:13)
    at process.errorHandler (C:\Users\johnn\AppData\Roaming\npm\node_modules\npm\lib\utils\error-handler.js:171:32)
    at emitOne (events.js:115:13)
    at process.emit (events.js:210:7)
    at process._fatalException (bootstrap_node.js:349:26)

npm安装时间是2017.09.12,升级失败。
解决方案:卸载(往上看前文),重新安装。

Browserslist: caniuse-lite is outdated. Please run:npx browserslist@latest --update-db

应用启动失败,报错信息如下:

Browserslist: caniuse-lite is outdated. Please run:
npx browserslist@latest --update-db
Why you should do it regularly:
https://github.com/browserslist/browserslist#browsers-data-updating
Starting the development server...

解决方法,执行命令:npm update caniuse-lite,命令行输出:

up to date, audited 2250 packages in 13s
202 packages are looking for funding
  run `npm fund` for details
57 vulnerabilities (11 low, 8 moderate, 30 high, 8 critical)
To address issues that do not require attention, run:
  npm audit fix
To address all issues possible (including breaking changes), run:
  npm audit fix --force
Some issues need review, and may require choosing
a different dependency.
Run `npm audit` for details.

再执行命令:npm audit fix --force,注意,执行命令:npm audit fix,应用依旧启动失败。
在这里插入图片描述
以及其他启动失败报错信息:
AssertionError [ERR_ASSERTION]: chunk of umi not found.
解决方法:删除src下的.umi文件夹,执行npm start:no-mock解决前端应用启动问题

参考:

npm-wont-install-packages-npm-err-network-tunneling-socket-could-not-be-estab

posted @ 2019-03-15 14:34  johnny233  阅读(168)  评论(0编辑  收藏  举报  来源