前端科普系列(4):Babel——把ES6送上天的通天塔-创新互联

本文首发于 vivo互联网技术 微信公众号 
链接:  https://mp.weixin.qq.com/s/plJewhUd0xDXh4Ce4CGpHg
作者:Morrain

成都创新互联专注于企业营销型网站建设、网站重做改版、麒麟网站定制设计、自适应品牌网站建设、H5高端网站建设商城网站建设、集团公司官网建设、成都外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为麒麟等各大城市提供网站开发制作服务。

前端科普系列(4):Babel —— 把 ES6 送上天的通天塔

一、前言

在上一节 《 CommonJS:不是前端却革命了前端》中,我们聊到了 ES6 Module,它是 ES6 中对模块的规范,ES6 是 ECMAScript 6.0 的简称,泛指 JavaScript 语言的下一代标准,它的第一个版本 ES2015 已经在 2015 年 6 月正式发布,本文中提到的 ES6 包括 ES2015、ES2016、ES2017等等。在第一节的《Web:一路前行一路忘川》中也提到过,ES2015 从制定到发布历经了十几年,引入了很多的新特性以及新的机制,浏览器对 ES6 的支持进度远远赶不上前端开发小哥哥们使用 ES6 的热情,于是矛盾就日益显著……

二、Babel 是什么

先来看下它在 官网上的定义:

Babel is a JavaScript compiler

没错就一句话,Babel 是 JavaScript 的编译器。至于什么是编译器,可以参考  the-super-tiny-compiler 这个项目,可以找到很好的答案。

本文是以 Babel 7.9.0 版本进行演示和讲解的,另外建议学习者阅读英文官网,中文官网会比原版网站慢一个版本,并且很多依然是英文的。

Babel 就是一套解决方案,用来把 ES6 的代码转化为浏览器或者其它环境支持的代码。 注意我的用词哈,我说的不是转化为 ES5 ,因为不同类型以及不同版本的浏览器对 ES6 新特性的支持程度都不一样,对于浏览器已经支持的部分,Babel 可以不转化,所以 Babel 会依赖浏览器的版本,后面会讲到。这里可以先参考  browerslist 项目。

Babel 的历史

在学习任何一门知识前,我都习惯先了解它的历史,这样才能深刻理解它存在意义。

Babel 的作者是 FaceBook 的工程师 Sebastian McKenzie。他在 2014 年发布了一款 JavaScript 的编译器 6to5。从名字就能看出来,它主要的作用就是将 ES6 转化为 ES5。

这里的 ES6 指 ES2015,因为当时还没有正式发布, ES2015 的名字还未被正式确定。

于是很多人评价,6to5 只是 ES6 得到支持前的一个过渡方案,它的作者非常不同意这个观点,认为 6to5 不光会按照标准逐步完善,依然具备非常大的潜力反过来影响并推进标准的制定。正因为如此 6to5 的团队觉得 '6to5' 这个名字并没有准确的传达这个项目的目标。加上 ES6 正式发布后,被命名为 ES2015,对于 6to5 来说更偏离了它的初衷。于是 2015 年 2 月 15 号,6to5 正式更名为 Babel。

前端科普系列(4):Babel —— 把 ES6 送上天的通天塔前端科普系列(4):Babel —— 把 ES6 送上天的通天塔

(图片来源于网络)

Babel 是巴比伦文化里的通天塔,用来给 6to5 这个项目命名真得太贴切了!羡慕这些牛逼的人,不光代码写得好,还这么有文化,不像我们,起个变量名都得憋上半天,吃了没有文化的亏。这也是为什么我把这篇文章起名为 《Babel:把 ES6 送上天的通天塔》的原因。

三、Babel 怎么用

了解了 Babel 是什么后,很明显我们就要开始考虑怎么使用 Babel 来转化 ES6 的代码了,除了 Babel 本身提供的 cli 等工具外,它还支持和其它打包工具配合使用,譬如 webpack、rollup 等等,可以参考 官网对不同平台提供的配置说明。

本文为了感受 Babel 最原始的用法,不结合其它任何工具,直接使用 Babel 的 cli 来演示。

1、构建 Babel 演示的工程

使用如下命令构建一个 npm 包,并新建 src 目录 和 一个 index.js 文件。

npm init -y

前端科普系列(4):Babel —— 把 ES6 送上天的通天塔前端科普系列(4):Babel —— 把 ES6 送上天的通天塔

package.json 内容如下:

{
  "name": "demo",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

2、安装依赖包

npm install --save-dev @babel/core @babel/cli @babel/preset-env

后面会介绍这些包的作用,先看用法

增加 babel 命令来编译 src 目录下的文件到 dist 目录:

{
  "name": "demo",
  "version": "1.0.0",
  "description": "",
  "main": "src/index.js",
  "scripts": {
    "babel": "babel src --out-dir dist",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@babel/cli": "^7.8.4",
    "@babel/core": "^7.9.0",
    "@babel/preset-env": "^7.9.0"
  }
}

3、增加 Babel 配置文件

在工程的根目录添加 babel.config.js 文件,增加 Babel 编译的配置,没有配置是不进行编译的。

const presets = [
  [
    '@babel/env',
    {
      debug: true
    }
  ]
]
const plugins = []
 
module.exports = { presets, plugins }
前端科普系列(4):Babel —— 把 ES6 送上天的通天塔

上例中 debug 配置是为了打印出 Babel 工作时的日志,可以方便的看来,Babel 转化了哪些语法。

  1. presets 主要是配置用来编译的预置,plugins 主要是配置完成编译的插件,具体的含义后面会讲
  2. 推荐用 Javascript 文件来写配置文件,而不是 JSON 文件,这样可以根据环境来动态配置需要使用的 presets 和 plugins

const presets = [
  [
    '@babel/env',
    {
      debug: true
    }
  ]
]
const plugins = []
 
if (process.env["ENV"] === "prod") {
  plugins.push(...)
}
 
module.exports = { presets, plugins }

前端科普系列(4):Babel —— 把 ES6 送上天的通天塔
当前标题:前端科普系列(4):Babel——把ES6送上天的通天塔-创新互联
标题路径:http://pwwzsj.com/article/ccdghp.html