《前端之路》之 Babel 下一代 JavaScript 语法编译器

写本章的内容的出发点主要是 为了对于之前关于 JS 版本的一个总结,在之前的开发中,我们始终对于 ECMAScript 的版本的更新不够重视,以至于在后面的 开发过程中,我们始终会被各种新奇的语法打断了我们的思考思路,所以对于基础的追求,是任何时候都不能忘记的。不然会的框架再多,会玩儿的花样再多,到头来都只是API 。

另外 一个目的就是想做一个好玩的东西,就是 实时编译所写的高版本(ES2015+)的 JS 代码。转化成现在大部分浏览器可以兼容的 ES5 、 ES3 等。

下面就正式介绍下 Babel (v7.0.0 )

一、什么是 Babel

Babel 是一个 JavaScript 编译器,Babel 通过语法变换器支持最新版本的 JavaScript。

1-1 使用方法:

Babel 工具链中有很多工具可以让你轻松使用 Babel,无论你是“终端用户”还是构建中集成 Babel。本文是快速使用这些工具的指南,你可以在文档的“用法”部分中阅读有关它们的更多信息。

1-1-1 : CLI 用法

这里介绍到的 cli 的用法其实对于大部分同学来说不是常规用法。
因为这种用法往往出现在 各种 npm 的包、cli 构建工具集成当中,所以这里,我们只介绍下它的核心用法。

下载核心包  @babel/core
npm install --save-dev @babel/core
你可以直接在 JavaScript 中 require 它并像下面这样使用它
const babel = require("@babel/core");

babel.transform("code", optionsObject);

作为终端用户,你可能希望安装其他工具作为 @babel/core 的接口,并能很好地集成在你的开发过程中。即便如此,你仍可能需要查看其文档页面以了解这些选项,其中大部分选项也可以通过其他工具进行设置。

1-1-2 :Plugins & Presets 用法

以插件 和 预处理 的方式,是我们在开发过程中更为常见的方式。
通常我们在 Vue 项目开发中使用的是 Plugins 的方式
在 React 项目开发中使用的是 Presets 的方式 下面的文章中,我们分别来介绍 如何来使用。

1-1-3 :Polyfill

@babel/polyfill 模块包括 core-js 和自定义 regenerator runtime 来模拟完整的 ES2015+ 环境。
利用 Polyfill 更多的是来解决一个 浏览器的兼容 高版本的 ES 问题。但是往往因为这个包比较的大,所以还是慎重使用。

二、 React、Vue 结合 Babel

如何在 React、Vue 项目中结合Webpack 使用 Babel

2-1 、React && Babel

上文中有介绍到 babel 配合 React 等使用方法。--- Presets。
预处理方案。

2-1-1: 如何使用

我们配置完 webpack 和 React ,并启动 server。
这个时候我们看下我们 react 的代码

import React from "react";
import ReactDom from "react-dom";

const App = () => {
  return (
    <div>
      <h2>hhhh</h2>
    </div>
  );
};
ReactDom.render(<App />, document.getElementById("apps"));

这是一个最简单的 react 的 demo 代码展示:

结果我们发现,我们的终端 上显示 ERROR:

