前端工程化探索——Babel补遗


title: 前端工程化探索——Babel补遗
category: Web
tag: [前端工程化,Babel]
date: 2019-07-14


工欲善其事必先利其器,先不引入webpack,使用cli使用babel

快速使用

安装

npm init -y
npm install --save-dev @babel/core @babel/cli @babel/preset-env # 开发依赖
npm install --save @babel/polyfill # 兼容库 babel目前更推荐使用下面的方式
npm install --save core-js regenerator-runtime
  • @babel/core 核心库
  • @babel/cli 命令行工具
  • @babel/preset-env 预设环境,默认已经安装了一堆插件
  • @babel/polyfill 是一个封装,和单独安装效果一致

配置

创建babel.config.js,设定了目标浏览器

  • @babel/env 就是 @bable/preset-env 的缩写
  • useBuiltIns,是否自动化导入用到的兼容库。
  • corejs,polyfill使用的包
const presets = [
    [
        "@babel/env",
        {
            corejs: 3,
            useBuiltIns: "usage"
        }
    ]
]
const plugins = []
module.exports = { presets, plugins }

创建 .browserslistrc

#chrome > 75
ie >= 9

编译

./node_modules/.bin/babel src --out-dir lib
# 或者使用npx
npx babel src --out-dir lib

其他说明

preset-env 的问题

举个例子,我们想编译 箭头函数,如果不使用 preset,babel不会进行编译,我们引入对应插件:@babel/plugin-transform-arrow-functions来解决。

但这样太麻烦,插件千千万,一个一个安装太累,所以babel提供了 preset 预设环境,默认安装了足够多的插件,还不够的自己再单独安装。

在 babel.config.js 中添加 target 选项指明浏览器环境,更推荐使用 .browserslistrc 把配置外置,方便其他工具共享浏览器名单。

polyfill的问题

使用@bable/preset-env进行代码兼容,但会遇到一个问题,有些特性仍然有问题,这就需要polyfill来解决:

使用了pollyfill,这意味着你可以使用像 PromiseWeakMap 这样的新内置函数,像 Array.fromObject.assign 这样的静态方法,像Array.prototype.includes 这样的实例方法,以及 generator 函数(提供给你使用 regenerator 插件)。为了做到这一点,polyfill 增加了全局范围以及像 String 这样的原生原型。

也就是说polyfill是一个封装包。

在 babel7.4之后会提示@babel/polyfill已经被弃用。请使用下面俩包。

As of Babel 7.4.0, this package has been deprecated in favor of directly including core-js/stable (to polyfill ECMAScript features) and regenerator-runtime/runtime (needed to use transpiled generator functions):

import "core-js/stable";
import "regenerator-runtime/runtime";

补充,至于为啥一个包非得变成俩包,我去看了 core-js 的文档,作者说@babel/polyfill 没有提供平滑的方式让用户从core-js@2 升级成 core-js@3,所以他建议 不使用 polyfill 。似乎是封装包跟不上的原因。链接在此

按需使用corejs,我们使用的是 env preset,其中有一个 "useBuiltIns"选项,当设置为 "usage" 时,只包括你需要的 polyfill。编译的js只会require 你需要的包,而不是整个包。

结论:

  1. 明白 polyfill存在的意义:对浏览器兼容代码是必须的
  2. polyfill 目前被弃用的兼容办法:单独引入两个兼容包
  3. 按需使用兼容包,设置 useBuiltIns: 'usage'

transform-runtime的问题

如果你在开发一些辅助工具,可以使用 transform runtime 插件而不是污染全局的 @babel/polyfill。目前还没用到。

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

推荐阅读更多精彩内容