位置: IT常识 - 正文

深入学习 JavaScript 转译器 Babel ,AST还原混淆代码(java deep learning)

编辑:rootadmin
深入学习 JavaScript 转译器 Babel ,AST还原混淆代码 这里写目录标题介绍JavaScript 和 Babel 简介Babel 的历史和发展Babel 的优势和应用场景Babel 的原理和工作流程安装babel模块@babel/parser解析代码解析选项@babel/traversepath对象scope属性bindings对象@babel/generator@babel/types节点类型节点创建节点判断js代码常见混淆方式还原前还原后还原插件介绍JavaScript 和 Babel 简介

推荐整理分享深入学习 JavaScript 转译器 Babel ,AST还原混淆代码(java deep learning),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:深入理解java nio,深入理解java nio,深入理解java nio,深入理解java nio,深入学习习总书记系列讲话精神,深入理解java,深入理解java,深入学习习总书记系列讲话精神,内容如对您有帮助,希望把文章链接给更多的朋友!

JavaScript 是一种广泛应用于 Web 开发的脚本语言,它最初是由网景公司的 Brendan Eich 开发的。JavaScript 具有易学易用、灵活、动态等特点,它能够帮助开发者在 Web 应用中实现丰富的交互和动态效果。

然而,由于 JavaScript 的语法和特性不断更新,旧版的浏览器和环境可能无法完全支持新的 JavaScript 特性,这就使得开发者在编写 JavaScript 代码时需要考虑兼容性问题。为了解决这个问题,Babel 应运而生。

Babel 是一个 JavaScript 编译器,它可以将最新版本的 JavaScript 代码转换成向下兼容的代码,以便旧版的浏览器和环境可以运行。Babel 的转译过程是基于 AST(抽象语法树)的,它可以通过分析 AST 来理解源代码的结构和含义,然后进行相应的转换。

Babel 的使用非常灵活,可以通过命令行、Webpack、Rollup 等多种方式来集成到项目中。开发者可以根据自己的需求来配置 Babel,选择需要的插件和预设,从而实现对不同版本的 JavaScript 代码的转译。同时,Babel 还提供了许多插件和预设,可以实现更加复杂的转译和扩展功能,例如转译 JSX、ES6 模块化、装饰器等。

总之,Babel 是一个非常重要的 JavaScript 工具,它可以帮助开发者更加轻松地编写和维护兼容性更好的 JavaScript 代码,同时也为 JavaScript 社区的发展做出了重要贡献。

Babel 的历史和发展

Babel 诞生于 2014 年,最初的名字是 6to5,它的初衷是为了解决 JavaScript 新特性向下兼容的问题。当时,ES6 标准已经发布,但是很多浏览器和环境并不支持 ES6,这就使得开发者无法充分利用新特性。

6to5 利用了新的 JavaScript 特性,如箭头函数、模板字符串等,将其转换为旧的 ES5 代码,以便兼容性更广的浏览器和环境也能够运行。6to5 很快获得了广泛的关注和认可,它的开发者们决定将其更名为 Babel,并将其转变为一个更加通用的 JavaScript 编译器。

随着时间的推移,Babel 逐渐发展成为一个功能强大、灵活易用的 JavaScript 工具。除了对新特性的转译,Babel 还可以处理 TypeScript、Flow、JSX 等不同的 JavaScript 方言。同时,Babel 的插件系统也逐渐完善,开发者们可以自己编写插件来定制转译过程,或者使用现成的插件来实现更加复杂的功能。

2015 年,Babel 正式发布了 6.0 版本,这个版本带来了很多重要的变化,其中最显著的是支持了 ES6 的新语法和特性,这使得开发者可以更加方便地使用 ES6 来编写 JavaScript 代码。此后,Babel 还不断更新迭代,推出了支持 ES7、ES8 等新版本的 JavaScript 标准的转译,并增加了对一些实验性的 JavaScript 特性的支持。