ERROR in ./src/index.js 6:4
Module parse failed: Unexpected token (6:4)
You may need an appropriate loader to handle this file type.
| const App = () => {
|   return (
>     <div>
|       <h2>hhhh</h2>
|     </div>
 @ multi (webpack)-dev-server/client?http://localhost:8081 (webpack)/hot/dev-server.js ./src main[2]

TIPS: 这个时候大多数人看到这个 error 的时候其实都是懵逼的,特别对于新手到讲,然后一部分机智的小伙子发现 已经超过了自己的 知识范围了,就去 谷歌、百度去寻求帮助

不出意外,搜索引擎统一给出的答案就是 未配置 babel 的预处理,导致 webpack 无法读懂这个代码是什么意思。

这个时候,我们来试着配置下我们的 babel 的 presets. 但是如何配置呢?
上文中,我们只是简单的介绍了下,但是实际配置的文件应该是什么样子呢?

2-1-1-1 babel 配置的第一种配置方式:

根目录创建 babel.config.js 文件。

module.exports = function() {
  const presets = [];
  const plugins = [];
  return {
    presets,
    plugins
  };
};

babel.config.js 的官方文档在这里 babel

2-1-1-2 babel 配置的第二种配置方式:

根目录创建 .babelrc 文件 ( JSON 格式)。

{
    "presets": [],
    "plugins": [],
    "env": {}
}

2-1-1-3 两种配置方式的方式都是大同小异 主要是配置的内容

下一个小节我们就详细介绍下 babel的pluginspresets解析

2-1-2: babel的pluginspresets解析

2-1-2-1:明确 ES201x 和 ESx 的关系

ES2015 =》 ES6
ES2016 =》 ES7
ES2017 =》 ES8

在 2015 年之前 ES3 是主流。

2-1-2-2:plugin

: babel的插件,在6.x版本之后babel必需要配合插件来进行工作

{
  "plugins": ["transform-es2015-arrow-functions"]
}

顾名思义, 这个插件就是为了编译 es6 的箭头函数

2-1-2-3:preset

: babel插件集合的预设,包含某一部分的插件plugin

{
  "presets": ["es2015"]
}

这里着重解释下 presetses2015 是什么意思?

es2015 => babel-preset-es2015 (可以将 es6 的 JS 代码编译为 es5)
es2016 => babel-preset-es2016 (可以将 es7 的 JS 代码编译为 es6)
es2017 => babel-preset-es2017 (可以将 es8 的 JS 代码编译为 es7)
stage-x => babel-preset-stage-x (可以将处于某一阶段的js语法编译为正式版本的js代码)

这里再介绍下 stage-x, 提案共分为五个阶段:

  • stage-0: 稻草人-只是一个大胆的想法
  • stage-1: 提案-初步尝试
  • stage-2: 初稿-完成初步规范
  • stage-3: 候选-完成规范和浏览器初步实现
  • stage-4: 完成-将被添加到下一年发布

2-1-2-4:preset env

当前 babel 推荐使用 babel-preset-env 替代 babel-preset-es2015 和 babel-preset-es2016 以及 babel-preset-es2017 ,env的支持范围更广,包含es2015 es2016 es2017的所有语法编译,并且它可以根据项目运行平台的支持情况自行选择编译版本

使用方法:

{
  "presets": ["env", "stage-2"]
}

2-1-2-5: 插件中每个访问者都有排序问题

这意味着如果两次转译都访问相同的”程序”节点,则转译将按照 plugin 或 preset 的规则进行排序然后执行。

  • Plugin 会运行在 Preset 之前。
  • Plugin 会从第一个开始顺序执行。ordering is first to last.
  • Preset 的顺序则刚好相反(从最后一个逆序执行)。

2-1-2-6: 总结:

上面项目的跑起来的时候依然还是还有bug,下面就需要我们来完善这一个问题,用上面学习到的内容

{
  "presets": ["env", "stage-1", "react"],
  "plugins": [
    ["transform-runtime", { "polyfill": false }],
    "transform-decorators-legacy"
  ]
}

每一部分的 插件也好,预处理文件也好。都会影响着整个项目,很多时候均为 各个不同版本插件之间的兼容性问题,搞的非常头痛,所以,看准插件,仔细阅读其文档是不可或缺的。

2-2 、Vue && Babel

Vue 的话,因为有 vue-cli 的存在,已经讲 .babelrc 文件已经给用户配置好了

{
  "presets": ["es2015", "stage-2"],
  "plugins": ["transform-runtime"],
  "comments": false
}

三、Babel 使用 总结

Babel 的使用,是我们对于 ES 的各种版本 的理解更好的帮助,在我们实际的项目使用中也提供了 更多了可能。 在结合 webpack 使用的时候,presets、plugins 的配置。tips: 配置中 各个版本之间的兼容问题得异常注意。 好了,关于 babel 相关的 介绍和理解就到这里,如果还有什么疑惑??,欢迎来撩??


关于 Babel 下一代 JavaScript 语法编译器 的文章就介绍到这里了,欢迎一起来论道~

GitHub 地址:(欢迎 star 、欢迎推荐 : )

Babel 下一代 JavaScript 语法编译器

原文地址:https://www.cnblogs.com/erbingbing/p/9885088.html

时间: 2024-09-30 20:37:46

《前端之路》之 Babel 下一代 JavaScript 语法编译器的相关文章

《前端之路》之 初识 JavaScript

01 初识 JavaScript 作为在码农圈混迹了 四五年的老码畜来说,学习一门新的语言,就仿佛是老司机开新车一样 轻车熟路. 为什么会这么快呢? 因为各种套路啊- 任何一种计算机语言的最开始都是和 数据类型 这个东西分不开,那么今天,我们就从 JavaScript 的数据类型开始 一.JavaScript 的数据类型 因为对于很多的 jser 的初学者而言,或者说说对于很多代码初学者而言,数据类型是让人疑惑的地方.那么一定要解除这个疑虑. JavaScript 一共有 八种数据类型.其中包含

网站前端_JavaScript.0003.JavaScript语法变量

语法构成: 1. JavaScript中的一切(变量,函数名,操作符等)都是区分大小写的 2. JavaScript中的标识符(变量,函数,属性名称,函数参数名称),首字符必须为字母/下划线/美元符号$,其它字符可以为字母/数字/下划线 3. JavaScript中不能把关键字/保留字/true/false/null作为标识符 代码注释: 说明: JavaScript使用C风格的注释,包含单行注释(//)和多行注释(/**/) 变量相关: 1. JavaScript的变量是松散型(可用来保存任何

JavaScript 语法:松软科技前端教程

JavaScript 语法是一套规则,它定义了 JavaScript 的语言结构. var x, y; // 如何声明变量 x = 7; y = 8; // 如何赋值 z = x + y; // 如何计算值 JavaScript 值 JavaScript 语句定义两种类型的值:混合值和变量值. 混合值被称为字面量(literal).变量值被称为变量. JavaScript 字面量 书写混合值最重要的规则是: 写数值有无小数点均可: 15.90 10011 字符串是文本,由双引号或单引号包围: "

漫谈前端之路

前言 前端之路何其漫漫~ 说明:本篇文章原是写给学弟学妹的,但想来花的功夫确实不少,就把此篇文章当做自己的一个阶段性总结文章了,会保持长期更新. HTML 总的来说HTML并不难,甚至可以说很无脑--HTML的标签个人觉得过一遍就得,知道什么时候该用什么标签就可以了,因为在以后的开发中打交道最多的就是各种各样的标签,想不熟都难.就像现在我写这篇文章用的Markdown一样,只是几个标签的反复应用.那么html的学习就相对来说很自由了,可以跟着w3schoolW3school网址过一遍标签,网上也

前端的路还很长

1.会做一些简单的设计(能够熟练使用ps.fireworks.ai.Flash等设计软件做出一些特定的效果) 2.使用html+css进行合理的页面布局 (考虑页面兼容性---->最终要学会做响应式页面或者能够做                               到页面的自适应:注意一下他们的区别于联系                               性能优化------>了解浏览器怎样工作的:渲染与重绘) 3.使用css3做出一些特定的动画效果(Canvas或SVG也可

2019前端面试经典(html5+css3+JavaScript)

前端目录 HTML相关 CSS相关 JAVASCRIPT相关 DOM相关 HTTP相关 VUE相关 算法相关 网络安全相关 webpack相关 其他 Html相关 1 html语义化 意义:根据内容的结构化(内容语义化),选择合适的标签(代码语义化)便于开发者阅读和写出更优雅的代码的同时让浏览器的爬虫和机器很好地解析.注意: 1.尽可能少的使用无语义的标签div和span: 2.在语义不明显时,既可以使用div或者p时,尽量用p, 因为p在默认情况下有上下间距,对兼容特殊终端有利: 3.不要使用

《前端之路》- TypeScript(二) 函数篇

目录 一.定义函数方法 二.定义函数传参 三.可选传参 四.默认传参 五.传递剩余参数 六.函数重载 七.箭头函数 八.总结 一.定义函数方法 在 es5 中定时函数的方法有 命名函数和函数表达式(匿名函数)这门两种.那么同样的,在 TypeScript 中,函数的定义是什么样子的呢? 1-1 命名函数 这里需要注意的一点是: viod 类型,是函数不返回任何类型数据 TypeScript 语法 function func1(): string { return '213'; } functio

HTML5移动开发之路(27)—— JavaScript回顾2

本文为 兄弟连IT教育 机构官方 HTML5培训 教程,主要介绍:HTML5移动开发之路(27)-- JavaScript回顾2 JavaScript面向对象基础知识 1.如何定义一个类,使用如下语法来创建一个类 [javascript] view plain copy print? function Person(name, age){ //习惯上第一个字母大写 //this修饰的变量称为属性 this.name = name; this.age = age; //如果属性值是一个函数,则这个

Grunt 之 使用 JavaScript 语法检查工具 jshint

前端开发环境准备好了,我们准备开始进行开发. 前端开发的主力语言是 JavaScript,这是一种脚本语言,没有编译器,也就没有了编译器带给我们的语法检查,怎样保证代码的质量呢?jshint 是一个强大的工具. 1. 概要说明 官方地址:http://jshint.com/ GitHub 地址:https://github.com/jshint/jshint JSHint 是一个使用 JavaScript 编写的 JavaScript 的代码质量检查工具,主要用来检查代码质量以及找出一些潜在的代