前言

任何一门语言都有对应的调试方法,也有对应的调试工具,JavaScript当然也不例外。最常用的莫过于浏览器这个调试工具了。而今天我们要讲的对于这个基础调试就不细说,我会将目前所有调试javascript(nodejs)的方法以及工具(主要是VS Code)介绍一下,然后顺便讲解一下webpack的sourcemap功能。

1 前置条件

  1. Chrome: 55+
  2. Nodejs: 6.3+

我当前使用的Nodejs(7.10)和Chome(Version 59.0.3071.104)

该文章配合了一个demo:

2 如何利用sourceMap来调试或者定位我们的错误

现代的网页越来越复杂,加上有babel这类的工具来对我们写的Js代码转译,然后有uglify这类工具进行压缩,最后我们看到的代码与原先的代码相差将会很大,单纯靠打印调试是效率极低的,于是这个时候sourceMap这个功能便应运而生。

在这里我们结合最火爆的打包工具webpack来说说如果利用webpack的sourcemap功能来调试以及定位错误的位置。

首先使用chrome调试带有sourcemap功能的js文件需要有下面的条件:

  1. chrome开启支持sourcemap的功能
  2. webpack配置devtool参数

开启chrome的sourcemap支持:

如果配置webpack但是没有开启支持,那么chrome的控制台将会是这样的:

如果开启支持但是没有对应的sourcemap文件:

满足以上两个条件就可以:

webpack的官网文档中提供了10中方法,那么这10种方法有哪些区别,我们要如何更好地利用这些参数去调试呢?下面我们一一通过图片来简单地过一遍。

2.1 eval

该方法官方文档标榜是效率最高的,它会使用eval执行每一个module,然后每个module后面都会跟着//@ sourceURL。如下图:

配置如图:

生成的文件如下图:

官网文档说该方法的最大缺点是不能准确地显示行号,但下面的报错图是我截取的,貌似行号是正确的显示的。不建议用于产品环境下。

2.2 eval-source-map

这个就是把evalsourceURL换成了完整souremap信息的DataUrl,刚开始第一次编译的时候是比较慢,但重新编译的时候速度会大大地变快。其对应的行号可以正确显示因为其是从原始代码来做映射的。对应的配置和报错图如下:

报错提示:

不建议用于产品环境下。

2.3 inline-source-map