目前,Babel 已经成为了 JavaScript 社区中最流行、最重要的工具之一,它对 JavaScript 的发展和演进做出了重要贡献。

Babel 的优势和应用场景

帮助解决兼容性问题:Babel 可以将最新版本的 JavaScript 代码转换为向下兼容的代码,以便旧版的浏览器和环境可以运行。这就帮助开发者解决了兼容性问题,使得开发者可以更加放心地使用最新的 JavaScript 特性来编写代码。

提高开发效率:Babel 可以自动化地将新版本的 JavaScript 代码转换为向下兼容的代码,使得开发者可以更加专注于编写高质量的代码,而不需要考虑兼容性问题。这就大大提高了开发效率。

支持多种 JavaScript 方言:除了处理标准的 JavaScript 代码,Babel 还可以处理 TypeScript、Flow、JSX 等不同的 JavaScript 方言。这就使得 Babel 成为了一个通用的 JavaScript 工具,能够应对各种不同的应用场景。

插件系统功能强大:Babel 的插件系统非常灵活,可以自定义转译规则,也可以添加新的语法和特性。这就使得开发者可以根据自己的需求来配置 Babel,选择需要的插件和预设,实现对不同版本的 JavaScript 代码的转译。

基于以上优势,Babel 的应用场景非常广泛,下面列举几个典型的应用场景:

在前端开发中,Babel 可以帮助开发者更加方便地使用最新的 JavaScript 特性来编写代码,同时保证兼容性。例如,在使用 React 开发 Web 应用时,Babel 可以将 JSX 转换为 JavaScript 代码。

在 Node.js 开发中,Babel 可以帮助开发者使用最新的 JavaScript 特性和方言,例如使用 TypeScript 来编写 Node.js 应用程序。同时,Babel 还可以将 Node.js 应用程序打包成支持多种环境的代码。

深入学习 JavaScript 转译器 Babel ,AST还原混淆代码(java deep learning)

在开发工具中,Babel 可以作为编译器使用,例如将 JavaScript 代码转换为 ES5 或 ES6 代码。同时,Babel 还可以作为 Webpack 等构建工具的插件,用于处理 JavaScript 代码的转译和打包。

Babel 的原理和工作流程

Babel 的原理主要分为三个步骤:

解析(Parsing):Babel 首先会将 JavaScript 代码解析成抽象语法树(AST)。这个过程可以通过使用 Babylon 解析器或者其他支持解析 JavaScript 代码的解析器来完成。解析的结果是一个包含 JavaScript 代码的 AST。

转换(Transformation):在转换阶段,Babel 将会遍历 AST,对 AST 中的节点进行修改或者删除,并生成新的 AST。这个过程中,可以使用 Babel 插件来添加新的语法或者修改现有的语法。例如,可以使用 @babel/plugin-transform-arrow-functions 插件将 ES6 的箭头函数转换为 ES5 的函数表达式。

生成(Code Generation):在代码生成阶段,Babel 会将生成的新 AST 转换回 JavaScript 代码,并输出到指定的文件中。这个过程中,Babel 会根据需要进行缩进和格式化,并且会将新生成的 JavaScript 代码与原始代码进行比较,以便调试和测试。

安装babel模块

逆向解混淆,主要用到 Babel 的以下几个功能包,本文也仅介绍以下几个功能包:

