利用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 相关文章推荐
获取焦点时,利用js定时器设定时间执行动作
Apr 02 Javascript
Angular 4依赖注入学习教程之InjectToken的使用(八)
Jun 04 Javascript
Vue的百度地图插件尝试使用
Sep 06 Javascript
vue中mint-ui的使用方法
Apr 04 Javascript
从零开始用electron手撸一个截屏工具的示例代码
Oct 10 Javascript
解决axios post 后端无法接收数据的问题
Oct 29 Javascript
小程序实现录音上传功能
Nov 22 Javascript
基于vue和bootstrap实现简单留言板功能
May 30 Javascript
Openlayers学习之加载鹰眼控件
Sep 28 Javascript
vue任意关系组件通信与跨组件监听状态vue-communication
Oct 18 Javascript
关于JS中的作用域中的问题思考分享
Apr 06 Javascript
让JavaScript代码更加精简的方法技巧
Jun 01 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
PHP验证信用卡卡号是否正确函数
2015/05/27 PHP
PHP的Laravel框架中使用消息队列queue及异步队列的方法
2016/03/21 PHP
修改Laravel5.3中的路由文件与路径
2016/08/10 PHP
基于PHP实现的多元线性回归模拟曲线算法
2018/01/30 PHP
javascript 简练的几个函数
2009/08/29 Javascript
JavaScript运行机制之事件循环(Event Loop)详解
2014/10/10 Javascript
推荐10个2014年最佳的jQuery视频插件
2014/11/12 Javascript
轻松实现javascript数据双向绑定
2015/11/11 Javascript
angularjs自定义ng-model标签的属性
2016/01/21 Javascript
在JavaScript中对HTML进行反转义详解
2016/05/18 Javascript
JS实现的多张图片轮流播放幻灯片效果
2016/07/22 Javascript
JS实现移动端实时监听输入框变化的实例代码
2017/04/12 Javascript
Angular.JS中指令ng-if、ng-show/ng-hide和ng-switch的使用教程
2017/05/07 Javascript
vue实现word,pdf文件的导出功能
2018/07/31 Javascript
在Vue mounted方法中使用data变量详解
2019/11/05 Javascript
node.js使用 http-proxy 创建代理服务器操作示例
2020/02/10 Javascript
JS正则表达式验证密码强度
2020/03/18 Javascript
python快速排序代码实例
2013/11/21 Python
Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
2016/06/14 Python
Python操作SQLite数据库的方法详解
2017/06/16 Python
浅谈Matplotlib简介和pyplot的简单使用——文本标注和箭头
2018/01/09 Python
python实现简单神经网络算法
2018/03/10 Python
pandas去除重复列的实现方法
2019/01/29 Python
Python实现剪刀石头布小游戏(与电脑对战)
2019/12/31 Python
Python  Asyncio模块实现的生产消费者模型的方法
2021/03/01 Python
Priority Pass机场贵宾室会籍计划:全球超过1200间机场贵宾室
2018/08/26 全球购物
King Apparel官网:英国街头服饰品牌
2019/09/05 全球购物
Nike瑞士官网:Nike CH
2021/01/18 全球购物
工业学校毕业生自荐信范文
2014/01/03 职场文书
大学学风建设方案
2014/05/04 职场文书
医院党员公开承诺书
2014/08/30 职场文书
2016年“我们的节日·重阳节”主题活动总结
2016/04/01 职场文书
2016年艾滋病宣传活动总结
2016/04/01 职场文书
Python Pandas读取Excel日期数据的异常处理方法
2022/02/28 Python
Win11显卡控制面板打开显卡设置方法
2022/04/20 数码科技
win10识别不了U盘怎么办 win10系统读取U盘失败的解决办法
2022/08/05 数码科技