前端代码注释率

nodejs差代码注释率

/**
 * @author duan
 * @source https://editor.csdn.net/md/?not_checkout=1&spm=1011.2124.3001.6192
 * @date 2023-7-7
 * 
 * 统计指定目录下代码行数及注释率
 * 
 * 用法: node count.js <路径> [后缀名]...
 * 后缀名不填的话默认为统计 .js 和 .ts 文件
 * 
 * 示例 [统计 ./src 下的 js 文件]: node count.js ./src
 * 示例 [统计 ./dist 下的 java 文件]: node count.js ./src .java
 * 使用方法:node ./count.js ./src
 */

 const fs = require('fs')
 let path = require('path')
 
 // 获取命令行参数
 const parm = process.argv.splice(2)
 // 第一个参数是路径
 const rootPath = parm[0]
 // 后面的所有参数都是文件后缀
 let types = parm.splice(1)
 if (types.length === 0) types = [ '.js', '.ts','.vue','.less','.sass' ]
 // 需要过滤的文件夹
 const filter = [ './node_modules', './.git', './.tscache' ]
 // 总计
 let total = {
     path: 'total',
     length: 0,
     comment: 0,
     commentRatio: 1
 }
 // 统计结果
 let result = []
 
 /**
  * 对指定文件进行统计
  * 包括获取文件行数、注释及计算注释率
  * 
  * @param {string} path 文件路径
  */
 async function count(path) {
     const rep = await fs.readFileSync(path).toString()
     const lines = rep.split('\n')
 
     // 匹配出注释的行数
     const commentNum = lines.filter(line => new RegExp('^(//|/\\*|\\*|\\*|/*/)', 'g').test(line.trimStart())).length
     lines.length = lines.length -commentNum
     result.push({
         path,
         length: lines.length,
         comment: commentNum,
         commentRatio: (Math.round(commentNum/lines.length * 10000) / 100) + '%'
     })
 
     updateTotal(lines.length, commentNum)
 }
 
 /**
  * 更新总计信息
  * 
  * @param {number} length 新增行数
  * @param {number} comment 新增注释
  */
 function updateTotal(length, comment) {
     total.length += length
     total.comment += comment
     total.commentRatio = (Math.round(total.comment/total.length * 10000) / 100) + '%'
 }
 
 /**
  * 递归所有文件夹统计
  * 
  * @param {string} pt 根目录
  */
 async function start(pt) {
     fs.readdirSync(pt).map(file => `${pt}/${file}`)
         .forEach(file => {
             const stat = fs.statSync(file)
             // 是文件夹就递归
             if (stat.isDirectory()) {
                 if (filter.indexOf(pt) != -1) return
                 return start(file)
             }
             // 是文件并且后缀名符合就执行统计
             if (types.indexOf(path.extname(file)) != -1) count(file)
         })
 }
 
 ;(async () => {
     await start(rootPath)
     result.push(total)
     console.table(result)
 })()

使用方法:node ./count.js ./src


VScode插件自动添加注释
1、安装koroFileHeader插件
在这里插入图片描述

2、配置
打开设置,输入koro,点击下图3 位置
在这里插入图片描述