安装 Babel:运行以下命令安装 Babel 及其相关模块:这里安装了 @babel/core 和 @babel/cli 两个模块,@babel/core 是 Babel 工具链的核心模块,@babel/cli 是 Babel 命令行工具,可以在命令行中直接使用 Babel 进行代码转译等操作。npm install @babel/core @babel/cli --save-dev安装 Babel 解析器:Babel 使用解析器将 JavaScript 代码转换为抽象语法树(AST),以便进行后续的转换操作。运行以下命令安装 Babel 解析器:npm install @babel/parser --save-dev安装 Babel 转换器:Babel 使用转换器对 AST 进行转换操作,可以添加、删除、替换、修改节点等。@babel/traverse 是 Babel 提供的 AST 转换工具,运行以下命令进行安装:npm install @babel/traverse --save-dev安装 Babel 代码生成器:Babel 将转换后的 AST 重新生成 JavaScript 代码,以便进行后续的编译和执行。@babel/generator 是 Babel 提供的 AST 代码生成器,运行以下命令进行安装:npm install @babel/generator --save-dev安装 @babel/types 模块,可以使用 npm 或 yarn 命令进行安装:npm install @babel/types安装完成后,可以在项目中使用这些模块进行 JavaScript 代码的转译、解析和生成等操作。例如,以下代码演示了使用 Babel 解析器将一个字符串解析成 AST,并使用 Babel 代码生成器将 AST 转换成 JavaScript 代码:需要注意的是,Babel 的使用需要一定的编程经验和 AST 知识,因此建议在学习 Babel 之前先掌握 JavaScript 和 AST 的相关知识。const babelParser = require('@babel/parser');const babelGenerator = require('@babel/generator').default;const code = 'const a = 1;';const ast = babelParser.parse(code);//将代码解析成ast语法树const output = babelGenerator(ast, { /* options */ }, code);console.log(output.code); // 输出转换后的代码:const a = 1;@babel/parser解析代码

@babel/parser 模块提供了一个名为parse()的函数,用于将 ECMAScript 代码解析成 AST。该函数接受两个参数:

code:需要解析的代码,一个字符串。

options:解析选项,一个对象。

例如,以下代码可以解析一个简单的 ECMAScript 代码片段,并打印出 AST:

const { parse } = require('@babel/parser');const code = 'const x = 1 + 2;';const ast = parse(code);console.log(JSON.stringify(ast, null, 2));解析选项

@babel/parser 模块的parse()函数可以接受一个选项对象作为第二个参数,用于指定解析器的行为。常用的选项包括:

sourceType:指定代码的来源类型,可以为 “script” 或 “module”。默认为 “script”。

plugins:指定解析器使用的插件列表,一个数组。默认为空数组。

ranges:是否在 AST 节点中包含节点位置信息,一个布尔值。默认为 false。

locations:是否在 AST 节点中包含源代码位置信息,一个布尔值。默认为 false。

onComment:指定解析器在解析注释时执行的回调函数,一个函数。默认为 null。

例如,以下代码可以使用 sourceType 选项将代码解析为 ES6 模块:

const { parse } = require('@babel/parser');const code = 'export const x = 1;';const ast = parse(code, { sourceType: 'module' });

在这个例子中,我们使用 parse() 函数解析一个 ES6 模块,将 sourceType 选项指定为 "module"。

@babel/traverse

@babel/traverse 是一个用于对抽象语法树(AST)进行递归遍历和更新的工具库,它可以通过访问和修改 AST 节点来实现代码转换。

下面是一个简单的示例代码,其中包含了使用 @babel/parser 将 JavaScript 代码解析为 AST,并使用 @babel/traverse 对 AST 进行遍历和更新的过程。

const parser = require('@babel/parser');const generator= require('@babel/generator').defaultconst traverse = require('@babel/traverse').default;// 将 JavaScript 代码解析为 ASTconst ast = parser.parse(` const double = x => x * 2; const result = double(3);`);// 遍历 AST,并对所有函数调用进行修改traverse(ast, { CallExpression(path) { // 如果当前节点表示一个函数调用 if (path.node.callee.name === 'double') { // 将函数名修改为 triple path.node.callee.name = 'triple'; // 将函数调用的参数修改为原参数的两倍 path.node.arguments[0] = { type: 'NumericLiteral', value: path.node.arguments[0].value * 2, }; } },});// 将修改后的 AST 转换回 JavaScript 代码const code =generator(ast).code;console.log(code);

