目录
一、模块化的概念
1.1 什么是模块化
模块化是指解决一个复杂问题时,自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说,模块是可组合、分解和更换的单元
1.2 模块化规范
模块化规范就是对代码进行模块化的拆分和组合时,需要遵守的那些规则
好处:大家都遵守同样的规范,极大方便了各个模块之间的相互调用
二、Node.js 中模块的分类
2.1 Node.js中模块的分类
1、内置模块(内置模块是由Node.js官方提供的,例如fs、path、http等)
2、自定义模块(用户创建的每个.js文件)
3、第三方模块(由第三方开发出来的模块,并非官方提供的内置模块,也不是用户自定义模块,使用前需要下载)
2.2 加载模块
使用require()方法,加载内置模块,自定义模块,第三方模块
加载自定义模块期间,可以省略.js后缀名
2.3 Node.js中的模块作用域
1、什么是模块作用域
在自定义模块中定义的变量、方法等成员,只能在当前模块内被访问,这种模块级别的访问,就叫做模块作用域
2、好处
防止全局变量污染的问题
2.4 向外共享模块作用域里的成员
1、module对象
在每个.js自定义模块中都有一个module对象,它里面存储了和当前模块有关的信息,打印如下:
2、module.exports对象
在自定义模块中,可以使用module.exports对象,将模块中的成员共享出去,供外界使用
3、向外共享成员时的注意点
使用require()方法导入模块时,导入的结果永远以module.exports指向的对象为准
4、exports对象
默认情况下,exports和module.exports指向的是同一个对象,但最终结果还是以module.exports为准
5、使用误区
2.5 Node.js中的模块化规范
Node.js遵循了CommonJS模块化规范,CommonJS规定了模块的特性和各模块之间如何相互依赖
三、npm与包
3.1 包
1、什么是包
Node.js中的第三方模块又叫做包
2、包的来源
第三方个人或团队开发出来,免费使用的
3、为什么需要包
包是基于内置模块封装出来的,提供了更高级、更方便的API,极大地提高了开发效率
4、从哪里下载包
从http://www.npmjs.com/网站上搜索自己所需要的包
https://registry.npmjs.org/下载需要的包
3.2 包管理配置文件
在项目根目录中,有一个叫做package.json的包管理配置文件,用来记录与项目有关的一些配置信息
1、如何记录在项目中安装了哪些包
在项目根目录中,创建一个叫做package.json的配置文件,即可用来记录项目中安装了那些包。
一定要把node_modules文件夹,添加到.gitignore忽略文件中。
2、安装包
npm i 要安装的包名
3、一次性安装所有的包
npm install
安装dependencies里面所有的依赖包
4、devDependencies节点
如果某些包只在项目开发阶段会用到,在项目上线之后不会用到,则建议把这些包记录在devDependencies节点中。如果某些包在开发和项目上线之后都会用到,则建议把这些包记录到dependencies节点中。
3.3 解决下包速度慢的问题
1、淘宝NPM服务器
2、切换npm的下包镜像源
在cmd中执行
3、nrm
这个工具帮助快速查看和切换下包的镜像源
3.4 包的分类
1、项目包
被安装到项目的node_modules目录中的包,都是项目包
项目包分为:
开发依赖包:被记录到devDependencies节点中的包,只会在开发期间使用
核心依赖包:被记录到dependencies节点中的包,在开发期间和项目上线之后都会用到
2、全局包
在执行npm install命令时, 如果提供了-g 参数,则会把包安装为全局包
注意:
(1)只有工具性质的包 ,才有全局安装的必要性,因为它们提供了好用的终端命令
(2)判断某个包是否需要全局安装后才能使用,可以参考官方提供的使用说明即可
3、i5ting_toc
i5ting_toc是一个可以把md文档转为html页面的小工具,使用步骤如下
3.5 规范的包结构
一个规范的包,它的组成结构,必须符合以下三点要求:
(1)包必须以单独的目录而存在
(2)包的顶级目录下要必须包含package.json这个包管理配置文件
(3)package.json中必须包含name,version,main这三个属性,分别代表包的名字、版本号、包的入口
3.6 开发属于自己的包
1、需要实现的功能
(1)格式化日期
(2)转义HTML中的特殊字符
(3)还原HTML中的特殊字符
2、初始化包的基本结构
3、初始化package.json
4、在index.js中定义格式化时间的方法
5、在index.js中定义 转义HTML的方法
6、在index.js中定义还原HTML的方法
7、将不同的功能进行模块化的拆分
8、编写包的说明文档
编写README.md文档
3.8 发布包
1、注册npm账号
2、把包发布到npm上
3、删除发布的包
四、模块的加载机制
4.1 优先从缓存中加载
模块在第一次加载后会被缓存。这也意味着多次调用require()不会导致模块的代码被执行多次
注意:不论是内置模块、用户自定义模块、还是第三方模块,它们都会优先从缓存中加载,从而提高模块的加载效率。
4.2 内置模块的加载机制
内置模块的加载优先级是最高的
内置模块与其他模块同名,优先加载内置模块
4.3 自定义模块的加载机制
使用require()加载自定义模块时,必须指定以./或../开头的路径标识符,如果没有,则node会把它当做内置模块或第三方模块进行加载
4.4 第三方模块的加载机制
4.5 目录作为模块
当把目录作为模块标识符,传递给require()进行加载的时候,有三种加载方式:
五、初识Express
5.1 Express简介
1、什么是Express
Express是基于Node.js平台,快速、开放、极简的Web开发框架
与内置模块http相似,专门用来创建web服务器
本质:就是一个npm上的第三方包,提供了创建Web服务器的便捷方法
2、Express可以做什么
可以方便快速地创建Web网站的服务器或API接口的服务器
5.2 Express的基本使用
1、创建最基本的Web服务器
2、监听GET请求
3、监听POST请求
4、把内容响应给客户端
5、获取URL中携带的查询参数
6、获取URL的动态参数
5.3 托管静态资源
1、express.static()
可以非常方便地创建一个静态资源服务器
注意:Express在指定的静态目录中查找文件,并对外提供资源的访问路径。因此,存放静态文件的目录名不会出现在url里。
2、挂载路径前缀
5.4 nodemon
1、为什么要使用nodemon
在编写调试Node.js项目的时候,如果修改了项目的代码,则需要频繁的手动close,然后再重新启动,非常繁琐。
nodemon工具可以监听项目文件的变动,当代码被修改后,nodemon会自动帮我们重启项目
六、Express路由
6.1 路由的概念
路由就是映射关系
1、Express中的路由
路由指的是客户端的请求与服务器处理函数之间的映射关系
分为三部分组成:请求的类型、请求的URL地址、处理函数
2、Express中路由的例子
3、路由的匹配过程
6.2 路由的使用
1、最简单的用法
把路由挂载到app上,示例代码如下:
2、模块化路由
将路由抽离为单独的模块
3、创建路由模块
4、注册路由模块
注意:app.use()的作用就是来注册全局中间件
5、为路由模块添加前缀
七、Express中间件
7.1 中间件的概念
1、什么是中间件
中间件(Middleware),特指业务流程的中间处理环节。
2、Express中间件的调用流程
3、Express中间件的格式
本质上就是一个function处理函数,格式如下:
4、next函数的作用
next函数是实现多个中间件连续调用的关键,它表示把流转关系转交给下一个中间件或路由
7.2 Express中间件的基本使用
1、定义中间件函数
2、全局生效的中间件
客户端发起的任何请求,到达服务器之后都会触发的中间件,叫做全局生效的中间件
通过调用app.use(中间件函数),即可定义一个全局生效的中间件
3、定义全局中间件的简化形式
4、中间件的作用
多个中间件之间,共享同一份req和res。基于这样的特性,我们可以在上游的中间件中,统一为req和res对象添加自定义的属性或方法,供下游的中间件或路由使用。
5、局部生效的中间件
6、定义多个局部中间件
7、中间件的五个使用注意事项
7.3 中间件的分类
1、应用级别的中间件
2、路由级别的中间件
绑定到Express.Router()实例上的中间件,叫做路由级别的中间件。
3、错误级别的中间件
作用:专门用来捕获1整个项目中发生的异常错误, 从而防止项目异常崩溃的问题
必须在路由之后
4、Express内置的中间件
(1)express.static:快速托管静态资源的内置中间件(无兼容性)。
(2)express.json:解析JSON格式的请求体数据(有兼容性,仅在4.16.0+版本中使用)
(3)express.urlencoded:解析URL-encoded格式的请求体数据(有兼容性)
5、第三方的中间件
由第三方开发出来的中间件
使用步骤:
Express内置的express.urlencoded就是基于body-parser进一步封装出来的
7.4 自定义中间件
1、需求描述与实现步骤
2、 定义中间件
3、监听req的data事件
4、监听req的end事件
5、使用querystring模块解析请求体数据
6、将解析出来的数据对象挂载为req.body
7、将自定义中间件封装为模块
八、使用Express写接口
8.1 创建基本的服务器
8.2 创建API路由模块
8.3 编写GET接口
8.4 编写POST接口
8.5 CORS跨域资源共享
1、接口的跨域问题
2、使用cors中间件解决跨域问题
3、什么是CORS
CORS(Cross-Origin Resource Sharing,跨域资源共享),由一系列HTTP响应头组成,这些HTTP响应头决定浏览器是否阻止前端js代码跨域获取资源
4、CORS的注意事项
5、CORS响应头部-Access-Control-Allow-Origin
响应头部中可以携带一个Access-Control-Allow-Origin字段,语法格式如下:
其中,origin参数的值指定了允许访问该资源的外域URL
*是通配符,表示允许来自任何域的请求
6、 CORS响应头部-Access-Control-Allow-Headers
默认情况下,CORs仅支持客户端向服务器发送如下的9个请求头:
如果客户端向服务器发送了额外的请求头信息, 则需要在服务器端,通过Access-Control-Allow-Headers对额外的请求头进行声明,否则这次请求会失败
7、 CORS响应头部-Access-Control-Allow-Methods
默认情况下,CORS仅支持客户端发起GET、POST、HEAD请求
如果要发起PUT、Delete等请求,则需要在服务器端通过Access-Control-Allow-Methods来指明实际请求所允许使用的HTTP方法
示例代码:
8、CORS请求的 分类
根据请求方式和请求头的不同,将CORS的请求分为两大类:
(1)简单请求
(2)预检请求
9、简单请求
(1)请求方式:GET、POST、HEAD三者之一
(2)HEAD头部信息不超过以下几种字段:
10、预检请求
在浏览器与服务器正式通信之前,浏览器会先发送OPTION请求进行预检,以获知服务器是否允许该实际请求 ,所以这一次的OPTION请求称为“预检请求”。服务器成功响应预检请求后,才会发送真正的请求,并且携带真实数据
11、简单请求和预检请求之间的区别
简单请求的特点:客户端与服务器之间只会发生一次请求
预检请求的特点:客户端与服务器之间会发生两次请求,OPTION预检请求成功之后,才会发起真正的请求
8.6 JSONP接口
1、JSONP的概念与特点
概念:浏览器通过<script>标签的src属性,请求服务器上的数据,同时,服务器返回一个函数的调用。这种请求数据的方式叫做JSONP
特点:
(1)JSONP不属于真正的ajax请求,因为它没有使用XMLHttpRequest这个对象
(2)JSONP仅支持GET请求,不支持POST、PUT、DELETE请求
2、创建JSONP接口的相关事项
如果项目中已经配置了CORS跨域资源共享,为了防止冲突,必须在配置CORS中间件之前声明JSONP的接口。否则JSONP接口会被处理成开启了CORS的接口
3、实现JSONP接口的步骤
4、实现JSONP接口的具体代码
5、在网页中使用jQuery发起JSONP请求