利用vscode调试编译后的js代码详解


Posted in Javascript onMay 14, 2018

前言

在开发的过程中,几乎不可能一次性就能写出毫无破绽的程序,断点调试代码是一个普遍的需求。

vscode 是一个非常棒的编辑器,内置功能强大的调试能力。经过简单的设定,就可以对 js 文件进行调试。但有时我们想要调试的内容是经过编译的,当然我们可以直接调试编译后的代码。但经过编译压缩以后的代码,可读性很差,且也可能无法分模块查看了,有什么方法进行编译前的代码调试么?答案当然是肯定的。

下面话不多说了,来一起看看详细的介绍吧。

vscode 的常规调试

vscode 的调试界面在窗口最左边:

利用vscode调试编译后的js代码详解

最新版本的vscode,该选项默认隐藏了,需要自己打开。

首次打开调试界面时,当前没有任何调试配置,我们可以点击齿轮 icon 添加一个:

利用vscode调试编译后的js代码详解

选择 nodejs 后,会自动在当前工程目录下添加 .vscode/launch.json 文件,这个文件就是 vscode 调试配置文件。

一个简易的配置文件内容为:

{
 // 使用 IntelliSense 了解相关属性。 
 // 悬停以查看现有属性的描述。
 // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
 "version": "0.2.0",
 "configurations": [
 {
 "type": "node",
 "request": "launch",
 "name": "启动程序",
 "program": "${workspaceFolder}/index.js"
 }
 ]
}

上面这个配置所做的工作是启动当前目录下的 index.js 文件进行调试。

我们也可以设置每次摁 F5 时自动调试当前打开的文件,只需要修改 program:

{
 "program": "${file}"
}

调试编译后的文件

想要调试编译后的文件,需要对 launch.json 文件进行设置。

vscode 要想调试编译后的代码,他需要知道哪些代码是经过编译的,且需要知道编译后的代码与编译前代码的对应关系。

其实理论上 vscode 是可以把每个要执行的文件都认为是编译后的文件,进行源文件的查找?我猜是因为性能原因,我们需要自己指定哪些文件是编译后的文件。在 launch.json 中,使用outFiles属性来指定编译后的产出文件:

{
 "version": "0.2.0",
 "configurations": [
 {
 // 省略其他设置...
 "outFiles": [
 "${workspaceFolder}/lib/*.js",
 ]
 // ...
 }
 ]
}

虽然有些麻烦,但好在我们可以使用通配符。

现在有了编译后的文件,vscode 还需要知道源文件,以及编译后文件与源文件的对应关系,听着有没有很熟悉?这个过程就是通过 sourcemap 来进行实现的。

我们需要在编译 js 文件时生成相应的 .map 文件,并在产出 js 文件后面附加 .map 文件的地址:

//@ sourceMappingURL=./index.js.map

ok,现在 vscode 在执行 js 文件时,会从 outFile 中查找是否是编译后的代码,如果是,就通过 sourcemap 映射到源代码,方便我们进行调试。

自动执行编译

现在我们的开发流程变成了:修改源代码 -> 编译源代码 -> 调试。

为了方便,我们可以设置preLaunchTask属性,该属性的作用是每次调试前执行一个前置任务,我们可以把编译过程放在前置任务里。

首先我们需要来配置一个task,task的配置文件在 .vscode/tasks.json,可以打开 command palette (⇧⌘P (Windows, Linux Ctrl+Shift+P)) 选择“任务:配置任务”自动生成一个:

{
 // See https://go.microsoft.com/fwlink/?LinkId=733558
 // for the documentation about the tasks.json format
 "version": "2.0.0",
 "tasks": [
 {
 "label": "build",
 "type": "npm",
 "script": "build",
 "problemMatcher": []
 }
 ]
}

这里我们配置了npm run build作为前置任务,每次执行调试时都会先进行 build。

示例配置文件

