首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Babel】293- 初学 Babel 工作原理

如果想要了解更多,可以阅读和尝试: 分析 AST:https://ASTexplorer.net AST 规范:https://github.com/estree/estree Babel 工作过程 了解了...Parse(解析) 一般来说,Parse 阶段可以细分为两个阶段:词法分析(Lexical Analysis, LA)和语法分析(Syntactic Analysis, SA)。...词法分析 词法分析阶段可以看成是对代码进行“分词”,它接收一段源代码,然后执行一段 tokenize 函数,把代码分割成被称为Tokens 的东西。...但是,我们得让机器知道怎么拆~ 我们来试着实现一下 tokenize 函数: /** * 词法分析 tokenize * @param {string} code JavaScript 代码 *...语法分析 词法分析之后,代码就已经变成了一个 Tokens 数组了,现在需要通过语法分析把 Tokens 转化为上面提到过的 AST。 说来惭愧,这里没有想到很好的思路来实现一个 parse 函数。

43420
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Babel原理

    是什么 Babel 有什么用 压缩代码如何实现 回答关键点 JS 编译器 AST 插件系统 Babel 是 JavaScript 编译器:他能让开发者在开发过程中,直接使用各类方言(如 TS、Flow、...JSX)或新的语法特性,而不需要考虑运行环境,因为 Babel 可以做到按需转换为低版本支持的代码;Babel 内部原理是将 JS 代码转换为 AST,对 AST 应用各种插件进行处理,最终输出编译后的...JS 代码。...适用于做代码分析或转换等需求。之所以用树来进行分析或转换,是因为树能使得程序中的每一节点恰好被访问一次(前序或后续遍历)。...Babel 编译流程 三大步骤 image 解析阶段:Babel 默认使用 @babel/parser 将代码转换为 AST。解析一般分为两个阶段:词法分析和语法分析

    94711

    Babel的运行原理

    这个步骤分为两个阶段:词法分析(Lexical Analysis) 和 语法分析(Syntactic Analysis)。 词法分析阶段把字符串形式的代码转换为 令牌(tokens) 流。...语法分析阶段会把一个令牌流转换成 AST 的形式。 这个阶段会使用令牌中的信息把它们转换成一个 AST 的表述结构,这样更易于后续的操作。...Babel 使用 @babel/parser 解析代码,输入的 js 代码字符串根据 ESTree 规范生成 AST(抽象语法树) code(字符串形式代码) -> tokens(令牌流) -> AST...Babel提供了@babel/traverse(遍历)方法维护这AST树的整体状态,并且可完成对其的替换,删除或者增加节点,这个方法的参数为原始AST和自定义的转换规则,返回结果为转换后的AST。...Babel使用 @babel/generator 将修改后的 AST 转换成代码,生成过程可以对是否压缩以及是否删除注释等进行配置,并且支持 sourceMap。

    56810

    Babel 的工作原理以及怎么写一个 Babel 插件

    在前端圈子里,对于 Babel,大家肯定都比较熟悉了。如果哪天少了它,对于前端工程师来说肯定是个噩梦。Babel 的工作原理是怎样的可能了解的人就不太多了。...本文将主要介绍 Babel 的工作原理以及怎么写一个 Babel 插件。 Babel 是怎么工作的 Babel 是一个 JavaScript 编译器。...为了理解 Babel,我们从最简单一句 console 命令下手 解析(Parsing) Babel 拿到源代码会把代码抽象出来,变成 AST (抽象语法树),学过编译原理的同学应该都听过这个词,全称是...语义分析则是将得到的词汇进行一个立体的组合,确定词语之间的关系。...总结 文章主要介绍 Babel 编译代码的过程和原理以及简单编写了一个 babel 插件,欢迎大家对内容进行指正和讨论。

    2.3K30

    Babel是如何读懂JS代码的

    这篇文章的关注点是另一个方面,也是很多人会好奇的事情,Babel的工作原理是什么。...Babel工作的三个阶段 首先要说明的是,现在前端流行用的WebPack或其他同类工程化工具会将源文件组合起来,这部分并不是Babel完成的,是这些打包工具自己实现的,Babel的功能非常纯粹,以字符串的形式将源代码传给它...解析这一步又分成两个步骤: 分词:将整个代码字符串分割成 语法单元 数组 语义分析:在分词结果的基础之上分析 语法单元之间的关系 我们一步步讲。...那么回到代码的解析当中,JS代码有哪些语法单元呢?...语义分析的过程又是个遍历语法单元的过程,不过相比较而言更复杂,因为分词过程中,每个语法单元都是独立平铺的,而语法分析中,语句和表达式会以树状的结构互相包含。

    1.8K30

    JS原生方法原理探究(六)从 Babel 转译过程浅谈 ES6 实现继承的原理

    这是JS 原生方法原理探究系列的第六篇文章。 都说 ES6 的 Class 是 ES5 的语法糖,那么 ES6 的 Class 是如何实现的呢?其实现继承的原理又是什么呢?...不妨我们通过 Babel 转译代码的方式,看看其中有什么门道。 这篇文章会从最简单的代码入手,一步步剖析相关的原理以及每个函数的作用。代码的转译直接在 Babel 官网进行即可。...好了,我们已经分析了这几个函数的作用,现在直接翻到最下面的代码,从 Son 子类看起: var Son = /*#__PURE__*/ (function (_Parent) { _inherits...从 extends 看 JS 继承这篇文章进行了解释,这里我就不重复了)。 接着,调用 Object.create 设置父类的原型为子类原型的 __proto__。...到这里,我们的分析基本就结束了。希望你阅读完本文之后有所收获,若发现文章有错误,也欢迎评论区指正。 `

    1.1K10

    JS原生方法原理探究(六)从 Babel 转译过程浅谈 ES6 实现继承的原理

    这是JS 原生方法原理探究系列的第六篇文章。 都说 ES6 的 Class 是 ES5 的语法糖,那么 ES6 的 Class 是如何实现的呢?其实现继承的原理又是什么呢?...不妨我们通过 Babel 转译代码的方式,看看其中有什么门道。 这篇文章会从最简单的代码入手,一步步剖析相关的原理以及每个函数的作用。代码的转译直接在 Babel 官网进行即可。...:该属性(方法)是否可以配置 writable:如果该属性是数据属性而不是访问器属性,那么会有一个 value,此时设置该属性为可写 ES6 的继承是如何实现的 好了,基本搞清楚一个 class 的原理之后...从 extends 看 JS 继承这篇文章进行了解释,这里我就不重复了)。 接着,调用 Object.create 设置父类的原型为子类原型的 __proto__。...到这里,我们的分析基本就结束了。希望你阅读完本文之后有所收获,若发现文章有错误,也欢迎评论区指正。

    1.1K20

    Redux原理分析以及使用详解(TS && JS)

    Redux原理分析 一、Reudx基本介绍 1.1、什么时候使用Redux? 简单说,如果你的UI层非常简单,没有很多互动,Redux 就是不必要的,用了反而增加复杂性。...二、Redux的工作原理 1、首先我们找到最上面的state 2、在react中state决定了视图(UI),state的变化就会调用React的render()方法,从而改变视图 3、用户通过一些事件...五、使用redux-dev-tools插件调试redux 5.1、下载插件 首先在谷歌商店搜索redux-dev-tools,下载这个插件,然后重启浏览器 在redux中的store文件进行配置 若是JS...__REDUX_DEVTOOLS_EXTENSION__())) Tip :原来我使用JS+Redux,添加这个插件配置,部署到服务器上用户访问以及别人启动我的项目,都没有报错,但是当我使用TS+hooks...&& TS + hooks) 6.2.1、JS的用法(取值以及触发action) import React, {Component} from 'react' import {connect} from

    4.2K30

    react源码分析babel如何解析jsx

    等一些列的过程,将会在本系列中一一讲解工欲善其事,必先利其器经过多年的发展,React已经更新了大版本16、17、18,本系列主要讲的是 version:17.0.2,在讲这个版本之前,我们先看一看在babel...第二章 第三章 第四章 v16.x及以前版本图片v17及之后版本图片所以各位看到了,在v16及以前我们babel...进行jsx解析编译的是根据@babel/babel-preset-react-app解析成React.createElement进行包裹的,而v17以及之后的版本,官网早就说明,对jsx的转换用react...到底是如何玩的,那么进入源码在babel解析后的v17产物中我们可以看得到 var _jsxRuntime = require("react/jsx-runtime");那么我们追本溯源可以找到在packages.../react/src/jsx/ReactJSX.js里面的jsxs是怎么来的// packages/react/src/jsx/ReactJSX.jsimport {REACT_FRAGMENT_TYPE

    39020

    react源码分析babel如何解析jsx

    等一些列的过程,将会在本系列中一一讲解工欲善其事,必先利其器经过多年的发展,React已经更新了大版本16、17、18,本系列主要讲的是 version:17.0.2,在讲这个版本之前,我们先看一看在babel...第二章 第三章 第四章 v16.x及以前版本图片v17及之后版本图片所以各位看到了,在v16及以前我们babel...进行jsx解析编译的是根据@babel/babel-preset-react-app解析成React.createElement进行包裹的,而v17以及之后的版本,官网早就说明,对jsx的转换用react...到底是如何玩的,那么进入源码在babel解析后的v17产物中我们可以看得到 var _jsxRuntime = require("react/jsx-runtime");那么我们追本溯源可以找到在packages.../react/src/jsx/ReactJSX.js里面的jsxs是怎么来的// packages/react/src/jsx/ReactJSX.jsimport {REACT_FRAGMENT_TYPE

    34230

    JS异步转同步组件——DeAsync.js原理深入分析

    那么,看似不符合js运行原理的黑科技究竟是怎么实现的呢?我们可以打开上面的github目录,分析一下deasync.js的源代码。...简单地说,它就是强制JS引擎执行了一遍事件循环。 事件循环又是什么?此处就要深入分析一下JS引擎的工作原理。...JS引擎的工作原理 我们都知道js是单线程执行的,用单线程配合异步IO,让我们开发者可以很直观地编写业务逻辑,不用担心时序错乱的问题。 下图显示了Nodejs的主体结构,在很多地方都能看到它。...每次进入事件循环之前,js引擎都会首先处理微观任务队列,处理完所有微观任务后,再进行事件循环,所以promise总是比setTimeout先执行,也是这个原理。...副作用 了解了上面的内容,我们也就清楚deAsync的工作原理了。在正常的js执行过程中,主线程代码在结束之前,任何异步注册的回调都不会执行。

    7.2K61

    react源码分析babel如何解析jsx

    等一些列的过程,将会在本系列中一一讲解工欲善其事,必先利其器经过多年的发展,React已经更新了大版本16、17、18,本系列主要讲的是 version:17.0.2,在讲这个版本之前,我们先看一看在babel...第二章 第三章 第四章 v16.x及以前版本图片v17及之后版本图片所以各位看到了,在v16及以前我们babel...进行jsx解析编译的是根据@babel/babel-preset-react-app解析成React.createElement进行包裹的,而v17以及之后的版本,官网早就说明,对jsx的转换用react...到底是如何玩的,那么进入源码在babel解析后的v17产物中我们可以看得到 var _jsxRuntime = require("react/jsx-runtime");那么我们追本溯源可以找到在packages.../react/src/jsx/ReactJSX.js里面的jsxs是怎么来的// packages/react/src/jsx/ReactJSX.jsimport {REACT_FRAGMENT_TYPE

    26240

    面试官问你Babel原理该怎么回答

    babylon:js的词法解析器,AST生成babel-traverse:用于对AST(抽象语法树,想了解的请自行查询编译原理)的遍历,主要给plugin用babel-generator:根据AST生成代码功能包...是transform步骤使用的babel-preset-xxx:transform阶段使用到的一系列的plugin(官方写好的插件)babel-polyfill:JS标准新增的原生对象和API的shim...babel-cli:babel的命令行工具,通过命令行对js代码进行转译babel-register:通过绑定node.js的require来自动转译require引用的js代码文件babel8 将包名变为了...原理图片Babel 转换 JS 代码可以分成以下三个大步骤:Parser(解析):此过程接受转换之前的源码,输出 AST(抽象语法树)。...定义待转化的代码字符串:/** * 待转化的代码 */const codeString = 'const add = (a, b) => a + b';(1)ES6 code --> AST生成AST是需要进行字符串词法分析和语法分析的首先进行词法分析

    35040

    babel ES6 转换 ES5 实现原理

    今天来看一下在 babel 中是如何将 ES6 转换为 ES5 的 。 babel 各种包介绍 babel-core:核心包,提供转译的 API,用于对代码进行转译。...例如 babel.transform。在 webpack 中 babel-loader 就是通过这个包实现。babylon:babel 的词法解析器。...将原始代码逐个字母地像扫描机一样读取分析得出 AST 语法树结构。babel-traverse:对 AST 进行遍历转译。babel-generator:将新的 AST 语法树生成新的代码。...babel-types:用于检验、构建和改变 AST 树的节点 babel-template:辅助函数,用于从字符串形式的代码来构建 AST 树节点 babel-helpers:一系列预制的 babel-template...babel-polyfill:JS 标准新增的原生对象和 API 的 shim,实现上仅仅是 core-js 和 regenerator-runtime两个包的封装。

    83220

    深入浅出 Babel 上篇:架构和原理 + 实战

    这个文章系列将带大家深入浅出 Babel, 这个系列将分为上下两篇:上篇主要介绍 Babel 的架构和原理,顺便实践一下插件开发的;下篇会介绍 `babel-plugin-macros , 利用它来写属于...Babel 的处理流程 上图是 Babel 的处理流程, 如果读者学习过编译器原理,这个过程就相当亲切了. 首先从源码 解析(Parsing) 开始,解析包含了两个步骤: 1. ️⃣...这些信息有助于后续的语法分析。...5️⃣ 工具 @babel/node:Node.js CLI, 通过它直接运行需要 Babel 处理的JavaScript文件 @babel/register:Patch NodeJs 的require...最后 新世界的大门已经打开: ⛩ 本文主要介绍了 Babel 的架构和原理,还实践了一下 Babel 插件开发,读到这里,你算是入了 Babel 的门了. ?

    1.1K20

    Webstorm配置babel将.js文件转换为es5

    前言 最近编写工具站(Laravel + Vue.js【是引用.js文件,不是前端vue.js后端laravel】)的时候,写js的时候,是在不想写es5语法,比如写var,Webstorm提醒使用let...而node.js中可以使用babel将es6语法转换为es5语法。所以我就想能不能利用babel,将单个.js文件的语法转换为es5?经过一番实践,成功了。...输入 babel -h 查看帮助,没报错误,就是成功啦。 ? 我准备了 一个regular.js文件,里面有es6语法。 ?...好了,在命令行里面输入: babel regular.js --presets env --out-file reg.js 编译regular.js 到文件reg.js , 用的预设规则是env 【前面安装的...没报错,就成功啦~ 查看reg.js文件: ? 的确是es5语法了。 webstorm配置 新建Babel ? 如下图 ?

    2.6K00
    领券