UNPKG

1.64 kBJavaScriptView Raw
1/**
2 * @file server.js
3 * @author clark-t (clarktanglei@163.com)
4 */
5
6const Koa = require('koa')
7const Router = require('koa-router')
8const path = require('path')
9const script = require('./middleware/script')
10const html = require('./middleware/html')
11const cli = require('../cli')
12const koaStatic = require('koa-static')
13const directory = require('./middleware/directory')
14
15module.exports = class Server {
16 constructor (options) {
17 this.app = new Koa()
18 this.options = options
19
20 Object.keys(options).forEach(key => {
21 this[key] = options[key]
22 })
23
24 this.router = new Router()
25 }
26
27 async run () {
28 let record = async (ctx, next) => {
29 cli.info(`[request]: ${ctx.request.url}`)
30 await next()
31 }
32
33 let options = Object.assign({app: this.app}, this.options)
34 let [
35 scriptMiddlewares,
36 htmlMiddlewares,
37 dirMiddlewares
38 ] = await Promise.all([
39 script(options),
40 html(options),
41 directory(options)
42 ])
43
44 this.router
45 .get('/:id([^\\.]+\\.html)', ...htmlMiddlewares)
46 .get('/:id([^\\.]*)', ...dirMiddlewares)
47 .get(['/**/example/*.*', '/**/mock/*.*'], koaStatic(this.dir))
48 .get('*', ...scriptMiddlewares)
49
50 this.app
51 .use(record)
52 .use(this.router.routes())
53 .listen(this.port)
54
55 if (this.livereload) {
56 const lrserver = require('livereload').createServer({
57 extraExts: ['vue', 'less', 'styl', 'stylus'],
58 delay: 500
59 })
60
61 lrserver.watch([
62 path.resolve(this.dir, 'components'),
63 path.resolve(this.dir, 'common'),
64 path.resolve(this.dir, 'example')
65 ])
66 }
67 }
68}