在这个示例代码中,我们首先使用 @babel/parser 将 JavaScript 代码解析为 AST,然后使用 @babel/traverse 对 AST 进行递归遍历,并对所有函数调用进行修改。具体来说,我们将函数 double 的名称修改为 triple,并将函数调用的参数修改为原参数的两倍。最后,我们使用 @babel/generator 将修改后的 AST 转换回 JavaScript 代码,并输出转换后的代码。

下面这个示例,它演示了如何使用 @babel/traverse 对 JavaScript 代码进行转换,将 var 关键字替换成 const 关键字。

const parser = require('@babel/parser');const traverse = require('@babel/traverse').default;const generator = require('@babel/generator').default;const code = ` var a = 1; var b = 2; var c = a + b;`;// 将 JavaScript 代码解析为 ASTconst ast = parser.parse(code);// 遍历 AST,并将所有 var
本文链接地址:https://www.jiuchutong.com/zhishi/290726.html 转载请保留说明!

上一篇:顶会查找论文的网址和检索方法(论文可查)

下一篇:圣托里尼岛上的伊亚镇,希腊 (© Zebra-Studio/Shutterstock)(圣托里尼岛具体位置)

  • b站怎么一起看一个视频(b站怎么一起看电影)

    b站怎么一起看一个视频(b站怎么一起看电影)

  • 华为荣耀8青春版是几寸手机(华为荣耀8青春版什么时候上市的)

    华为荣耀8青春版是几寸手机(华为荣耀8青春版什么时候上市的)

  • qq特别关心全部功能(qq里特别关心)

    qq特别关心全部功能(qq里特别关心)

  • 手机上的hd怎么取消(手机上hd什么意思)

    手机上的hd怎么取消(手机上hd什么意思)

  • 打赏骑手他们能收到吗(打赏骑手他们能看到吗)

    打赏骑手他们能收到吗(打赏骑手他们能看到吗)

  • ios12.4屏蔽更新描述文件失效(ios12.4.8屏蔽更新)

    ios12.4屏蔽更新描述文件失效(ios12.4.8屏蔽更新)

  • 手机发热是电池原因吗(手机发热是电池问题吗)

    手机发热是电池原因吗(手机发热是电池问题吗)

  • 云充吧能在外地归还吗(云充吧充电宝可以异地还吗)

    云充吧能在外地归还吗(云充吧充电宝可以异地还吗)

  • 发出的红包可以撤回吗(发出的红包可以删除吗)

    发出的红包可以撤回吗(发出的红包可以删除吗)

  • ie如何管理加载项(ie浏览器管理加载项启动不了)

    ie如何管理加载项(ie浏览器管理加载项启动不了)

  • vivoy93怎么弄语音助手(vivoy93jovi语音怎么开启)

    vivoy93怎么弄语音助手(vivoy93jovi语音怎么开启)

  • 华为荣耀9x摄像头怎么升降(华为荣耀9x摄像头)

    华为荣耀9x摄像头怎么升降(华为荣耀9x摄像头)

  • 手机照片怎么连在一起(手机照片怎么连接打印机打印)

    手机照片怎么连在一起(手机照片怎么连接打印机打印)

  • 手机拨号盘怎么恢复(手机拨号盘怎么设置)

    手机拨号盘怎么恢复(手机拨号盘怎么设置)

  • facetime不可用的原因(facetime为什么不可用)

    facetime不可用的原因(facetime为什么不可用)

  • 华为锁屏时间怎么移动(华为锁屏时间怎么调到中间)

    华为锁屏时间怎么移动(华为锁屏时间怎么调到中间)

  • 网易云音乐在苹果手机下架了吗(网易云音乐在苹果锁屏上显示怎么关掉)

    网易云音乐在苹果手机下架了吗(网易云音乐在苹果锁屏上显示怎么关掉)

  • 抖音怎么关闭评论(抖音怎么关闭评论仅自己可见)

    抖音怎么关闭评论(抖音怎么关闭评论仅自己可见)

  • oppo4g网速慢怎么调设置(oppo手机网速太慢怎么办? 教你一招o即o)

    oppo4g网速慢怎么调设置(oppo手机网速太慢怎么办? 教你一招o即o)

  • 西瓜视频如何申请原创(西瓜视频如何申诉判搬运)

    西瓜视频如何申请原创(西瓜视频如何申诉判搬运)

  • 微信红包为啥要绑定银行卡(微信红包为啥要绑定银行卡才能领)

    微信红包为啥要绑定银行卡(微信红包为啥要绑定银行卡才能领)

  • 手机麦克风设置在哪里(如何关闭手机麦克风设置)

    手机麦克风设置在哪里(如何关闭手机麦克风设置)

  • 老年机怎么插卡(goupoo老年机怎么插卡)

    老年机怎么插卡(goupoo老年机怎么插卡)

  • Windows7如何删除硬盘分区?(windows7如何删除软件)

    Windows7如何删除硬盘分区?(windows7如何删除软件)

  • python静态方法如何定义(python3 静态方法)

    python静态方法如何定义(python3 静态方法)

  • 流转税解释
  • 项目固定资产投资包括
  • 资产处置损益包含增值税吗
  • 销货方跨月开红字发票流程
  • 印花税是不是必须要交
  • 房地产开发企业资质等级有几个
  • 固定资产的确认条件是什么
  • 事业单位库存物品
  • 办公用品报销项目怎么写
  • 产品成本的归集和分配是什么意思
  • 个体户到税务局开普票需要什么手续
  • 退交税钱
  • 公司单独买医保
  • 管理费用销售费用
  • 建筑安装预缴增值税
  • 财务杠杆系数简单计算方法
  • 小规模人力资源服务费税率
  • 增值税普票当月开错了怎么办
  • 福利费开成增值税专用发票怎么办
  • mac app store一直转圈圈
  • carrier profile
  • c盘appdata怎么清理
  • win7绝地求生帧数不稳定
  • 施工企业会计制度有哪些
  • 代扣代缴增值税怎么做账
  • 怎么才能快速?
  • 事业编党费如何核算
  • 大白菜u盘启动后黑屏
  • Radio.exe - Radio是什么进程 有什么用
  • 电脑进不去系统一直在启动界面
  • 外销收入申报表怎么填
  • kwhcommonpop.exe是什么程序
  • php可以和iis配合运行吗?
  • 营改增后,个人转让房屋的个人所得税
  • 拆迁以后
  • 摊销期在一年以内的费用
  • 企业所得税营业外收入
  • php发送邮箱
  • php环境搭建教程
  • 房地产开发企业应该具备哪些条件
  • es6箭头函数写法
  • php运算符@符号
  • 零税率和免税的含义和区别
  • 施工水电费账务处理流程
  • 房地产开发企业的了解概述
  • 异地托收承付结算金额起点为
  • 织梦怎么采集文章
  • 发票开具与小票的关系是怎样的
  • 法人如何提取公积金
  • 汇算清缴的费用标准 中汇
  • 完税证明能作为抵扣凭证吗
  • 财政补助资金不需要政府采购
  • 电子承兑到期怎么收款
  • 承兑汇票贴现计算器下载
  • 纳税期限与缴库期限不符
  • 发票遗失证明怎么写范文
  • 所有者权益的来源包括
  • 预算会计年末如何结账
  • 银行对公账户季度
  • 出口退税过期怎么处理
  • 如何理解股权激励
  • 什么是固定资产清理
  • windows下mysql安装配置教程
  • vista sp2 旗舰版 key
  • 正版vista一键升级win7
  • ubuntu 操作系统
  • solaris版本查询
  • linux修改软件源
  • win10开机绿色
  • win7睡眠唤醒设置密码
  • cocos设计模式
  • ES6 javascript中Class类继承用法实例详解
  • cocos2dx4.0教程
  • js中...用法
  • jquery 入门
  • jquery的fadein
  • 基于python语言的项目
  • 中国农村信用社手机银行下载app
  • 政治部副主任是干嘛的
  • 外汇管理数字外管平台怎么登录
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设