当前位置: 首页 > 后端技术 > Node.js

VSCode+JSDoc完美实现(几乎)JavaScript代码提示

时间:2023-04-03 10:07:00 Node.js

弱类型脚本语言的代码提示功能一直是开发者隐隐的痛点。没有它也不是不能工作,但往往是错别字或无意修改造成的。变量丢失,大量时间花费在与业务逻辑无关的地方。VSCode的出现有可能统一轻量级IDE领域。新版本自带JSDoc解析功能,帮助JavaScript开发者通过编写注释的方式向IDE提供必要的信息,完善提示功能。先看一个简单的例子(微信小程序前端代码)exportclassCommonUtilsWX{request(o,callback){//TODO:xxxxx}}可以看出,其中有一个对象类型参数o和一个函数函数定义回调类型的回调参数。但是,IDE无法仅从代码定义中获知对象o中必须包含哪些字段以及哪些参数将在回调函数中返回。对于JavaScript这样的弱类型脚本语言,这些信息直到运行阶段才有意义,而对于开发者来说,这些信息在使用一段时间后很容易被遗忘,更别提交付给第三方了。所以这些信息需要用JSDoc来写。exportclassCommonUtilsWX{/***发送网络请求,通信协议必须是http或https,数据协议必须是json*@param{object}o请求参数对象*@param{string}o.host的请求url的域名,如http://xxx.xxx.com*@param{string}o.path请求URL路径,如xxx/xxx*@param{object}o.query请求URL查询段,根据对象中的key和value拼写形式key1=value1&key2=value2*@param{string}o.method请求方法,如GET、POST等*@param{object}o.body请求数据体,仅在method为POST时有效*@param{function(Error):void}callback请求回调,请求成功时error为空*/request(o,callback){//TODO:xxxxx}}即可可以看到JSDoc取了参数o的类型及其必要的内部结构,函数类型参数callback会带回参数类型Error和返回值类型void,其他信息都清晰明了的标示,并附上文字注释。此时直接使用newCommonUtilsWX()构造的对象调用request()方法,可以看到如下提示画面。然后,将文字对象传递给request()函数时,您将看到以下提示屏幕。下面是第二个Letzy={/***sdk版本号*@type{number}*/version:0.1,/***分享功能管理*@type{Share|ShareWX}*/share:Share.createAdapter(),/***常用工具集,如网络请求、弹框展示等*@type{CommonUtils}*/commonUtils:CommonUtils.createAdapter(),/***平台功能管理,如登录、用户信息等*@type{Platform|PlatformWX}*/platform:Platform.createAdapter(),/***排行榜功能管理*@type{Leaderboard}*/leaderboard:Leaderboard.createAdapter(),/***广告功能管理*@type{Ad}*/ad:Ad.createAdapter(),}除了@type关键字,"|"{}中的符号也在这里使用。这样的用法意味着标记的字段可能是多种类型的,特别是对于我代码中的情况,即工厂方法可能返回属于父类的任何子类对象。此时,如果只有父类使用类类型标记该字段,则IDE在使用时无法提示子类中的特殊方法,所以在使用多个可能的类型标记后,IDE会提示所有的提示信息所有可能的类型。此时的提示信息如下图所示。还有一种方法可以定义对象中各个字段的类型和注解,可以复用,看起来更专业。那就是@typedef关键字。下面是重写后的zy对象的@typedef关键字JSDoc:/***@typedef{object}ZY*@property{number}versionsdk版本号*@property{Share|ShareWX}share分享功能管理*@property{CommonUtils}commonUtils常用工具集,如网络请求,弹窗显示等*@property{Platform|PlatformWX}平台平台功能管理,如登录,用户信息等*@property{Leaderboard}排行榜功能管理*@property{Ad}ad广告功能管理*//***@type{ZY}*/letzy={}上半部分用@typedef关键字定义了一个新的类型ZY,并预定义了其中的各个字段类型。然后在下半部分的zy对象上面用JSDoc说这个对象的类型是ZY。这种用法适用于可重复使用的类型对象,或者当其内部字段并非全部按字面意义出现时,或者它们没有出现在集中区域时。下面出现另一个问题。VSCode根据文件模块的依赖关系导入其他文件中的JSDoc。比如在A.js中require("B.js"),那么B.js中的JSDoc信息就可以在A.js的JSDoc中使用,也可以在A.js的代码提示中显示。但是偶尔会出现一些情况,在A.js中逻辑上不需要require("B.js"),但是编码时却需要使用B.js文件中的JSDoc。如果因为这个需求而多了一个require("B.js"),会破坏代码正常的依赖关系。于是出现了如下用法:/***@typedef{import("B.js")}B*/这个方法相当于JSDoc导入的B.js文件,将B.js模块定义为typeB.最后,这里是VSCode官方对JSDoc提示功能的支持文档地址https://github.com/Microsoft/...https://code.visualstudio.com...JSDoc本来是一个JavaScript生成文档的工具。它的语法远远超过目前支持提示功能的VSCode使用的语法。有兴趣的可以去了解下原生的JSDochttp://www.css88.com/doc/jsdoc/最后两声嘟嘟是技术圈五六年来的第一篇。我一发博文就受到了很多资深博主的启发。一方面,发博客是为了分享自己的技术心得,在分享的过程中收获更多。另一方面是提高自己的书面表达能力。但是要入坑,就得一步步进,所以先从可有可无的技巧入手。