脚手架顾名思义,就是会给我们搭建一个简易的项目框架,通常我们开发都会借助某某项目脚手架,快速创建一个开发项目,当然也可以自己从头搭建,相比较而言脚手架搭建会比较简洁易用。
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.默认的访问地址
调试信息看上去不错
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模块的封装。