【前端工具】Babel入门使用

babel可以把ES6的语法向下转到更低版本的ES5的语法,尤其是在使用一些ES6及其更高版本的新特性的时候,例如箭头函数,promise对象等。
下面我们来创建一个项目

mkdir babel-basic
cd babel-basic
npm init -y
mkdir src
cd src
touch index.js

至此我们创建了一个目录结构如下x项目

babel-basic
  |- src
    |- index.js
  |- package.json

安装@babel/core

@babel/core是babel的核心模块,提供了babel转换的一些API,详情可以参考babel文档

npm install --save-dev @babel/core

安装@babel/cli

@babel/cli是babel的命令行工具,可以通过命令来进行代码转译

npm install --save-dev @babel/cli

我们在index.js中写一段代码

const foo = () => {
    console.log(111) // ES6的箭头函数语法,打印111
}

此时我们通过命令行把src中的.js文件转译输出到lib目录中

babel src --out-dir lib

我们打开lib目录,可以看到也有一个index.js文件

babel转译后生成的目录.png

打开index.js文件,我们会发现生成的index.js文件和原来的src/index.js文件一模一样,并没有进行转译

// lib/index.js
const foo = () => {
    console.log(111); // ES6的箭头函数语法,打印111
};

我们也可以不用上面的命令行,对package.json文件进行配置脚本,通过脚本来进行转译

{
    "name": "babel-basic",
    "version": "1.0.0",
    "description": "",
    "main": "index.js",
    "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1",
        "build": "babel src -d lib"
    },
    "keywords": [],
    "author": "",
    "license": "ISC",
    "devDependencies": {
        "@babel/cli": "^7.15.7",
        "@babel/core": "^7.15.8"
    }
}

配置中-d--out-dir的缩写,之后我们就可以用下面的命令来进行转译了

npm run build

效果和前面的一样

@babel/preset-env

@babel/preset-env可以将前面诸如箭头函数的语法转换为function() {}的语法。
如前面所说,我们还需要设置转译的环境,告诉babel我们要转译成什么样的代码。于是我们需要在根目录下创建一个配置文件babel.config.js

const presets = [
    [
        '@babel/env',
        {
            targets: {
                edge: '17',
                chrome: '64',
                firefox: '60',
                safari: '11.1',
            },
        },
    ],
]

module.exports = { presets }

有了这个文件,我们就可以用命令npx babel src --out-dir lib来进行转译了

npx babel src --out-dir lib

当然我们转译完成后发现,lib/index.js中的代码和src/index.js中的代码还是一样的,是因为我们的配置文件中,浏览器都支持了箭头函数的语法,如果我们将edge: "17"改成edge: "10",就会转译成下面的代码了,因为edge 10不支持箭头函数

"use strict";

var foo = function foo() {
  console.log(111); // ES6的箭头函数语法,打印111
};

同样的我们也可以修改package.json文件脚本,通过脚本来完成转译

{
    "name": "babel-basic",
    "version": "1.0.0",
    "description": "",
    "main": "index.js",
    "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1",
        "build": "babel src -d lib --config-file ./babel.config.js"
    },
    "keywords": [],
    "author": "",
    "license": "ISC",
    "devDependencies": {
        "@babel/cli": "^7.15.7",
        "@babel/core": "^7.15.8",
        "@babel/preset-env": "^7.15.8",
        "core-js": "^3.18.3"
    }
}

此时,我们就可以用npm run build来完成转译的过程了,结果是一样的。

Polyfill

polyfill 是对执行环境或其他功能的补充。比如,在 edge10 中使用 ES7 的语法 includes(),但是我们知道这个版本的浏览器环境是不支持这个方法的,如果强行使用并不能达到预期效果。
polyfill 就是解决这个问题的,如果环境不支持,那么就帮你引用一个支持这种语法的环境。
比如

const res = [1, 2, 3, 4].includes(3)  // ES7的语法
console.log(res) // true

我们通过polyfill后的代码则是给加上了运行的环境

"use strict";

require("core-js/modules/es.array.includes.js");

var res = [1, 2, 3, 4].includes(3);
console.log(res); // true

我们下面来安装@babel/polyfill

npm install --save-dev @babel/polyfill

我们还需要在配置文件中加上useBuiltIns: 'usage'

const presets = [
    [
        '@babel/env',
        {
            targets: {
                edge: '10',
                chrome: '64',
                firefox: '60',
                safari: '11.1',
            },
            useBuiltIns: 'usage'
        },
    ],
]

module.exports = { presets }

现在我们用命令npm run build就可以得到刚才的那个结果了,不过需要注意的是Terminal会报出一个警告,推荐使用corejs

警告.png

core-js@3

安装core-js@3

npm install --save core-js@3

我们还需要在配置文件中加上corejs: 3

const presets = [
    [
        '@babel/env',
        {
            targets: {
                edge: '10',
                chrome: '64',
                firefox: '60',
                safari: '11.1',
            },
            useBuiltIns: 'usage',
            corejs: 3,
        },
    ],
]

module.exports = { presets }

这时候我们再运行npm run build就不会弹出警告了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容