w3ctech

ThinkJS 2.2:支持断点调试 ES2015+ 项目

ThinkJS 是第一个全面支持使用 ES2015+ 特性开发的 Node.js 框架,使用 ES2015 里的 */yield 或者 ES2016 草案里的 async/await 可以很好的解决异步嵌套的问题,借助 Babel 编译,可以稳定运行在 Node.js 各个主流版本中。同时 ThinkJS 提供了自动编译和自动更新的机制,免去了文件修改后重启 Node.js 服务的麻烦。

使用 ES2015+ 特性来开发 Node.js 项目可以带来巨大的便利,但同时由于有些特性现在还不支持,需要借助 Babel 编译,运行的代码实际上是编译后的代码,这样给调试带来很大的麻烦。

ThinkJS 从 2.2.0 版本开始支持断点调试源代码,同时如果运行时出现报错,错误也是定位到源代码下。

断点调试

目前断点调试可以支持 node-inspector、WebStorm、VS Code 等编辑器或者调试工具,具体使用文档请见 https://thinkjs.org/doc/debug.html

错误定位到源代码

默认情况下,但代码运行报错后,错误信息是定位到编译后的文件。由于编译后的文件行号和列号和源代码有很大的不同,这样给问题定位带来了很大的麻烦(虽然 Babel 编译的时候支持 retainLines 参数,但这样编译后的代码可读性非常差)。

2.2.0 版本开始借助 SourceMap,可以精准的把错误信息定位到源代码下。如:

'use strict';

import Base from './base.js';

export default class extends Base {
  /**
   * index action
   * @return {Promise} []
   */
  indexAction(){
    this.xxx();
    //auto render template file index_index.html
    return this.display();
  }
}

我们在 indexAction 里调用了一个不存在的方法 xxx,那么此时的错误信息为:

[2016-03-30 11:56:43] [Error] TypeError: this.xxx is not a function
    at _class.indexAction (/Users/welefen/Develop/git/thinkjs/src/home/controller/index.js:11:10)
    at _class._callee$ (/Users/welefen/Develop/git/thinkjs/src/core/base.js:41:33)
    at tryCatch (/Users/welefen/Develop/git/thinkjs/node_modules/babel-runtime/regenerator/runtime.js:88:40)
    at GeneratorFunctionPrototype.invoke [as _invoke] (/Users/welefen/Develop/git/thinkjs/node_modules/babel-runtime/regenerator/runtime.js:341:22)
    at GeneratorFunctionPrototype.prototype.(anonymous function) [as next] (/Users/welefen/Develop/git/thinkjs/node_modules/babel-runtime/regenerator/runtime.js:121:21)
    at step (/Users/welefen/Develop/git/thinkjs/node_modules/babel-runtime/helpers/asyncToGenerator.js:17:30)
    at /Users/welefen/Develop/git/thinkjs/node_modules/babel-runtime/helpers/asyncToGenerator.js:35:7
    at Promise._execute (/Users/welefen/Develop/git/thinkjs/node_modules/bluebird/js/release/debuggability.js:180:9)
    at Promise._resolveFromExecutor (/Users/welefen/Develop/git/thinkjs/node_modules/bluebird/js/release/promise.js:460:18)
    at new Promise (/Users/welefen/Develop/git/thinkjs/node_modules/bluebird/js/release/promise.js:76:14)
    at _class.<anonymous> (/Users/welefen/Develop/git/thinkjs/node_modules/babel-runtime/helpers/asyncToGenerator.js:14:12)
    at _class.invoke (/Users/welefen/Develop/git/thinkjs/src/core/base.js:45:12)
    at _class.action (/Users/welefen/Develop/git/thinkjs/src/core/http_base.js:80:25)
    at _class.execAction (/Users/welefen/Develop/git/thinkjs/src/core/app.js:127:19)
    at _class.execController (/Users/welefen/Develop/git/thinkjs/src/core/app.js:109:19)
    at /Users/welefen/Develop/git/thinkjs/src/core/app.js:66:19

我们看到错误信息已经定位到 src/ 目录,并且行号和列号和源代码是对应的。这样就很方便排查问题。

相关资源

w3ctech微信

扫码关注w3ctech微信公众号

共收到1条回复