为每一个文件添加sourcemapDataUrl,注意这里的文件是打包前的每一个文件而不是最后打包出来的,同时这个DataUrl是包含一个文件完整souremap信息的`Base64 格式化后的字符串,而不是一个url。对应的配置文件:

错误的定位情况以及生成的文件如下:

不建议用于产品环境下。

2.4 cheap-eval-source-map

类似于eval-source-map,但是取名为cheap是因为它没有列映射,只有行映射。对应的webpack配置如图:

其生成的文件如下:

报错的定位情况:

不建议用于产品环境下。

2.5 cheap-module-eval-source-map

类似于cheap-eval-source-map,但是官网称这个选项可以更好地处理映射。对应的配置如下:

错误的定位情况如下:

不建议用于产品环境下。

2.6 source-map

该选项会生成一个sourcemap文件,然后在bundle文件中添加一个引用声明,这样开发工具可以知道在哪里找到sourcemap文件,对应的配置如下:

生成的sourcemap文件大致如下:

错误定位情况如下:

2.7 hidden-source-map

source-map一样,但是不会添加引用声明到bundle文件中。如果你只想要让sourcemap从错误报告中映射错误堆栈追溯,但是不想暴露你的sourcemap文件给开发者工具的话,这种方式很适合你的。对应的配置如下:

错误定位情况:

2.8 cheap-source-map

类似于source-map,但是没有列映射。对应的配置如下:

错误定位情况:

bundle文件最后的注释如下:

2.9 cheap-module-source-map

此种方法也没有列映射,同时 loader 的 sourcemap 也被简化为只包含对应行的。最终的sourcemap只有一份,它是webpack对 loader生成的sourcemap进行简化,然后再次生成的。对应的配置如下:

错误定位情况:

2.10 nosources-source-map

该方法生成的sourcemap文件没有sourcesContent字段,如下:

配置如下:

错误定位情况:

3 前端代码debugger调试

如果我们在前端代码中指定的位置打断点,除了可以直接在控制台中直接打断点,还可以在你的代码中添加debugger关键词来打断点:

4 Nodejs的调试

Nodejs写多了,就免不了调试,而最低级的console打印貌似满足不了调试nodejs,于是我们就开始寻求新的调试方法,今天就给大家列举两种常用的调试工具。

首先我们需要开启Nodejs调试状态,只需要在启动的文件使用--inspect即可,如下图:

于是在终端会打印出下面的红框中的重要的一行话:

Debugger listening on port 5859.
[1] Warning: This is an experimental feature and could change at any time.
[1] To start debugging, open the following URL in Chrome:
[1] chrome-devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:5859/39515fe7-3f4a-40b2-8b95-6196a2d22d73

眼尖的童鞋肯定会发现为什么你的打印中出现了两次Debugger listening on port,那是因为我使用的Nodejs文件监控重启包是piping,而这个包的一个最大的特点便是:

使用默认的设置的时候,那么将会启动第二个实例,这个实例由第一个实例监控。Piping在第一个实例中故意人为的引发uncaughtException操作来避免继续执行其他代码,所以真正执行服务器代码的是在第二个实例,这也就是我们应该使用第二个打印的原因。

4.1 Chrome调试Nodejs

基于上面的介绍,我们将第二个实例打印的调试地址粘贴复制到Chome地址栏中,即可打开调试窗口,然后在你想要打断点的地方加上断点即可:

4.2 VSCODE调试Nodejs

除了使用chome,你还可以使用VSCode这个神器。使用VScode调试得配置一下:

使用如下的调试配置:

{
// Use IntelliSense to learn about possible Node.js debug attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Attach to Process",
"type": "node",
"protocol": "inspector",
"request": "attach",
"address": "localhost",
"port": 5859
}
]
}

其中端口的配置记得和之前打印的调试端口一致,这里都是5859。

然后启动你的Nodejs服务,接着按下F5,就可以进入调试状态,打上断点,同样可以查看本地变量/堆栈等等信息。如下图:

参考

  1. Devtool
  2. Node.js Debugging in VS Code
  3. Node Debug Architecture

我所知道的JS调试的更多相关文章

  1. vue—你必须知道的 js数据类型 前端学习 CSS 居中 事件委托和this 让js调试更简单—console AMD && CMD 模式识别课程笔记(一) web攻击 web安全之XSS JSONP && CORS css 定位 react小结

    vue—你必须知道的   目录 更多总结 猛戳这里 属性与方法 语法 计算属性 特殊属性 vue 样式绑定 vue事件处理器 表单控件绑定 父子组件通信 过渡效果 vue经验总结 javascript ...

  2. 2014第6周五JS调试

    今天才发现chrome调试前端尤其是JS真是很方便,难怪之前公司几个前端高手都用chrome的开发者工具来调试.把今天知道的chrome调试方法收集整理一下,在今后的开发调试中都可能会用到: Prof ...

  3. 灵活使用 console 让 js 调试更简单

    摘要: 玩转console. 原文:灵活使用 console 让 js 调试更简单 作者:前端小智 Fundebug经授权转载,版权归原作者所有. Web 开发最常用的就是 console.log , ...

  4. 我所知道的MVVM框架(转 司徒大大 )

    RubyLouvre commented on 6 Sep 2014   avalon http://avalonjs.github.io/ (使用Object.defineProperties. V ...

  5. 【转】天啦噜!原来Chrome自带的开发者工具还能这么用!(提升JS调试能力的10个技巧)

    天啦噜!原来Chrome自带的开发者工具还能这么用! (提升JS调试能力的10个技巧)   Chrome自带开发者工具.它的功能十分丰富,包括元素.网络.安全等等.今天我们主要介绍JavaScript ...

  6. [转]九个Console命令,让js调试更简单

    转自:九个Console命令,让js调试更简单 一.显示信息的命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <!DOCTYPE html> <html ...

  7. node.js调试

    用了几天node.js感觉很新奇,但是调试问题实在是愁煞人,开始的时候懒的学习调试方法,看看异常内容就可以了,但随着代码复杂程度的上升,并不是所有错误都是语法错误了,不调试搞不定了,只好搜搜资料,学习 ...

  8. 前端开发必须知道的JS(二) 闭包及应用

    http://www.cnblogs.com/ljchow/archive/2010/07/06/1768749.html 在前端开发必须知道的JS(一) 原型和继承一文中说过下面写篇闭包,加之最近越 ...

  9. 一探前端开发中的JS调试技巧

    前言 调试技巧,在任何一项技术研发中都可谓是必不可少的技能.掌握各种调试技巧,必定能在工作中起到事半功倍的效果.譬如,快速定位问题.降低故障概率.帮助分析逻辑错误等等.而在互联网前端开发越来越重要的今 ...

随机推荐

  1. alpha冲刺1/10

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:来自双十一的爱 团队部分 后敬甲(组长) 过去两天完成了哪些任务 文字描述 Alpha版本的任务细分安排 leangoo ...

  2. [转]基于国家标准的 EndNote 输出样式模板 ----直接用endnote导入到word,不用自己一个个改参考文献了

    EndNote 相当于一个数据库,将添加/导入的文献存档.需要引用文献的时候就从中选择一个插入到文档中,EndNote 会自动给你编号.在文档末尾建立相应的参考文献列表.但是各种杂志.单位要求的文献著 ...

  3. EF 数据版本号,处理具体使用方法 RowVersion / Timestamp 使用方法。进行自动处理并发修改

    /* * <div class="form-group"> // 原始 * <div class="form-group hidden"> ...

  4. 一起学Hive——创建内部表、外部表、分区表和分桶表及导入数据

    Hive本身并不存储数据,而是将数据存储在Hadoop的HDFS中,表名对应HDFS中的目录/文件.根据数据的不同存储方式,将Hive表分为外部表.内部表.分区表和分桶表四种数据模型.每种数据模型各有 ...

  5. 51Nod1553 周期串查询 字符串 哈希 线段树

    原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1553.html 题目传送门 - 51Nod1553 题意 有一个串只包含数字字符.串的长度为n,下标 ...

  6. Codeforces 264C Choosing Balls 动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF264C.html 题目传送门 - CF264C 题意 给定一个有 $n$ 个元素的序列,序列的每一个元素是个 ...

  7. HDU2853 Assignment KM

    原文链接http://www.cnblogs.com/zhouzhendong/p/8284105.html 题目传送门 - HDU2853 题意概括 (来自谷歌翻译) 题解 这是一道好题. 我们首先 ...

  8. .bat批处理添加Python任务

    一.常用命令含义 例一.多进程python 任务  --  start 命令 @echo offstart python C:\Users\ntitled\n\update_restt\test_ba ...

  9. C#中的 Stream

    目录: 什么是Stream? 什么是字节序列? Stream的构造函数 Stream的重要属性及方法 Stream的示例 Stream异步读写 Stream 和其子类的类图 本章总结 什么是Strea ...

  10. RabbitMQ实战经验分享

    前言 最近在忙一个高考项目,看着系统顺利完成了这次高考,终于可以松口气了.看到那些即将参加高考的学生,也想起当年高三的自己. 下面分享下RabbitMQ实战经验,希望对大家有所帮助: 一.生产消息 关 ...