主题
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
命令即可
之所以命令行内可以直接运行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 <包名>
1.5. 为何可以直接在命令行内执行全局安装的包对应的命令?
例如:全局安装 npm i mime -g
(一个检测文件miniType的包)
每安装一个全局模块,都会在npm下生成一个快捷方式,上图可以看到,安装一个全局模块时候,在npm下会多一个模块 (我这里node和npm是通过nvm安装的,可能看上去不一样,但是思路没错) ,我们执行这个模块,就会链接到模块所在目录对应的可执行文件
所以,可以直接通过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
字段是规定require
或import
引入模块时入口人间是谁,没有mian
会默认找index.js
文件,bin
与main
之间没什么关系
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
可以看到,运行npm link
命令后,会在npm
下在多了一个gm
的快捷方式,会映射到npm
下面的node_modules
,接着npm
下面的node_modules
又映射到我们写这个依赖包真实的目录下,因此,最终我们在命令行执行gm
命令,找到的模块就是我们写的这个包的可执行文件。
2.5. 测试命令
2.6. 注意事项
(1)npm link的方式只能在本地使用。 (2)npm unlilnk可以解除映射关系 (3)npm link需要在包命令行下使用