优先从缓存中加载
模块在第一次加载后会被缓存 这也意味着多次调用require()不会导致模块代码被执行多次。
注意:
不论是内置模块 用户自定义模块 还是第三方模块 它们都会优先从缓存中加载,从而提高模块的加载效率。
内置模块的加载机制
内置模块是由Nodejs官方提供的模块 内置模块的加载优先级最高。
例如 requier(“fs”)始终返回内置的fs模块 即使在node_modules目录下有名字相同的包页叫做fs
自定义模块的加载自定义模块
使用require()加载自定义模块时,必须指定以./或…/开头的路径标识符 在加载自定义模块时,如果没有指定的./或…/这样的路径标识符 则node会把它当作内置模块或第三方模块进行加载。
同时 在使用require()导入自定义模块时,如果省略了文件的扩展名,则node会按顺序分别尝试加载以下的文件:
1 按照确切的文件名进行加载
2 补全.js扩展名进行加载
3 补全.json扩展名进行加载
4 补全.node扩展名进行加载
5 加载失败 终端报错
第三方模块的加载机制
如果传递给require()的模块标识符不是一个内置模块 也没有以./或…/开头 则nodejs会从当前模块的父目录开始 尝试从/node_modules文件夹中加载第三方模块
如果没找到 则会移动到上层目录 进行加载 直到文件系统的根目录
目录作为模块
当把目录作为模块标识符,传递给require()进行加载的时候 会有三种加载方式
1 在被加载的目录下查找一个叫做package.json的文件 并寻找main属性 作为require()加载的入口
2 如果目录里没有package.json文件或者main入口不存在或无法解析 则nodejs将会试图加载目录下的index.js文件
3 如果以上两步都失败了,则nodejs会在终端打印错误消息,报告模块的缺少:Error:Cannot find module ‘xxx’
初始Express
express简介:
1 什么是Express
官方给出的概念:Express是基于Node.js平台,快速 开放 极简的Web开发框架。
通俗的理解:Express的作用和Node.js内置的http模块类似,是专门用来创建Web服务器的。
2 进一步理解Express
思考:不适用Express能否创建Web服务器?
答案:能,使用Node.js提供的原生http模块即可。
思考:有了http为什么还要有express?
答案:http模块用起来很复杂,开发效率低。express是基于内置的http模块进一步封装起来的,能够极大的提高开发效率。
3 Express能够做什么
对于前端来说,最常见的两种服务器,分别是:
web网站服务器:专门对外提供Web网页资源的服务器
API接口服务器:专门对外提供API接口的服务器
使用Express,我们可以方便 快速的创建Web网站的服务器或API接口的服务器。
Express的基本使用
1 安装
npm insall express@4.17.1
2 创建基本的Web服务器
//1 导入express
const express = require('express')
//2 创建web服务器
const app = express()
//3 调用 app.listen(端口号,启动成功的回调函数),启动服务器
app.listen(80,()=>{
console.log('express server running at http://127.0.0.1')
})
3 监听GET请求
通过app.get()方法,可以监听客户端的GET请求,具体的语法格式如下:
//参数1 客户端请求的url地址
//参数2 请求对应的处理函数
//req:请求对象(包含了与请求相关的属性与方法)
//res:响应对象(包含了与响应相关的属性与方法)
app.get('请求url',function(req,res)=>{
//处理函数
})
4 监听POST请求
通过app.post()方法,可以监听客户端的POST请求,具体的语法格式如下:
//参数1 客户端请求的url地址
//参数2 请求对应的处理函数
//req:请求对象(包含了与请求相关的属性与方法)
//res:响应对象(包含了与响应相关的属性与方法)
app.post('请求url',function(req,res)=>{
//处理函数
})
5 把内容响应给客户端
通过res.send()方法,可以把处理好的内容,发送给客户端:
app.get('/user',(req,res)=>{
//向客户端发送json对象
res.send({name:'25',age:'25',gender:'男'})
})
app.post('/user',(req,res)=>{
//向客户端发送文本内容
res.send('请求成功')
})
6 获取URL中所携带的查询参数
通过req.query对象,可以访问到客户端通过查询字符串的形式,发送到服务器的参数:
app.get('/',(req,res)=>{
//req.query默认是一个空对象
//客户端使用 ?name=zs&age=20这种查询字符串形式,发送到服务端的参数
//可以通过req.query对象访问到,例如:
//req.query.name req.query.age
console.log(req.query)
})
![在这里插入图片描述](https://img-blog.csdnimg.cn/bee7ffb9c8a14e3b8e2c8851b7766914.png
7 获取URL中的动态参数
通过req.params对象,可以访问到URL中,通过 : 匹配到的动态 :
注释:url中:后面的东西是动态参数
//URL地址中,可以通过 :参数名 的形式,匹配动态参数值
app.get('/user/:id', (req, res) => {
//req.params默认是一个空对象
//里面存放着通过:动态匹配到的参数值
console.log(req.params)
})
动态参数可以不止一个
//注意:这里的id是一个动态参数
app.get('/user/:id/:name', (req, res) => {
//req.params是动态匹配的url参数 默认值为空对象
console.log(req.params)
res.send(req.params)
})
express托管静态资源
1 express.static()
express提供了一个非常好的函数,叫做express.static(),通过它,我们可以非常方便的创建一个静态资源服务器,例如,通过如下代码就可以将public目录下的图片 css文件 js文件对外开放访问了:
app.use(express.static('public'))
现在 你就可以访问public目录中的所有文件了:
http://localhost:3000/images/bg.jpg
http://localhost:3000/css/style.css
http://localhost:3000/js/index.js
注意:
Express在指定的静态目录中查找文件,并对外提供资源的访问路径。因此,存放静态文件的目录名不会出现在URL中。
//创建服务器
const express = require("express")
const app = express()
//在这里调用express.static方法快速的对外提供静态资源
app.use(express.static("./demo1"))
//启动服务器
app.listen(500, () => {
console.log("服务启动在50端口")
})
2 托管多个静态资源
如果要托管多个静态资源目录,就可以多次调用express.static()
app.use(express.static('./public'))
app.use(express.static('./file'))
3 挂载路径前缀
如果希望在托管的静态资源访问路径之前,挂载路径前缀,则可以使用如下方式:
app.use('/public',express.static('public'))