热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

vscode切换开发者工具_VSCode插件开发全攻略(六)开发调试技巧

前言在介绍完一些比较简单的内容点之后,我觉得有必要先和大家介绍一些开发中遇到的一些细节问题以及技巧,特别是后面一章节将要介绍WebView的知识

前言

在介绍完一些比较简单的内容点之后,我觉得有必要先和大家介绍一些开发中遇到的一些细节问题以及技巧,特别是后面一章节将要介绍WebView的知识,这个坑会比较多,避免大家走弯路。

开发方式

最理想的方式是准备双显示器,一个写代码,一个运行插件,实践证明这种方式开发效率会提升很多,每次修改完代码之后直接Ctrl+R重新加载即可,非常方便。

日志查看

就我目前遇到的情况来看,vscode日志主要有这5种:

旧窗口的调试控制台

扩展里的console.log()日志一般输出在这里,但是有很大的限制,结构稍微深一点的对象在这里了就显示不了:

Unable to log remote console arguments Output omitted for an object that cannot be inspected (Error: [sxei.vscode-plugin-demo]: Proposed API is only available when running out of dev or with the following command line switch: --enable-proposed-api sxei.vscode-plugin-demo)

这里只能看成是新窗口开发者控制台日志的一种快捷显示,以下是旧窗口调试控制台显示的内容:

而对应的内容在新窗口的开发者控制台显示如下:

可以看到,结构较深的对象即使在控制台也无法显示,目前发现的唯一比较好的方法就是在输出的地方打一个断点,然后运行的时候会自动卡在这里,鼠标悬停就可以查看对象的内容。

新窗口的调试控制台

一般没什么扩展相关日志会输出在这里。

旧窗口的开发者控制台

快捷键Ctrl+Alt+I,这里一般显示vscode本身一些日志,和扩展相关的不会显示在这里,所以这个也不用太多关心。

新窗口的开发者控制台

快捷键也是Ctrl+Alt+I,不记得的可以从帮助 -> 切换开发人员工具找到。这个控制台很重要,有时候如果发现你的代码莫名其妙没生效,很有可能是报错了,这种报错是不会显示在旧窗口调试控制台的,如果你不知道到这里来查看日志,那么你只能一脸懵逼的到处乱试了,调试控制台只打印常规日志,语法错误并不会显示在这里。

例如,我在跳转定义实现前人为制造一个错误:

function provideDefinition(document, position, token) {

console.log(aaf);

const fileName = document.fileName;

// 省略其它代码

}

运行后就会发现点击跳转不生效,但是也没有什么报错提示,此时只能打开控制台查看才能发现问题:

WebView控制台

WebView我们会在下一章节介绍,这里先提一下。Webview的控制台比较特殊,需要特殊的命令才能打开,按下Ctrl+Shift+P然后执行打开Webview开发工具,英文版应该是Open Webview Developer Tools:

开发时我们把它当成一个普通的网页来看就好了。

调试

vscode插件的调试非常简单方便,只需要在需要调试的地方打个断点,然后按F5执行即可:

几个调试快捷键:

F5运行

Ctrl+F2停止运行

F6下一步跳过(类似于Chrome的F10)

F5下一步跳入

F8跳过

如何快速找到我想找的内容

刚开始只能先大概对整个vscode的api有一个大概了解,了解了之后就大概清楚一般什么功能会怎么实现,该去什么地方找,所有的vscode的api都可以在vscode.d.ts文件里面找到:

不得不佩服,正规大型项目的注释写的真的不是一般的详细,官网的API文档肯定也是基于这个自动生成的,反正把这个ts文件吃透了,基本上你想实现什么功能要怎么实现都了如指掌了。

查看插件存放目录

插件安装后根据操作系统不同会放在如下目录:

Windows系统:%USERPROFILE%\.vscode\extensions

Mac/Linux:~/.vscode/extensions

想要学习查看其它插件的代码可以找到这个目录:

一些个人经验分享

调试控制台日志不可靠

vscode有一个很坑爹的地方,这里特别要注意,当require一个function进来并打印输出时,虽然打印在控制台显示为null,但其实是有值的,不知道的人很容易被误导,直接就是被这个现象骗了很久,切记切记!

test-require-function.js:

function testRequireFunction(a, b) {

console.log('进入testRequireFunction方法');

console.log(a, b);

}

module.exports = testRequireFunction;

extension.js:

exports.activate = function(context) {

const testFn = require('./test-require-function');

console.log(testFn); // vscode的日志输出不可靠,这里竟然会打印null?!

testFn(1, 2); // 1, 2

};

输出结果:

null

进入testRequireFunction方法

1 2

代码为什么没生效

代码没生效一般从这几个地方去查找:

activationEvents里面添加了吗?开发的时候如果老是忘记可以直接设置成*;

代码是不是报错了?如前文所说,很多错误是不会暴露出来的,需要手动打开控制台查看;

代码是不是忘记引入了?有时候拆分多个文件之后可能忘了引入;

逻辑是不是写错了?最好的办法就是debug,这是找问题最快的方法;

版本冲突

