ESCheck工具原理解析及增强实现(2)

简介: 精简实现的运行结果如下,完整源码见Github

ESCheck工具原理解析及增强实现(1):https://developer.aliyun.com/article/1394806

精简实现的运行结果如下,完整源码见Github

image.png

小结

  1. 检测输出的结果相对友好(比较理想的格式),内置了sourcemap解析逻辑
  2. 不支持html
  3. 需要额外维护一套规则(相对ECMAScript迭代频率来说,可以接受)

增强实现es-check

综上2个对比,从源码实现反应来看 es-check 的实现更简单,维护成本也相对较低

@sugarat/es-check 也将基于es-check做1个增强实现,弥补单文件多次检测,支持HTMLsourcemap解析等能力

单文件多次检测

现状:利用acorn.parse直接对code进行解析时候,将会直接抛出code中的一处解析错误,然后就结束了

那咱们只需要将code拆成多个代码片段,那这个问题理论上就迎刃而解了

现在的问题就是怎么拆了?

我们这直接简单暴力一点,对AST直接进行节点遍历,然后分别检测每个节点对应的代码是否合法

首先使用latest版本生成这棵AST

const ast = acorn.parse(code, {
  ecmaVersion: 'latest'
})

接下来使用acorn-walk进行遍历

import * as acornWalk from 'acorn-walk'
acornWalk.full(ast, (node, _state, _type) => {
  // 节点对应的源码
  const codeSnippet = code.slice(node.start, node.end)
  try {
    acorn.parse(codeSnippet, {
        ecmaVersion,
    })
  } catch (error) {
    // 在这里输出错误片段和解析报错原因
    console.log(codeSnippet)
    console.log(error.message)
  }
})

还是以前面的测试代码为例,输出的错误信息如下

var str = 'hello'
var str2 = 'world'
const varConst = 'const'
let varLet = 'let'
const arrFun = () => {
    console.log('hello world');
}

完整demo1代码

image.png

部分节点对应的片段可能不完整,会导致解析错误

image.png

用于测试的片段如下

const obj = {
  'boolean': true,
}

这里可以再parse检测error前再parse一次latest 用于排除语法错误,额外逻辑如下

let isValidCode = true
// 判断代码片段 是否合法
try {
  acorn.parse(codeSnippet, {
    ecmaVersion: 'latest'
  })
} catch (_) {
  isValidCode = false
}
// 不合法不处理
if (!isValidCode) {
  return 
}

image.png

完整demo2代码

此时输出的错误存在一些重复的情况,比如父节点包含子节点的问题代码,这里做一下过滤

const codeErrorList: any[] = []
acornWalk.full(ast, (node, _state, _type) => {
  // 节点对应的源码
  const codeSnippet = code.slice(node.start, node.end)
  // 省略重复代码。。。
  try {
    acorn.parse(codeSnippet, {
      ecmaVersion: '5'
    } as any)
  } catch (error: any) {
    // 与先存错误进行比较
    const isRepeat = codeErrorList.find((e) => {
      // 判断是否是包含关系
      return e.start >= node.start && e.end <= node.end
    })
    if (!isRepeat) {
      codeErrorList.push({
        codeSnippet,
        message: error.message,
        start: node.start,
        end: node.end
      })
    }
  }
})
console.log(codeErrorList)

修正后结果如下

image.png

ESCheck工具原理解析及增强实现(3)https://developer.aliyun.com/article/1394821?spm=a2c6h.13148508.setting.17.55964f0ez7IHhI

相关文章
|
1天前
|
机器学习/深度学习 存储 算法
卷积神经网络(CNN)的数学原理解析
卷积神经网络(CNN)的数学原理解析
33 1
卷积神经网络(CNN)的数学原理解析
|
1天前
|
传感器 数据采集 存储
岩土工程监测仪器之一:振弦采集仪的工作原理解析
岩土工程监测仪器之一:振弦采集仪的工作原理解析
岩土工程监测仪器之一:振弦采集仪的工作原理解析
|
1天前
|
人工智能 自然语言处理 机器人
销售利器大集结:13种智能销售工具全面解析
该文探讨了人工智能在销售领域的应用,测试了13款领先工具,如Zoho CRM、Email Subject Line Generator和ChatGPT Plus等,这些工具通过数据分析、自动化任务和智能交互提升销售效率。然而,使用AI也带来人机交互和数据安全的挑战。文章强调,结合人工智能和人类销售人员的优势是关键,同时应谨慎处理相关问题。
18 4
|
1天前
|
XML JavaScript 数据格式
Beautiful Soup 库的工作原理基于解析器和 DOM(文档对象模型)树的概念
【5月更文挑战第10天】Beautiful Soup 使用解析器(如 html.parser, lxml, html5lib)解析HTML/XML文档,构建DOM树。它提供方法查询和操作DOM,如find(), find_all()查找元素,get_text(), get()提取信息。还能修改DOM,添加、修改或删除元素,并通过prettify()输出格式化字符串。它是处理网页数据的利器,尤其在处理不规则结构时。
37 2
|
1天前
|
机器学习/深度学习 人工智能 数据可视化
号称能打败MLP的KAN到底行不行?数学核心原理全面解析
Kolmogorov-Arnold Networks (KANs) 是一种新型神经网络架构,挑战了多层感知器(mlp)的基础,通过在权重而非节点上使用可学习的激活函数(如b样条),提高了准确性和可解释性。KANs利用Kolmogorov-Arnold表示定理,将复杂函数分解为简单函数的组合,简化了神经网络的近似过程。与mlp相比,KAN在参数量较少的情况下能达到类似或更好的性能,并能直观地可视化,增强了模型的可解释性。尽管仍需更多研究验证其优势,KAN为深度学习领域带来了新的思路。
109 5
|
1天前
|
敏捷开发 测试技术 持续交付
极限编程(XP)原理与技巧:深入解析与实践
【5月更文挑战第8天】极限编程(XP)是一种敏捷开发方法,注重快速反馈、迭代开发和简单设计,以提高软件质量和项目灵活性。关键原则包括客户合作、集体代码所有权、持续集成等。实践中,使用故事卡片描述需求,遵循编程约定,实行TDD,持续重构,结对编程,并定期举行迭代会议。通过理解和应用XP,团队能提升效率,应对变化。
|
1天前
|
缓存 自然语言处理 JavaScript
万字长文深度解析JDK序列化原理及Fury高度兼容的极致性能实现
Fury是一个基于JIT动态编译的高性能多语言原生序列化框架,支持Java/Python/Golang/C++/JavaScript等语言,提供全自动的对象多语言/跨语言序列化能力,以及相比于别的框架最高20~200倍的性能。
168478 0
|
1天前
PandasTA 源码解析(二十三)
PandasTA 源码解析(二十三)
40 0
|
1天前
PandasTA 源码解析(二十二)(3)
PandasTA 源码解析(二十二)
34 0
|
1天前
PandasTA 源码解析(二十二)(2)
PandasTA 源码解析(二十二)
40 2

推荐镜像

更多