模块的加载机制
**模块在第一次加载后会被缓存。**多次调用同一个模块,并不会重复执行模块的代码。因此,不论是第三方,自定义还是内置模块,都优先从缓存中读取。
内置模块
由node.js官方提供,加载的优先级最高。比如:require('fs')
自定义模块
require加载自定义模块时,必须指定以./或者../开头的路径标识符,如果没有./或../这样的路径标识符,则node会默认为加载的是内置模块或者第三方模块。
同时,在使用require导入自定义模块时,若省略了文件扩展名,node.js会按照以下顺序分别尝试加载相应的文件。
1、按照确切的文件名加载;
2、若1加载失败,则补全.js扩展名进行加载;
3、若2加载失败,则补全.json扩展名进行加载;
4、若3加载失败,则补全.node扩展名进行加载;
5、若4加载失败,则终端报错,加载失败。
第三方模块
如果传递给require的模块标识符不是内置模块,也没有以./或者../开头,则node.js会从当前模块的父目录开始,尝试从/node_modules文件夹中加载第三方模块。如果没找到对应 的第三方模块,则移动到再上一级的父目录中,进行加载,一直到文件系统的根目录。如下:
目录作为模块
目录作为标识符传递给require进行加载时,有以下三种加载方式
- 在被加载的目录下寻找package.json文件,以package.json的main属性值,作为reqiure加载的入口;
- 若package.json不存在,或者package.json中的main入口不存在或者main入口无法解析,则node.js会尝试加载目录下的index.js作为入口文件;
- 若 上面两步都失败,则终端报错。
express
express简介
express是基于node.js平台,快速、开放、极简的web开发框架。
通俗的理解,express和node.js中内置的http模块类似,是专门用来创建web服务器的。
express本质是一个npm的第三方包。
express官网:Express - 基于 Node.js 平台的 web 应用开发框架 - Express中文文档 | Express中文网

express是基于node.js的http模块封装出来的。

express基本用法
安装
在项目所属根目录运行终端命令
npm i express@4.17.1
创建基本的服务器
javascript
// 1.导入express
const express=require('express')
// 2.创建web服务器
const app=express()
// 3.调用app.listen(端口号,启动成功后的回调函数),启动服务器
app.listen(80,()=>{
console.log('express running at 127.0.0.1')
})
监听get请求

javascript
// 1.导入express
const express=require('express')
// 2.创建web服务器
const app=express()
// 3.调用app.listen(端口号,启动成功后的回调函数),启动服务器
app.listen(80,()=>{
console.log('express running at 127.0.0.1')
})
app.get('/user',(req,res)=>{
res.send({name:'jack',sex:'nan'})
})
监听post请求

javascript
// 1.导入express
const express=require('express')
// 2.创建web服务器
const app=express()
// 3.调用app.listen(端口号,启动成功后的回调函数),启动服务器
app.listen(80,()=>{
console.log('express running at 127.0.0.1')
})
app.post('/user',(req,res)=>{
res.send('请求成功')
})
把内容响应给客户端:res.send
获取url中携带的查询参数:req.query
默认情况下req.query是一个空对象
javascript
app.get('/user',(req,res)=>{
console.log(`output->req`,req.query)
res.send({name:'jack',sex:'nan'})
})
比如我们请求的接口是http://127.0.0.1/user?id=1
上面的就打印的是 out->req {id:1}
获取url上的动态参数:req.params
req.params默认是一个空对象,里面存放着 通过**:**动态匹配到的参数值
javascript
app.post('/level/:id',(req,res)=>{
console.log(`output->req.params`,req.params)
res.send({level:1})
})
比如上面接口,我们请求http://127.0.0.1/level/123
上面打印的就是 output->req.params { id: '1' }
express 托管静态资源

代码如下:15_express_static.js
javascript
const express=require('express')
const app = express();
app.listen(80,()=>{
console.log('expres running at 127.0.0.1')
})
app.use(express.static('./clock'))
如上代码,当前js文件同级有一个clock文件夹

clock/index.html内容如下

现在在终端启动15_express_static.js,然后打开浏览器访问:http://127.0.0.1/index.html

访问http://127.0.0.1/index.css,http://127.0.0.1/index.js也会得到相应的内容
如果要托管多个静态资源目录,就多次调用express.static()函数即可;
访问静态资源时,会根据express.static托管顺序查找 对应的文件
挂载路径前缀

nodemon

安装
javascript
npm install -g nodemon
使用nodemon