这里重点说一下最后面的版本冲突,这个甚至可以说是vscode本身的一些bug,经常发现代码莫名其妙地没生效,怎么调试都不对,后来发现运行的根本就不是我们正在开发的那个版本,特别是当你的插件已经发了一版到应用市场并安装后,本地再按F5运行,理论上说debug运行的会覆盖已安装的,但有时候还是会出现异常情况,所以为了以防万一,当出现这种情况时可以先把已经安装的给卸载。

还有一个问题就是,有时候明明安装了版本更加新的那个,结果运行的却是旧的,打开扩展目录会发现很多并存的同名不同版本插件,或者可能先是通过vsix方式安装了一个版本,然后又从应用市场安装一个,总之解决这类问题最好的方法就是:先卸载再安装,实在不行手动去插件目录删除之!

打开文件

打开文件是vscode.window.showTextDocument而不是vscode.workspace.openTextDocument,这个根据字面意思很容易搞错,原来老外也有命名不准确的时候啊,哈哈。

vscode.workspace.openTextDocument仅仅是加载文档并返回一个TextDocument对象,但是并不在vscode中打开;

vscode.window.showTextDocument则是在vscode中打开一个文档;

其实:

vscode.workspace.openTextDocument('someFilePath').then(document => {

vscode.window.showTextDocument(document, editor => {

// 可以操作文档的editor对象

});

})

等价于:

vscode.window.showTextDocument(vscode.Uri.file('someFilePath'), editor => {

// 可以操作文档的editor对象

});

工程根目录的获取

被这个问题踩过很多次坑,所有重点介绍一下。

有的人的vscode工作空间是这样的,每一个工程一个个地单独拖入:

也有的人是直接用打开文件夹的方式把存放代码的父文件夹给打开:

但是如果此时你点击将工作区另存为保存了工作区之后就变成这样了(请注意图标的变化):

所以,即便拿到了某个文件的完整路径也不好获取这个文件的工程路径,因为不知道工作区的这个文件夹名字是你的工程名还是存放工程的父文件夹的名字。

已知:

vscode以前有一个vscode.workspace.rootPath,由于后来vscode支持multipleRoot模式,所以这个字段已经过时作废了。

vscode.workspace.workspaceFolders可以获取当前工作区所有根文件夹数组;

之前我写了一个简单粗暴的获取工程目录方式:

/**

* 获取当前所在工程根目录,有3种使用方法:

* getProjectPath(uri) uri 表示工程内某个文件的路径

* getProjectPath(document) document 表示当前被打开的文件document对象

* getProjectPath() 会自动从 activeTextEditor 拿document对象,如果没有拿到则报错

* @param {*} document

*/

getProjectPath(document) {

if (!document) {

document = vscode.window.activeTextEditor ? vscode.window.activeTextEditor.document : null;

}

if (!document) {

this.showError('当前激活的编辑器不是文件或者没有文件被打开!');

return '';

}

const currentFile = (document.uri ? document.uri : document).fsPath;

let projectPath = null;

let workspaceFolders = vscode.workspace.workspaceFolders.map(item => item.uri.path);

// 由于存在Multi-root工作区,暂时没有特别好的判断方法,先这样粗暴判断

// 如果发现只有一个根文件夹,读取其子文件夹作为 workspaceFolders

if (workspaceFolders.length == 1 && workspaceFolders[0] === vscode.workspace.rootPath) {

const rootPath = workspaceFolders[0];

var files = fs.readdirSync(rootPath);

workspaceFolders = files.filter(name => !/^\./g.test(name)).map(name => path.resolve(rootPath, name));

// vscode.workspace.rootPath会不准确,且已过时

// return vscode.workspace.rootPath + '/' + this._getProjectName(vscode, document);

}

workspaceFolders.forEach(folder => {

if (currentFile.indexOf(folder) === 0) {

projectPath = folder;

}

})

if (!projectPath) {

this.showError('获取工程根路径异常!');

return '';

}

return projectPath;

},

这种方式生效的前提是,如果是按照第一种方式存放工作空间的,工程的数目必须大于等于2,但是这种判断方式不用说肯定会不准确。

后来换成了另外一种方式,考虑到工作接触到的项目无论是node端还是前端都会有package.json文件在根目录,所以就根据哪个文件夹有这个文件来判断,也只能是这样了。



推荐阅读
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Ubuntu 9.04中安装谷歌Chromium浏览器及使用体验[图文]
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • Ubuntu安装常用软件详细步骤
    目录1.GoogleChrome浏览器2.搜狗拼音输入法3.Pycharm4.Clion5.其他软件1.GoogleChrome浏览器通过直接下载安装GoogleChro ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • Google在I/O开发者大会详细介绍Android N系统的更新和安全性提升
    Google在2016年的I/O开发者大会上详细介绍了Android N系统的更新和安全性提升。Android N系统在安全方面支持无缝升级更新和修补漏洞,引入了基于文件的数据加密系统和移动版本的Chrome浏览器可以识别恶意网站等新的安全机制。在性能方面,Android N内置了先进的图形处理系统Vulkan,加入了JIT编译器以提高安装效率和减少应用程序的占用空间。此外,Android N还具有自动关闭长时间未使用的后台应用程序来释放系统资源的机制。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
author-avatar
mobiledu2502895417
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有