配置如下:
{
// 头部注释
“fileheader.customMade”: {
// 头部注释默认字段
“version”: “V1.0.0”, //版本号
“Author”: “duan”,
“Date”: “Do not edit”, // 设置后默认设置文件生成时间
“LastEditTime”: “Do not edit”, // 设置后,保存文件更改默认更新最后编辑时间
“LastEditors”: “your name”, // 设置后,保存文件更改默认更新最后编辑人
“company”: “同威”, //公司名称
“Mailbox”: “test@test.com”,//邮箱
“Description”: “”,
“FilePath”: “Do not edit”, // 设置后,默认生成文件相对于项目的路径
“custom_string_obkoro1”: “可以输入预定的版权声明、个性签名、空行等”
},
// 函数注释
“fileheader.cursorMode”: {
// 默认字段
“method”: “”,
“description”:“”,
“variable”:“”,
“return”:“”,
“throws”:" {string} 抛出’Error’异常",
“example”:“怎么使用该方法”,
“add(1, 2)”:“// 返回3”
},
// 插件配置项
“fileheader.configObj”: {

    "autoAdd": false, // 检测文件没有头部注释,自动添加文件头部注释
    "autoAddLine": 100, // 文件超过多少行数 不再自动添加头部注释
    "autoAlready": true, // 只添加插件支持的语言以及用户通过`language`选项自定义的注释
    "supportAutoLanguage": [], // 设置之后,在数组内的文件才支持自动添加
// 自动添加头部注释黑名单
"prohibitAutoAdd": [
    "json"
 ],
"prohibitItemAutoAdd": [ "项目的全称禁止项目自动添加头部注释, 使用快捷键自行添加" ],
"folderBlacklist": [ "node_modules" ], // 文件夹或文件名禁止自动添加头部注释
"wideSame": false, // 头部注释等宽设置
"wideNum": 13,  // 头部注释字段长度 默认为13
    "functionWideNum": 0, // 函数注释等宽设置 设为0 即为关闭
// 头部注释第几行插入
    "headInsertLine": {
    "php": 2 // php文件 插入到第二行
    },
    "beforeAnnotation": {}, // 头部注释之前插入内容
    "afterAnnotation": {}, // 头部注释之后插入内容
    "specialOptions": {}, // 特殊字段自定义
    "switch": {
    "newlineAddAnnotation": true // 默认遇到换行符(\r\n \n \r)添加注释符号
    },
    "moveCursor": true, // 自动移动光标到Description所在行
    "dateFormat": "YYYY-MM-DD HH:mm:ss",
    "atSymbol": ["@", "@"], // 更改所有文件的自定义注释中的@符号
    "atSymbolObj": {}, //  更改单独语言/文件的@
    "colon": [": ", ": "], // 更改所有文件的注释冒号
    "colonObj": {}, //  更改单独语言/文件的冒号
    "filePathColon": "路径分隔符替换", // 默认值: mac: / window是: \
    "showErrorMessage": false, // 是否显示插件错误通知 用于debugger
    "writeLog": false, // 错误日志生成
    "CheckFileChange": false, // 单个文件保存时进行diff检查
    "createHeader": false, // 新建文件自动添加头部注释
    "useWorker": false, // 是否使用工作区设置
    "designAddHead": true, // 添加注释图案时添加头部注释
    "headDesignName": "random", // 图案注释使用哪个图案 
    /* 
        'random', // 随机
        'buddhalImg', // 佛祖
        'buddhalImgSay', // 佛祖+佛曰
        'buddhalSay', // 佛曰
        'totemDragon', // 龙图腾
        'belle', // 美女
        'coderSong', // 程序员之歌
        'loitumaGirl', // 甩葱少女
        'keyboardAll', // 全键盘
        'keyboardSmall', // 小键盘
        'totemWestDragon', // 喷火龙
        'jesus', // 耶稣
        'dog', // 狗
        'grassHorse', // 草泥马
        'grassHorse2', // 草泥马2
        'totemBat', // 蝙蝠
    */
    "headDesign": false, // 是否使用图案注释替换头部注释
    // 自定义配置是否在函数内生成注释 不同文件类型和语言类型
    "cursorModeInternalAll": {}, // 默认为false 在函数外生成函数注释
    "openFunctionParamsCheck": true, // 开启关闭自动提取添加函数参数
    "functionParamsShape": ["{", "}"], // 函数参数外形自定义 
    // "functionParamsShape": "no type" 函数参数不需要类型
    "functionBlankSpaceAll": {}, // 函数注释空格缩进 默认为空对象 默认值为0 不缩进
    "functionTypeSymbol": "*", // 参数没有类型时的默认值
    "typeParamOrder": "type param", // 参数类型 和 参数的位置自定义
    // 自定义语言注释,自定义取消 head、end 部分
    // 不设置自定义配置language无效 默认都有head、end
    "customHasHeadEnd": {}, // "cancel head and function" | "cancel head" | "cancel function" 
    "throttleTime": 60000, // 对同一个文件 需要过1分钟再次修改文件并保存才会更新注释
    // 自定义语言注释符号,覆盖插件的注释格式
    "language": {
        // js后缀文件
        "js": {
            "head": "/$$",
            "middle": " $ @",
            "end": " $/",
            // 函数自定义注释符号:如果有此配置 会默认使用
            "functionSymbol": {
            "head": "/******* ", // 统一增加几个*号
            "middle": " * @",
            "end": " */"
            },
            "functionParams": "typescript" // 函数注释使用ts语言的解析逻辑
        },
    // 一次匹配多种文件后缀文件 不用重复设置
    "h/hpp/cpp": {
        "head": "/*** ", // 统一增加几个*号
        "middle": " * @",
        "end": " */"
        },
        // 针对有特殊要求的文件如:test.blade.php
        "blade.php":{
        "head": "<!--",
        "middle": " * @",
        "end": "-->",
        }
    },
// 默认注释  没有匹配到注释符号的时候使用。
"annotationStr": { 
    "head": "/*",
    "middle": " * @",
    "end": " */",
    "use": false
    },
},
"files.associations": {
    "adc.h": "c"
}

}

