1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 | const Koa = require('koa')
|
7 | const Router = require('koa-router')
|
8 | const path = require('path')
|
9 | const script = require('./middleware/script')
|
10 | const html = require('./middleware/html')
|
11 | const cli = require('../cli')
|
12 | const koaStatic = require('koa-static')
|
13 | const directory = require('./middleware/directory')
|
14 |
|
15 | module.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 | }
|