{
 // 使用 IntelliSense 了解相关属性。 
 // 悬停以查看现有属性的描述。
 // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
 "version": "0.2.0",
 "configurations": [
 {
 "type": "node",
 "request": "launch",
 "name": "example",
 "program": "${workspaceFolder}/index.js",
 "preLaunchTask": "build",
 "cwd": "${workspaceFolder}",
 "outFiles": [
 "${workspaceFolder}/lib/*.js"
 ]
 }

相关文档

  • Debugging in Visual Studio Code
  • Tasks in Visual Studio Code

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
javascript游戏开发之《三国志曹操传》零部件开发(五)可移动地图的实现
Jan 23 Javascript
Jquery刷新页面背景图片随机变换的实现方法
Mar 15 Javascript
简单的代码实现jquery定时器
Jan 03 Javascript
使用javascript实现雪花飘落的效果
Jan 13 Javascript
javascript验证邮件地址和MX记录的方法
Jun 16 Javascript
jQuery实现动态添加、删除按钮及input输入框的方法
Apr 27 jQuery
angular.js指令中的controller、compile与link函数的不同之处
May 10 Javascript
JavaScript 中Date对象的格式化代码方法汇总
Sep 06 Javascript
利用Vue构造器创建Form组件的通用解决方法
Dec 03 Javascript
mpvue小程序循环动画开启暂停的实现方法
May 15 Javascript
微信小程序select下拉框实现效果
May 15 Javascript
vue 导出文件,携带请求头token操作
Sep 10 Javascript
vue的toast弹窗组件实例详解
May 14 #Javascript
Vue页面骨架屏注入方法
May 13 #Javascript
浅谈在node.js进入文件目录的问题
May 13 #Javascript
解决node修改后需频繁手动重启的问题
May 13 #Javascript
垃圾回收器的相关知识点总结
May 13 #Javascript
基于node搭建服务器,写接口,调接口,跨域的实例
May 13 #Javascript
深入理解js 中async 函数的含义和用法
May 13 #Javascript
You might like
WordPress分页伪静态加html后缀
2016/06/08 PHP
php 解决substr()截取中文字符乱码问题
2016/07/18 PHP
总结对比php中的多种序列化
2016/08/28 PHP
浅谈PHP实现大流量下抢购方案
2017/12/15 PHP
javascript实现多栏闭合展开式广告位菜单效果实例
2015/08/05 Javascript
JS判断是否长按某一键的方法
2016/03/02 Javascript
JavaScript的ExtJS框架中表格的编写教程
2016/05/21 Javascript
nodejs实例解析(输出hello world)
2017/01/03 NodeJs
JavaScript数组去重的6个方法
2017/01/21 Javascript
vuex的简单使用教程
2018/02/02 Javascript
使用Angular Cli如何创建Angular私有库详解
2019/01/30 Javascript
使用js在layui中实现上传图片压缩
2019/06/18 Javascript
Vue 实现v-for循环的时候更改 class的样式名称
2020/07/17 Javascript
[02:54]DOTA2英雄基础教程 撼地者
2014/01/14 DOTA
Python中使用中文的方法
2011/02/19 Python
利用Python开发实现简单的记事本
2016/11/15 Python
python requests.post带head和body的实例
2019/01/02 Python
举例讲解Python常用模块
2019/03/08 Python
Python+pyplot绘制带文本标注的柱状图方法
2019/07/08 Python
python实现复制大量文件功能
2019/08/31 Python
使用OpenCV-python3实现滑动条更新图像的Canny边缘检测功能
2019/12/12 Python
python中sympy库求常微分方程的用法
2020/04/28 Python
Python实现加密接口测试方法步骤详解
2020/06/05 Python
python 从list中随机取值的方法
2020/11/16 Python
用CSS3和table标签实现一个圆形轨迹的动画的示例代码
2019/01/17 HTML / CSS
Camper鞋西班牙官方网上商店:西班牙马略卡岛的鞋类品牌
2019/03/14 全球购物
绢花、人造花和人造花卉:BLOOM
2019/08/07 全球购物
如何删除一个表里面的重复行
2013/07/13 面试题
一些Unix笔试题和面试题
2013/01/22 面试题
拉歌口号大全
2014/06/13 职场文书
2015年党员岗位承诺书
2015/04/27 职场文书
大学感恩节活动总结
2015/05/05 职场文书
2015年团委副书记工作总结
2015/07/23 职场文书
JavaScript最完整的深浅拷贝实现方式详解
2022/02/28 Javascript
【海涛DOTA解说】EVE女子战队独家录像加ZSMJ神牛两连发
2022/04/01 DOTA
Win10加载疑难解答时出错发生意外错误的解决方法
2022/07/07 数码科技