使用 nrm 管理 Node.js 镜像源

274 阅读2分钟

nrm 介绍

nrm 是一个 npm 源管理器,可以快速地切换 npm 源。在使用 nrm 之前,我们通常使用命令的方式来设置 npm 源:

npm config set registry https://registry.npmmirror.com/

在某些公司,可能还会有自己的私有源,来回切换源挺麻烦的,所以我们可以考虑安装 nrm,使用 nrm 来管理 npm 的源。

nrm 使用

安装

全局安装:

npm i -g nrm

如果是 Mac 或者 Linux 系统可能会出现无目录权限的问题,修改对应的目录权限所属用户为当前用户即可:

sudo chown -R $USER /usr/local/lib/node_modules

查看所有可用源:

nrm ls
  npm ---------- https://registry.npmjs.org/
  yarn --------- https://registry.yarnpkg.com/
  tencent ------ https://mirrors.cloud.tencent.com/npm/
  cnpm --------- https://r.cnpmjs.org/
  taobao ------- https://registry.npmmirror.com/
  npmMirror ---- https://skimdb.npmjs.com/registry/

切换源

通过 nrm use <源名称>,则会配置为对应的 registry url。如使用 taobao 源:

nrm use taobao

添加和删除源

如果公司有自己的私有源,可以使用命令 nrm add <源名称> <源地址> 添加源,如:

nrm add demo http://192.168.0.100:8888/npm/demo/

使用 nrm ls 就可以看到刚才添加的源了。

使用命令 nrm del <源名称> 就可以删除源,如删除上一步添加的源:

nrm del demo

测试源响应速度

使用命令 nrm test <源名称> 可测试指定源的响应速度,如测试 taobao 源的速度:

nrm test npm

结果:

* taobao --- 264ms

nrm 还有其他的一些命令,这些常用的命令基本就够我们使用了,如果有特定的需求,可以去查阅官方文档。

异常处理

const open = require('open')

完整异常如下:

C:\Users\luwnto\AppData\Roaming\npm\node_modules\nrm\cli.js:9
const open = require('open');
             ^

Error [ERR_REQUIRE_ESM]: require() of ES Module C:\Users\luwnto\AppData\Roaming\npm\node_modules\nrm\node_modules\open\index.js from C:\Users\luwnto\AppData\Roaming\npm\node_modules\nrm\cli.js not supported.
Instead change the require of index.js in C:\Users\luwnto\AppData\Roaming\npm\node_modules\nrm\cli.js to a dynamic import() which is available in all CommonJS modules.
    at Object.<anonymous> (C:\Users\luwnto\AppData\Roaming\npm\node_modules\nrm\cli.js:9:14) {
  code: 'ERR_REQUIRE_ESM'
}

Node.js v18.16.0

编辑这个文件,找到这一行,注释掉即可:

  1 #!/usr/bin/env node
  2 
  3 const path = require('path');
  4 const fs = require('fs');
  5 const program = require('commander');
  6 const npm = require('npm');
  7 const ini = require('ini');
  8 const extend = require('extend');
  9 // const open = require('open');
 10 const async = require('async');