其中修改下面几项
在这里插入图片描述

3、使用快捷键
文件顶部注释 快捷键
window:ctrl+win+i
mac:ctrl+cmd+i
在这里插入图片描述

函数注释 快捷键
window:ctrl+win+t
mac:ctrl+cmd+t
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/55046.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins通过OpenSSH发布WinServer2016

上一篇文章> Jenkins集成SonarQube代码质量检测 一、实验环境 jenkins环境 jenkins入门与安装 容器为docker 主机IP系统版本jenkins10.10.10.10rhel7.5 二、OpenSSH安装 1、下载 官网地址&#xff1a;https://learn.microsoft.com/zh-cn/windows-server/administration/op…

MaxPatrol SIEM 增加了一套检测供应链攻击的专业技术

我们为 MaxPatrol SIEM 信息安全事件监控系统增加了一套新的专业技术。 该产品可帮助企业防范与供应链攻击相关的威胁。 此类攻击正成为攻击者的首要目标&#xff1a;它们以软件开发商和供应商为目标&#xff0c;网络犯罪分子通过他们的产品进入最终目标的基础设施。 因此&a…

Android Studio 启用设备远程调试配置完整步聚

启用手机设置->开发者选项-无线调试,然后选择允许 已启用后无线调试变成绿色 ,点击无线调试进入详情页面 点击Android Studio的Device Manager 下的WIFI图标 会弹出下图窗口 打开手机的开发者选项中的WIFI调试(无线调试)下的使用二维码配对设备进行扫描. 设备配对成功后手机…

带wiringPi库的交叉编译 ---宿主机x86Ubuntu,目标机ARMv8 aarch64(香橙派)

带wiringPi库的交叉编译如何进行 先交叉编译wiringPi库&#xff0c;编译出的库适合香橙派&#xff0c;这时候交叉编译可执行程序的平台和链接库的格式也是正确的&#xff0c;然后通过-I和-L来指定链接的wiringPi库的头文件和库的位置&#xff0c;但是现在还没有学习过&#xf…

Reinforcement Learning with Code 【Code 1. Tabular Q-learning】

Reinforcement Learning with Code 【Code 1. Tabular Q-learning】 This note records how the author begin to learn RL. Both theoretical understanding and code practice are presented. Many material are referenced such as ZhaoShiyu’s Mathematical Foundation o…

【Redis】内存数据库 Redis 基础

目录 内存数据库Redis概念Redis 安装Redis的启动方式Redis命令行客户端 Redis通用命令Redis key结构Redis value数据类型String 和基础操作Hash 和基础操作List 和基础操作Set 和基础操作Sorted_set 和基础操作 Redis的Java客户端Jedis客户端SpringDataRedis客户端自定义RedisT…

TypeScript基础学习

目录 一、安装 1、下载国内镜像 2、安装 3、查看安装情况 4、使用例子 二、变量声明 1、规则 2、声明的四种方式 3、注意 4、类型断言 5、类型推断 6、变量作用域 三、基础类型&#xff08;共11种&#xff09; 1、Any 类型 2、Null 和 Undefined 3、never 类型…

Thread类的常用方法

