koa

一个全新的web框架,致力于成为web应用和api开发领域中的一个更小、更富表现力、更健壮的基石

利用async函数丢弃回调函数,并增强错误处理。Koa没有任何预置的中间件,可快速愉快地编写服务端应用程序

核心概念

  • Koa application(应用程序)
  • Contex(上下文)
  • Request(请求),Response

一个最基础的koa应用

const Koa = require('koa');
const app = new Koa();
app.use(async(ctx)=>{
    ctx.body ='hello woo';
});

app.listen(3000);
console.log('app is starting in port 3000');

一个基础的中间件写法

const Koa = require('koa');
const app = new Koa()

const middleware = function async(ctx, next) {
    console.log('this is a middleware')
    console.log(ctx.request.path)
    next()
}

app.use(middleware)

app.listen(3000)

koa 开发restful接口

利用koa-router和koa-body进行开发

const Koa = require('koa');
const Router = require('koa-router')
const cors = require('@koa/cors')
const koaBody = require('koa-body')

const app = new Koa();
const router = new Router()

router.prefix('/api')

// 1. request, method, respond
// 2. api url => function, router
router.get('/', ctx => {
    console.log(ctx)
    ctx.body ='hello woo';
})

router.get('/api', ctx => {
    const params = ctx.request.query
    console.log(params)
    console.log(ctx)
    ctx.body ='hexwllo api';
})

router.post('/post', async (ctx) => {
    let {body} = ctx.request
    console.log(body)
    console.log(ctx.request)
    ctx.body = {
        ...body
    }
})

app.use(koaBody())
app.use(cors())

// 3. ctx, async
app.use(router.routes())
    .use(router.allowedMethods())

app.listen(3000);
console.log('app is starting in port 3000');

设计一个合理的开发目录结构

  • 按照功能模块进行区分
  • 路由压缩: koa-combile-routers
  • 静态资源: koa-static
  • 安全头: koa-helmet

koa热加载

  • 利用Nodemon包来实现热加载 安装nodemon之后,使用npx nodemon src/index.js即可
  • 使用es6语法启动koa 改写成es6之后,用npx babel nodemon src/index.js即可

koa配置优化

  • 利用koa-compose进行中间件的整合
    const middleware = compose([
      koaBody(),
      statics(path.join(__dirname,'../static')),
      cors(),
      jsonutil({pretty:false, param:'pretty'}),
      helmet()
    ])
    app.use(middleware)
    
  • 利用webpack-merge进行配置拆分
  • 利用terser-webpack-plugin进行代码压缩
  • 利用SplitChunksPlugin避免重复依赖

results matching ""

    No results matching ""