koa-generator 快速生成 koa2 服务的脚手架工具

557 阅读3分钟

脚手架顾名思义,就是会给我们搭建一个简易的项目框架,通常我们开发都会借助某某项目脚手架,快速创建一个开发项目,当然也可以自己从头搭建,相比较而言脚手架搭建会比较简洁易用。

1. 使用koa-generator生成koa2项目

1.全局安装脚手架工具

npm install -g koa-generator

#or 简写命令

npm i -g koa-generator

2.创建项目

      在项目根目录执行, koa2+项目名

koa2 servers-koa2

3.安装依赖

     成功创建项目后,进入项目目录,并执行`npm install`命令安装项目依赖包

#进入项目根目录
cd .\servers-koa2

#安装依赖
npm install

4.启动服务

npm run dev

5.默认的访问地址

http://localhost:3000

调试信息看上去不错

2. 目录结构

.
+-- bin
|   +-- www               // 项目启动必备文件,配置端口等服务信息
+-- node_modules          // 项目依赖,安装的所有模块都会在这个文件夹下
+-- public                // 存放静态文件,如样式、图片等
|   +-- images            // 图片
|   +-- javascript        // js文件
|   +-- stylesheets       // 样式文件
+-- routers               // 存放路由文件,如果前后端分离的话只用来书写api接口使用
|   +-- index.js
|   +-- user.js
+-- views                 // 存放存放模板文件,就是前端页面,如果后台只是提供api的话,这个就是备用
|   +-- error.pug
|   +-- index.pug
|   +-- layout.pug
+-- app.js                // 主入口文件
+-- package.json          // 存储项目名、描述、作者、依赖等等信息
+-- package-lock.json     // 存储项目依赖的版本信息,确保项目内的每个人安装的版本一致

3. 配置文件 /bin/www

    bin/www是应用的启动入口。

#!/usr/bin/env node/** * Module dependencies. */var app = require('../app');var debug = require('debug')('demo:server');var http = require('http');/** * Get port from environment and store in Express. */var port = normalizePort(process.env.PORT || '3000');// app.set('port', port);

/** * Create HTTP server. */

var server = http.createServer(app.callback());

/** * Listen on provided port, on all network interfaces. */

server.listen(port);server.on('error', onError);server.on('listening', onListening);

/** * Normalize a port into a number, string, or false. */function normalizePort(val) {  var port = parseInt(val, 10);  if (isNaN(port)) {    // named pipe    return val;  }  if (port >= 0) {    // port number    return port;  }  return false;}
/** * Event listener for HTTP server "error" event. */
function onError(error) {  if (error.syscall !== 'listen') {    throw error;  }  var bind = typeof port === 'string'    ? 'Pipe ' + port    : 'Port ' + port;  // handle specific listen errors with friendly messages  switch (error.code) {    case 'EACCES':      console.error(bind + ' requires elevated privileges');      process.exit(1);      break;    case 'EADDRINUSE':      console.error(bind + ' is already in use');      process.exit(1);      break;    default:      throw error;  }}
/** * Event listener for HTTP server "listening" event. */
function onListening() {  var addr = server.address();  var bind = typeof addr === 'string'    ? 'pipe ' + addr    : 'port ' + addr.port;  debug('Listening on ' + bind);}

4.app.js

const Koa = require('koa')
const app = new Koa()
const views = require('koa-views')
const json = require('koa-json')
const onerror = require('koa-onerror')
const bodyparser = require('koa-bodyparser')
const logger = require('koa-logger')
const index = require('./routes/index')
const users = require('./routes/users')
// error handler
onerror(app)
// middlewares
app.use(bodyparser({  enableTypes:['json', 'form', 'text']}))
app.use(json())
app.use(logger())
app.use(require('koa-static')(__dirname + '/public'))
app.use(views(__dirname + '/views', {  extension: 'pug'}))
// logger
app.use(async (ctx, next) => {
  const start = new Date()
  await next()
  const ms = new Date() - start
  console.log(`${ctx.method} ${ctx.url} - ${ms}ms`)
})
// routes
app.use(index.routes(), index.allowedMethods())
app.use(users.routes(), users.allowedMethods())
// error-handling
app.on('error', (err, ctx) => {
  console.error('server error', err, ctx)
});
module.exports = app

5.路由

路由本身也是一种中间件,不过我们由于职责拆分,将其独立到routes目录下。

const router = require('koa-router')()
router.get('/', async (ctx, next) => {
  await ctx.render('index', {
    title: 'Hello Koa 2!'
  })
})
router.get('/string', async (ctx, next) => {
  ctx.body = 'koa2 string'
})
router.get('/json', async (ctx, next) => {
  ctx.body = {
    title: 'koa2 json'
  }
})
module.exports = router

6.静态服务器

// app.js

app.use(require('koa-static')(__dirname + '/public'))

静态服务器主要存放一些静态资源,这里是通过koa-static中间件实现,它是基于koa-send模块的封装。