文章目录 二. Thread类及常见方法2.1 常见构造方法2.2 Thread 的几个常见属性2.3 启动一个线程 start()2.4 终止一个线程2.5 等待一个线程 join()2.6 获取当前线程的引用2.7 休眠当前线程 二. Thread类及常见方法 2.1 常见构造方法 方法说明Thread()创建线程对象Thread(Runna…

C语言每日一题:11.《数据结构》链表分割。

题目一&#xff1a; 题目链接&#xff1a; 思路一&#xff1a;使用带头链表 1.构建两个新的带头链表&#xff0c;头节点不存储数据。 2.循环遍历原来的链表。 3.小于x的尾插到第一个链表。 4.大于等于x尾插到第二个链表。 5.进行链表合并&#xff0c;注意第二个链表的尾的下一…

RISC-V 指令集介绍

1. 背景介绍 指令集从本质上可以分为复杂指令集&#xff08;Complex Instruction Set Computer&#xff0c;CISC&#xff09;和精简指令集&#xff08;Reduced Instruction Set Computer&#xff0c;RISC&#xff09;两种。复杂指令集的特点是能够在一条指令内完成很多事情。 指…

【外卖系统】分类管理业务

公共字段自动填充 需求分析 对于之前的开发中&#xff0c;有创建时间、创建人、修改时间、修改人等字段&#xff0c;在其他功能中也会有出现&#xff0c;属于公共字段&#xff0c;对于这些公共字段最好是在某个地方统一处理以简化开发&#xff0c;使用Mybatis Plus提供的公共…

iPhone 7透明屏的显示效果怎么样?

iPhone 7是苹果公司于2016年推出的一款智能手机&#xff0c;它采用了4.7英寸的Retina HD显示屏&#xff0c;分辨率为1334x750像素。 虽然iPhone 7的屏幕并不是透明的&#xff0c;但是苹果公司在设计上采用了一些技术&#xff0c;使得用户在使用iPhone 7时可以有一种透明的感觉…

28.利用fminsearch、fminunc 求解最大利润问题(matlab程序)

1.简述 1.无约束&#xff08;无条件&#xff09;的最优化 fminunc函数 : - 可用于任意函数求最小值 - 统一求最小值问题 - 如求最大值问题&#xff1a; >对函数取相反数而变成求最小值问题&#xff0c;最后把函数值取反即为函数的最大值。 使用格式如下 1.必须预先把函数存…

【Golang 接口自动化08】使用标准库httptest完成HTTP请求的Mock测试

目录 前言 http包的HandleFunc函数 http.Request/http.ResponseWriter httptest 定义被测接口 测试代码 测试执行 总结 资料获取方法 前言 Mock是一个做自动化测试永远绕不过去的话题。本文主要介绍使用标准库net/http/httptest完成HTTP请求的Mock的测试方法。 可能有…

113、单例Bean是单例模式吗?

单例Bean是单例模式吗? 通常来说,单例模式是指在一个JVM中,一个类只能构造出来一个对象,有很多方法来实现单例模式,比如懒汉模式,但是我们通常讲的单例模式有一个前提条件就是规定在一个JVM中,那如果要在两个JVM中保证单例呢?那可能就要用分布式锁这些技术,这里的重点…

性能测试基础知识(三)性能指标

性能测试基础知识&#xff08;三&#xff09;性能指标 前言一、时间特性1、响应时间2、并发数3、吞吐量&#xff08;TPS&#xff09; 二、资源特性1、CPU利用率2、内存利用率3、I/O利用率4、网络带宽使用率5、网络传输速率&#xff08;MB/s&#xff09; 三、实例场景 前言 性能…

面试总结(三)

1.进程和线程的区别 根本区别&#xff1a;进程是操作系统分配资源的最小单位&#xff1b;线程是CPU调度的最小单位所属关系&#xff1a;一个进程包含了多个线程&#xff0c;至少拥有一个主线程&#xff1b;线程所属于进程开销不同&#xff1a;进程的创建&#xff0c;销毁&…

LViT:语言与视觉Transformer在医学图像分割

论文链接&#xff1a;https://arxiv.org/abs/2206.14718 代码链接&#xff1a;GitHub - HUANGLIZI/LViT: This repo is the official implementation of "LViT: Language meets Vision Transformer in Medical Image Segmentation" (IEEE Transactions on Medical I…

华为数通HCIP-IGMP(网络组管理协议)

IGMP&#xff08;网络组管理协议&#xff09; 作用&#xff1a;维护、管理最后一跳路由器以及组播接收者之间的关系&#xff1b; 应用&#xff1a;最后一跳路由器以及组播接收者之间&#xff1b; 原理&#xff1a;当组播接收者需要接收某个组别的流量时&#xff0c;会向最后…
最新文章