Skip to content

npm全局包详解

1. npm必备知识

1.1. npm安装的包,会放到什么位置?

npm i -g xxx全局安装,会安装到操纵系统的某个位置(电脑中的npm下),可以通过npm root -g来查看全局安装的包放到什么位置

全局安装 npm i xxx -g

全局安装的模块只能在命令行内使用全局安装的模块不能通过 require() 或者 import 来使用

bash
D:\Users\fendou>npm root -g
C:\Program Files\nodejs\node_modules

npm i xxx安装到当前项目,默认安装的是生产依赖dependencies

1.2. 如何在命令行中查看当前电脑中的环境变量?

一般查看环境变量都是从右键【此电脑】->属性->高级系统设置->环境变量来查看的

命令行查看只需要输入path命令即可

image.png

之所以命令行内可以直接运行npm node等命令,是因为电脑的环境变量里面都配的有对应的环境变量,当执行npmm命令时候,计算机会根据这个环境变量的地址到对应的位置下查找可执行文件,从而可以运行命令。

1.3. 切换npm镜像源加速

淘宝npm源将在2022年5月31日更换域名服务 淘宝为了提供更稳定、更安全、更符合国家法律法规要求的镜像服务(说人话就是怕国家找茬所以要低调),将要更换淘宝npm源的服务器,并> > 且老的域名npm.taobao.org 和 registry.npm.taobao.org 将不再使用。 2022年5月31日0时,这两个老域名将会停止服务,截至目前,通过老域名安装npm包已经会被301到新域名 https://registry.npmmirror.c> om/淘宝 NPM 镜像站切换新域名啦

bash
# 零时使用
npm i xxx --registry https://registry.npmmirror.com

# 将npm设置为淘宝镜像:
npm config set registry https://registry.npmmirror.com

# 将yarn设置为淘宝镜像
yarn config set registry https://registry.npmmirror.com

# 解决node-sass无法下载下来的问题
yarn config set sass_binary_site https://cdn.npmmirror.com/dist/node-sass

# 查看npm镜像设置:
npm config get registry

# 查看yarn镜像设置:
yarn config get registry

# 切换为官方源
npm config set registry http://www.npmjs.org

不推荐使用cnpm,因为在安装模块时,无法锁定版本,会出现很多问题

另外一种切换源可用nrm

bash
npm i nrm -g
nrm ls
nrm use xxx

1.4. npm查看某个包的版本号有哪些

bash
npm info <>

image.png

1.5. 为何可以直接在命令行内执行全局安装的包对应的命令?

例如:全局安装 npm i mime -g(一个检测文件miniType的包)

每安装一个全局模块,都会在npm下生成一个快捷方式,上图可以看到,安装一个全局模块时候,在npm下会多一个模块 (我这里node和npm是通过nvm安装的,可能看上去不一样,但是思路没错) ,我们执行这个模块,就会链接到模块所在目录对应的可执行文件 image.png

所以,可以直接通过mime命令来执行cli.js文件,而且也不用将其添加到path上,

小结:

  • 由于npm在环境变量中,所以npm能够直接访问,且npm下面有很多快捷方式(全局命令),这些命令也可以直接访问,安装全局模块时候,已经将这些命令与模块下可执行文件建立好了联系,所以执行全局命令的时候,就等于执行对应的可执行文件
  • 全局安装的模块只能在命令行使用。

2.本地实现一个全局使用的npm包

2.1. 初始化

软件包需要有一个package.json描述文件。

bash
npm init -y

2.2. 配置包的名称,执行命令,可执行文件位置

1)包名:name 作用:下载依赖时候或者引入依赖时候用的名称 2)可执行文件位置bin 作用:告诉命令行,执行命令时,要到那里去找可执行文件

注意:bin字段是规定命令行执行命令时找的是哪个文件,main字段是规定requireimport引入模块时入口人间是谁,没有mian会默认找index.js文件,binmain之间没什么关系

json
{
  "name": "global-module",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  // "bin":"./bin/www", 
  "bin":{
    "gm":"./bin/www"
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

方式一:"bin":"./bin/www", 命令行执行的命令依然是name字段的值,bin字段的值可以随意制定,但是一般可执行文件都放到bin目录下

方式二:

bash
"bin":{
    "gm":"./bin/www",
    "abc":"./bin/xxx"
  },

命令行执行命令已经被简化,直接执行gm即可,且可以有多个命令,其余同上;

2.3. 配置可执行文件www

一般我们的可执行文件都叫做www,可以有后缀名,也可以没有,且一般会放到bin目录下面、若没有后缀时,需要在文件内指定文件运行方式,否则系统不知道www文件是什么类型的文件,,也就无法执行。

具体为:在文件顶部加上#! /usr/bin/env node,这样命令行才知道这是一个用node执行的脚本。

含义是:告诉当前命令行,我们这个文件是用当前环境变量里面的node来执行的,无论是什么系统,都需要加上这代码,

sh
#! /usr/bin/env node

注意:更改运行方式后,需要重新运行 npm link才会生效,也可以 npm link --force强制执行

2.4. 命令映射

这一步的目的,就是让我们自己写的命令能够全局执行,类似于npm i -g xxx

方式一:将bao发布到npm上再下载全局安装(这里省略)

方式二:运行命令npm link

image.png

可以看到,运行npm link命令后,会在npm下在多了一个gm的快捷方式,会映射到npm下面的node_modules,接着npm下面的node_modules又映射到我们写这个依赖包真实的目录下,因此,最终我们在命令行执行gm命令,找到的模块就是我们写的这个包的可执行文件。

2.5. 测试命令

image.png

2.6. 注意事项

(1)npm link的方式只能在本地使用。 (2)npm unlilnk可以解除映射关系 (3)npm link需要在包命令行下使用