mock-server.js 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. const chokidar = require('chokidar') // 使用chokidar监听文件变化
  2. const bodyParser = require('body-parser') // 使用body-parser作为请求体解析中间件
  3. const chalk = require('chalk')
  4. const path = require('path')
  5. const mockDir = path.join(process.cwd(), 'mock')
  6. // 注册路由
  7. function registerRoutes(app) {
  8. let mockLastIndex
  9. const { default: mocks } = require('./index.js')
  10. for (const mock of mocks) {
  11. app[mock.type](mock.url, mock.response)
  12. mockLastIndex = app._router.stack.length
  13. }
  14. const mockRoutesLength = Object.keys(mocks).length
  15. return {
  16. mockRoutesLength: mockRoutesLength,
  17. mockStartIndex: mockLastIndex - mockRoutesLength
  18. }
  19. }
  20. // 清除路由缓存
  21. function unregisterRoutes() {
  22. Object.keys(require.cache).forEach(i => {
  23. if (i.includes(mockDir)) {
  24. delete require.cache[require.resolve(i)]
  25. }
  26. })
  27. }
  28. module.exports = app => {
  29. require('@babel/register') // es6 polyfill
  30. // parse app.body(https://expressjs.com/en/4x/api.html#req.body)
  31. app.use(bodyParser.json()) // 解析 application/json
  32. app.use(bodyParser.urlencoded({ // 解析 application/x-www-form-urlencoded
  33. extended: true
  34. }))
  35. const mockRoutes = registerRoutes(app)
  36. var mockRoutesLength = mockRoutes.mockRoutesLength
  37. var mockStartIndex = mockRoutes.mockStartIndex
  38. // 通过chokidar来观察mock文件夹内容的变化,在发生变化时会清除之前注册的mock-api接口,重新动态挂载新的接口,从而支持热更新
  39. chokidar.watch(mockDir, {
  40. ignored: /mock-server/,
  41. ignoreInitial: true
  42. }).on('all', (event, path) => {
  43. if (event === 'change' || event === 'add') {
  44. try {
  45. app._router.stack.splice(mockStartIndex, mockRoutesLength) // 移除mock路由堆栈
  46. unregisterRoutes() // 清除路由缓存
  47. const mockRoutes = registerRoutes(app)
  48. mockRoutesLength = mockRoutes.mockRoutesLength
  49. mockStartIndex = mockRoutes.mockStartIndex
  50. console.log(chalk.magentaBright(`\n > Mock Server 热重载成功! changed ${path}`))
  51. } catch (error) {
  52. console.log(chalk.redBright(error))
  53. }
  54. }
  55. })
  56. }