文章目录
CommonJS的包规范
CommonJS的包规范允许我们将一组相关的模块
组合到一起,形成一组完整的工具。
CommonJS的包规范由包结构
和包描述
文件两个部分组成。
包结构——用于组织包中的各种文件
包描述文件——抽述包的相关信息,以供外部读取分析
包结构
包实际上就是一个压缩文件
,解压以后还原为目录。
符合规范的目录,应该包含如下文件∶
- package.json:描述文件(
必须有
)
包的说明书,介绍包的名字、作用、内容 - bin:可执行二进制文件(
一般情况下没有
) - lib:js代码
- doc:文档,功能性描述
- test:单元测试
只有package.json
是必须的,其他都可有可无。
包描述文件
包描述文件用于表达非代码
相关的信息,它是一个JSON格式的文件。
package.json ,位于包的根目录下,是包的重要组成部分。
package.json中的字段:
name、description、 version、keywords、maintainers、contributors、bugs、licenses、repositories、dependencies、homepage、os、cpu、engine、builtin、directories、implements、scripts、author、bin、main、devDependencies。
eg:
packsge.json:
{
"name":"01.node",
"version": "0.0.1"
}
注意:package.json
中不能有注释。
npm
当有很多包的时候我们需要对包进行管理,使用的就是npm工具。
npm的全称是nodePackageManager
,即node的包管理工具。
对于Node而言,npm帮助其完成了第三方模块(即:包)的发布、安装和依赖
等。借助npm,Node与第三方模块之间形成了很好的一个生态系统。
就是说npm可以将我们写的包发布到网络上,它来帮助我们管理包的发布和下载。我们最常用的功能也是通过npm将包下载下来。
npm的安装
下载node会自动安装npm
npm的命令
npm -v
:查看版本npm
:帮助说明npm search 包名
:搜索模块包
eg:npm init
:初始化文件夹,会初始化创建package.json
package.json:
{
"name": "text",
"version": "1.0.0",
"description": "this is a text",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
npm install 包名
:在当前目录安装包
install
可以简写成i
eg:
下载后的文件:
需要注意的是下载的时候要确保文件夹中有package.json文件,使npm将下载的的包添加到package.json中的依赖中去。如果文件夹中没有package.json就会向上一级文件夹中寻找package.json文件,直到找到就会在该问价夹中进行包的下载。如果找到根目录依然没有package.json文件就会在当前文件夹创建package.json文件进行下载。
这里的package-lock.json文件,是指确定下载包的版本。意思是你的版本可以更新,但是别人进行依赖的时候还是以用package-lock.json文件中指定的版本进行下载,这样就可以避免自己更新对别人的依赖产生影响。
-
npm install 包名 -g
:全局模式安装包
全局安装的包一般都是一些工具,在计算机中用的,而不是项目中。 -
npm install 包名 --save
:将安装包并添加到依赖中
(现在进行了更新,不添加--save
也会自动添加到依赖中)
优点是在上传文件的时候不需要将包也上传,当我们将项目从网上拽下来的时候,只需要执行npm install
命令,就可以通过依赖可以自动下载。 -
npm install 包名 --save-dev
:表示下载的依赖包是在开发的时候使用的,标记作用 -
npm install
下载当前项目所依赖的包
npm install会根据package.json文件中的内容将依赖的包进行下载。
所以在导入别人的项目的时候,运行前先执行该命令下载相应的依赖包。 -
npm uninstall 包名
删除包 -
npm remove 包名
删除包
remove 可以简写成r
-
npm list
列举当前目录下的安装包 -
npm info 包名
查看包的详细信息 -
npm info 包名 version
获取包的最新版本 -
npm install 包名@版本号
安装指定版本 -
npm outdated
检查当前文件夹的包是否已经过时
eg:一个文件夹下载了math、simple-statistics和md5三个包:
显示的都是命不是最最新的
Current:是当前下载完成的版本
wanted:是package.json中dependencies
所写的版本号
"dependencies": {
"math": "^0.0.3",
"md5": "^2.3.0",
"simple-statistics": "^3.0.0"
}
如果将package.json中dependencies
所写的版本号修改为2.3.0再次运行npm outdated
,出现如下结果:(不过我们一般不直接修改package.json文件)
补充: dependencies中版本号前面的符号代表的含义
^
表示如果直接npm install 将会安装确定第一位的最新的版本
即:"md5": "^2.1.0",
会安装[email protected]
,^
只确定是版本号的第一位是2,无论2.X.X写的是几都会选择2.X.X的最新版本~
表示如果直接npm install 将会安装确定前两位的最新的版本
即:"md5": "~2.1.0",
会安装[email protected]
,~
确定是版本号的前两位是2.1,最后一位取最新版本。*
表示如果直接npm install 将会安装包的最新版本- 版本前面没有符号就是下载指定的版本号。
全局安装与局部安装的区别
- 全局安装:
全局安装安装的包可以在任何一个node项目
中进行引用,即全局安装安装安装在计算机环境中。
那么它的package.json
文件就在计算机环境中,这样就会产生一个问题,我们传项目的时候不会吧项目外面的package.json
文件进行传递,这样别人引入我们的文件的时候就看不到全局下载的包,也就无法对在全局下载的包进行引用了。
所以我们一般不在全局安装包,除非是一些使用工具。 - 局部安装:
局部安装的包在执行安装命令的问价夹下可以使用,出了文件夹就不可以进行使用了。
在vscode中下载包并使用的过程
- 在想要引入包的文件夹下执行下载命令:
npm install math
(这里以math为例)
install
可以简写成i
下载完成之后就会生成相应的目录:
- 引入:
因为不是我们自己写的模块,是第三方模块,引入的时候直接写名字就行。
var math = require("math")
console.log(math)
console.log(math.add(100,200))
输出:
Object [Math] {
samesign: [Function (anonymous)],
copysign: [Function (anonymous)],
add: [Function (anonymous)],
sum: [Function (anonymous)],
mul: [Function (anonymous)],
prod: [Function (anonymous)],
factorial: [Function (anonymous)],
gcd: [Function (anonymous)],
lcm: [Function (anonymous)]
}
300
项目中的package.json
文件中也会加入相应的依赖:
npm搜索包的流程
通过npm下载的包都放到node_modules文件夹
中
我们通过npm下载的包,直接通过包名引入即可。
var math = require("math")
console.log(math.add(100,200))
输出:300
npm搜索包的顺序:
node在使用模块名字来引入模块时,它会首先在当前目录的node_modules
中寻找是否含有该模块;
如果有则直接使用,如果没有则去上一级目录的node_modules
中寻找;
如果有则直接使用,如果没有则再去上一级目录寻找,直到找到为止直到找到磁盘的根目录,如果依然没有,则报错。
node中的三种模块
当其他人使用我们的项目的时候只需要把我们自己写的模块给他就可以了。
镜像服务器
npm的问题:npm的结点在国外,下载的速度可能会比较慢。
所以我们希望有一个镜像服务器,镜像服务器即在中国建立一个服务器,它将国外服务器的内容都下载到中国的服务器上,这样我们就可以直接访问镜像服务器,速度会比较快。
手动切换npm镜像
我们可以手动切换镜像(这里以淘宝镜像为例)
将npm的下载源切换到淘宝镜像上:
npm config set registry https://registry.npm.taobao.org
nrm切换npm镜像
nrm
:可以切换 npm 连接的服务器
nrm可以免除手动切换镜像的麻烦,使用nrm命令帮助我们切换源服务器。
下载nrm
npm i -g nrm
nrm是一个工具,所以下载到全局上
- 查看版本:
C:\Users\86198>nrm -V
1.2.5
- 查看nrm所提供的的服务器、仓库
C:\Users\86198>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/
这6个就是nrm可以切换的服务器
- 获取npm前使用的源服务器
C:\Users\86198>npm config get registry
http://registry.npmjs.org/
- nrm切换到指定的服务器:
nrm use 服务器的名字
C:\Users\86198>nrm use taobao
Registry has been set to: https://registry.npmmirror.com/
cnpm
cnpm是一个和npm平级的命令,可以取代npm。与npm不同的是:cnpm直接把源服务器固定到了淘宝镜像服务器上,比npm命令更快。
cnpm
下载cnpm:
指定下载源为淘宝镜像
npm install -g cnpm --registry=https://registry.npm.taobao.org
cnpm是一个工具,所以下载到全局上。
cnmp的用法和nmp完全一样,就是将npm换成了cnpm。
yarn
yarn也是一个从npm仓库下载包的工具,可以完全取代npm
对比npm:
- 速度超快: Yarn缓存了每个下载过的包,所以再次使用时无需重复下载。
- 并行下载:Yarn可以并行下载以最大化资源利用率,因此安装速度更快。
- 超级安全:在执行代码之前,Yarn会通过算法校验每个安装包的完整性。
yarn下载
npm install -g yarn
yarn使用
- 初始化项目:
yarn init
生成一个package.json文件:
eg:
{
"name": "yarn",
"version": "1.0.0",
"main": "index.js",
"license": "MIT"
}
-
添加包:
yarn add 包名
指定版本:yarn add 包名@版本
指定开发依赖:yarn add 包名 --dev
-
升级依赖包
yarn upgrade [package]@[version]
-
移除依赖包
yarn remove [package]
-
安装项目的全部依赖
yarn install
导入别人的项目的时候使用