React | 关于Babel

731 阅读1分钟

Babel 是一个 JavaScript 编译器,主要用于将采用 ECMAScript 2015+ 语法编写的代码转换为向后兼容的 JavaScript 语法

使用 Babel 可以:

  • 进行语法转换
  • 通过 Polyfill 方式在目标环境中添加缺失的功能(通过引入第三方 polyfill 模块)
  • 进行源码转换(codemods)

Babel 在项目中很常见,也起着很重要的作用,在了解 React 中的 Babel 之前,先来看看 JSX 的渲染机制:

JSX 的渲染机制

JSX(JavaScript XML)是 Javascript 的一种语法拓展,表示在 JavaScript 中编写XML格式代码

React 中 JSX 渲染的过程:

  • 第一次渲染:

    JSX ------(编译)--------- Virtual DOM --------(渲染)--------- 真实DOM

  • 后期渲染:

    DOM-DIFF ------(计算)------ 渲染PATCH...

在 JSX 的底层处理机制中,第一步就是将 JSX 语法转换为虚拟 DOM,具体步骤为:

  • 基于 babel-presets-react-app 将 JSX 编译为 React.createElement(...) 的形式
  • 执行 createElement() 后创建出虚拟 DOM 对象

编译:

编译前的代码:

    <>
        <h3 style={{color: 'blue'}}>{title}</h3>
    </>

编译后的形式:

React.createElement(React.Fragment, null, 
    React.createElement("h3", {
      style: {
        color: 'blue'
      }
    }, title)
);

在控制台打印上述代码,可以一看到运行之后的形式的就是虚拟 DOM 的形式:

image.png

关于 Babel

安装:

npm install babel-preset-react-app --save-dev

配置

安装了 balel 的项目,可以在 package.json 中可看到相关的配置:

image.png

或是在 .babelrc 文件中进行babel的配置,presets 表示预设 babel 的使用环境,plugins 表示一些扩展的插件

{
    "presets": [
          "react-app"
     ],
     "plugins":...
}

webpack loader配置

module: {
        rules: [{
            test: /.jsx?$/,
            use: 'babel-loader'
        }]
    }

在线编译

Babel官方 也为我们提供了在线编译,可以在线进行操作:

  • target 表示浏览器兼容配置。
  • 在 preset 中选中 react,可编译 react 的代码。

image.png

babel 将 前面的 JSX 编译后,得到下图的结构:

image.png