什么是babel?(请耐心看下去)

前端应该都会知道babel,知道这是一个把es6转换成es5的工具,用react框架的可能会了解到是jsx,当然熟悉vue的也会知道jsx这种形式,但是我只是会用,会简单配置一下。并不了解,babel究竟是什么玩意。(也许是因为我还大学没毕业的原因吧,见识短见。。。)

官网说Babel 是一个 JavaScript 编译器。
编译分成3个阶段:解析,转换,打印输出。

babel如果本身没有任何插件,则基本就是源代码不发生变化,要想进行相应的转化,就必须有相应的插件带动它。

为了应征这一点,我们先测试一下。

npm init //初始化
npm i -D @babel/core @babel/cli //下载babel-core的作用就是babel的作用负责编译
//@babel/cli没必要说了,@babel/cli/bin 里面的指令可以进行编译

创建一个script.js文件

//随便写点代码
const a=10;
console.log(a)

let b =()=>console.log(a)

调用指令npx babel script.js或者 npx babel script.js --out-file script-compiled.js
也可以在package.json中配置一下script命令
"serve": "node_modules/.bin/babel script.js "
后者生成文件
可以得到在命令控制台


image.png

发现代码除了格式变了一下,没有任何变化

这里印证了官网说的没毛病,当然官网怎么可能会说的有毛病。

那么问题来了,怎么配置插件(plugin),插件那么多,配置起来那么麻烦,怎么办,优先级又是怎么样的?一大推问题来了,该怎么解决呢?

官方说,我知道你们也不容易,所以我就配置几个吧,preset(预设)就出来了,
比如我们经常用到的预设,@babel/preset-env,es6转成es5最常用的配置,当然还有@babel/preset-react,@babel/preset-typescript ,@babel/preset-flow。

preset 预设

首先preset本质的原理就是自己配置一大推的plugin,我们拿@babel/preset-env为例,如图


image.png

里面还有很多插件,太多了,就拍了一点,
官网也说过了,可以自己配置一个preset,格式如下

module.exports = function() {
  return {
    plugins: [
      "pluginA",
      "pluginB",
      "pluginC",
    ]
  };
}

这样preset的原理我们也懂了,其实就是一个插件的套餐。

#######优先级
在.babelrc preset是从后往前来的。

那么我们来测试一下@babel/preset-env吧

npm i  @babel/preset-env -D //这里我们不考虑生产环境和开发环境因为主要是为了测试

创建文件夹.babelrc

{
    "presets": ["@babel/preset-env"]
}

在运行指令npm run serve,如果没有配置的话,就调用npx babel script.js

image.png

代码成功的转换成了es5的形式。

插件plugin

首先插件(plugin)的优先级要>preset(预设)的
插件是从前往后运行的,这点和preset是相反的。

语法插件(syntax)

在有对应的转换(transform)插件的使用后,可以不写。这是一个小细节吧。

插件也没啥可说的,想用啥的时候就使用啥就哦了,还是介绍一个react ui antd经常用的按需加载的插件babel-plugin-import ,这个插件的作用是为了解决在按需加载的问题,当我们引用react的ui库antd时,就会引用这个插件。
尽管我感觉没啥用,因为treeshanking,在生产环境会完成按需加载。

plugins: [
               ['import',[{  // 导入一个插件
                 libraryName: 'antd',   // 暴露的库名
                 style: true // 直接将ants样式文件动态编译成行内样式插入,就不需要每次都导入
               }]]
             ]

Polyfills

@babel/polyfills 可以满足babel的所有功能,babel-preset-env不足以满足所有的功能,这时候就需要用到了它了,例如await, generator,symbol等等
注意:polyfills已经放弃更新了。

import @babel/polyfill
就可以在下面随便写代码了,
但是有一个缺点,体积太大

@babel/polyfills =core-js +regenerator-runtime

虽然@babel/polyfills不更新,但是core-js 还会继续更新。

因为缺点明显,体积过大,那么怎么解决这个问题呢?
肯定是按需求加载,这时就出现了一种方案useBuiltInts:usage

npm i core-js //新版本是3.x
presets:[['@babel/preset-env',{
    useBuiltIns:'usage',
module:false,
//指定core-js版本
corejs:{
    version:3
},
//指定兼容性做到哪个版本
targets:{
 chrome:'60',
firefox:'60',
ie:'9'
}

}]]

这样就可以解决体积大的问题。

@babel/plugin-transform-runtime

从名字看我们就可以理解这个插件,作用是为了在不同模块都调用相同方法,如class,没必要调用第二次还生成一个function方法。
它需要babel-runtime,babel-runtime就是重复代码的集合处。
babel-runtime内部集成了core-js regenerator-runtime helpers

我们一块引用core-js 按需加载和@babel/plugin-transform-runtime 测试一下代码。


const a=10;
console.log(a)

let b =()=>console.log(a)

const c =new Promise((rej,res)=>{
    rej(1)
})
c.then(function(data){
    console.log(data)
})

class D{
    constructor(){
        this.value='123'
    }

}
const e=new D()
console.log(e)

const f=`${e}hahahahah`
const z=new Promise((rej,res)=>{
    rej(1)
})
z.then((data)=>{
    console.log(data)
})

var map = new Map();
"use strict";

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

var _promise = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/promise"));

var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/map"));

var a = 10;
console.log(a);

var b = function b() {
  return console.log(a);
};

var c = new _promise.default(function (rej, res) {
  rej(1);
});
c.then(function (data) {
  console.log(data);
});

var D = function D() {
  (0, _classCallCheck2.default)(this, D);
  this.value = '123';
};

var e = new D();
console.log(e);
var f = "".concat(e, "hahahahah");
var z = new _promise.default(function (rej, res) {
  rej(1);
});
z.then(function (data) {
  console.log(data);
});
var map = new _map.default();

{
    "presets": [["@babel/preset-env",{"useBuiltIns":"usage","corejs":3,"targets":{
        "chrome":"60",
       "firefox":"60",
       "ie":"11"
       }}]],
    "plugins": [["@babel/plugin-transform-runtime",{"corejs":3}]]
}

发现和我们的想法一样,调用了runtime里面的内容,证明@babel/plugin-transform-runtime使用成功,而且也实现了按需求加载,没有require('@babel/polyfill'),所以也成功了!

babel-loader

这玩意大家肯定更熟悉,我也不用多说了,在代码压缩之前调用一次babel,不仅符合浏览器调用版本,而且还能压缩体积,还有比这爽的吗。(配置过程不爽!!!)
简单介绍一下配置过程

  rules: [
    {
      test: /\.js$/,
      exclude: /(node_modules|bower_components)/,
      loader: 'babel-loader',
     也可以 use:[{loader:'babel-loader',options:{
  plugins:['xxx'],
presets:['xxxx']

}}]
    }
  ]

在babel-loader里面配置优先级更大。
但是一般我们还是会选择在外边配置,package.json里面配置或者是.babelrc里面配置

先介绍到这吧!

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

推荐阅读更多精彩内容