搭建简单的服务器
| 1 | import http from "http" | 
优化服务器性能封装服务器的方法
| 1 | class ServerApp { | 
根据数据与模板动态生成页面
- 根据规则去解析链接,并且获取ID或者索引值 - 1 
 2- let index = req.pathObj.base 
 请求路径: localhost:3000/movices/1
- 根据索引获取数据 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11- let movices = [{ 
 name: '长空之王',
 desc: '试飞员的故事',
 author: '胡军、王一博',
 list: ['a','b','c']
 },{
 name: '热烈',
 desc: '由街舞引申的关于梦想和青春的故事',
 author: '王一博'
 }]
 let pageData = movices[index]
- 根据模板渲染页面 - 1 - res.render(movices[index], './template/index.html') 
- 底层需要实现渲染函数,通过正则匹配,找到需要修改的地方进行一一修改 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19- function render(options, path) { 
 fs.readFile(path,{encoding: "utf-8", flag: "r"},(err,data) => {
 // 这里使用箭头函数,使this指向调用的res
 if(err){
 console.log(err)
 }else {
 console.log(data)
 let reg = /\{\{(.*?)\}\}/igs
 let result;
 while(result = reg.exec(data)) {
 // 去除key两边的空白字符,并拿到key
 let strKey = result[1].trim()
 let strValue = options[strKey]
 data = data.replace(result[0],strValue)
 }
 this.end(data)
 }
 })
 }
列表的动态渲染
- 在html页面定义列表循环的标记 - 1 
 2
 3
 4
 5- <ul> 
 {%for {list} %}
 <li>{{item}}</li>
 {%endfor%}
 </ul>
- 正则匹配标记 - 1 - let listreg = /\{\%for \{(.*?)\} \%\}(.*?)\{\%endfor\%\}/igs - 从中匹配到两个组- 第一个组匹配出变量的key值
- 第二哥组匹配出需要生成的每一项的内容
 
 
- 从中匹配到两个组
- 匹配替换每一项的内容 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12- while(listResult = listreg.exec(data)) { 
 let list = listResult[1].trim()
 // 通过key值获取数据内容
 let listValue = options[list]
 let listStr = ''
 listValue.forEach((item,index) => {
 // 替换每一项内容的变量
 console.log(item)
 listStr = listStr + replaceVAr(listResult[2], {"item":item})
 })
 data = data.replace(listResult[0],listStr)
 }
- 通过eval函数,将字符串的表达式计算出来 - 1 - let strValue = eval('options.' + strKey) 
正则路由的设定
- 要求:可以根据自己设定的正则匹配路径来执行想应的函数来响应用户的内容
- 设定正则的匹配路径和响应的执行函数 - 1 
 2
 3- serverRqquest.on('^/$', (req, res) => { 
 res.end("<h1>首页</h1><img src='./abc/bg-1.jpg'>")
 })
- 获取正则路径创建正则对象 - 1 - let reg = new RegExp(regStr, 'igs') 
- 匹配路径,并调用相对应的函数 - 1 
 2
 3
 4
 5- if(reg.test(req.url)) { 
 this.reqEvent[key](req, res)
 resState = true
 break
 }
- 判断是否正则路径响应过,如果响应过,将不在响应,会报错 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10- if(!resState) { 
 if (pathObj.dir == this.staticPath){// 静态目录
 res.setHeader("Content-Type", this.getContentType(pathObj.ext))
 let rs = fs.createReadStream('./static/' + pathObj.base)
 rs.pipe(res)
 } else {
 res.setHeader("Content-Type", "text/html;charset=UTF-8")
 res.end('<h1>404页面找不到!</h1>')
 }
 }
 
             
             
             
    