整理web渲染思路,與KOA做比較
1.開啓服務器並監聽端口,註冊監聽事件html
// 原生 let http = require('http') const server = http.createServer((req, res) => { // res.setHeader('Content-Type', 'text/html') // res.end('ok') }); server.listen(port)//port爲端口 // Koa 將監聽事件request移出構造,設計到中間件內 let Koa = require('koa') let app = new Koa () app.listen(port)
2.請求信息分析url模塊
1.路徑url.parse(req.url) 請求路徑的獲取以及請求類型的獲取(這裏被Koa處理幷包裝成一個request對象)webpack
// 原生 const server = http.createServer((req, res) => { let url = url.parse(req.url) let method = req.method }); // Koa 將信息封裝到request對象上,並能夠經過別名簡化訪問 app.use(async ctx => { let url = ctx.url let method = ctx.method })
2.參數接受querystring,以及POST方法參數獲取(監聽res的data事件,在end方法中獲取)(這裏設計成了一個koa-bodyparse中間件)web
//get // 原生 const server = http.createServer((req, res) => { let url = url.parse(req.url) let query = querystring(url.query) }); // Koa 將信息封裝到request對象上,並能夠經過別名簡化訪問 app.use(async ctx => { let query = ctx.query }) //post // 原生 const server = http.createServer((req, res) => { let content req.on('data', chunk => { content+=chunk }) req.on('end', () => { let query = querystring.parse(content) console.log(query) }) }); // Koa 將過程封裝到中間件去 let bodyParser = require('koa-bodyparser') app.use(boodyParser()) app.use(async ctx => { let postQuery = querystring.parse(ctx.request.body); })
3.靜態資源與動態資源(返回頭信息已經被Koa處理)
靜態資源 設定靜態資源路徑,對靜態資源路徑結合fs模塊返回(中間件)服務器
// 原生 //經過fs訪問靜態資源,須要手動設置內容類型以及狀態碼 function staticSend(filename, headers={'Content-Type': 'text/html;charset=utf-8'}, statusCode=200) { res.writeHead(statusCode, http.STATUS_CODES[statusCode], headers); content = fs.readFileSync(filename); res.end(content); } const server = http.createServer((req, res) => { let url = url.parse(req.url) staticSend(`${__dirname}/${url}`) }); // Koa 經過koa-static-cache中間件能夠設置靜態資源訪問規則,只需定義訪問路徑便可 const koaStaticCache = require('koa-static-cache') app.use( koaStaticCache( __dirname + '/static', { prefix: '/public', } ) )
動態資源 設定對應路徑的請求返回 路由處理
// 原生 // 根據訪問路徑case而後處理對應路徑返回結果 // Koa const Router = require('koa-router'); const router = new Router(); router.get('/list', async (ctx, next) => { ctx.body = await ctx.render('list.html', { users }); }) app.use( router.routes() );
Koa核心:這個框架有點思想和webpack相似,編寫文件->loader/plugins->最終文件,而Koa就是,請求->中間件->返回
它把請求與返回優雅地處理好了,咱們只須要關注中間部分邏輯,即中間件app