Babel在面试过程中的考点

举报
楚楚冻人玥玥仙女 发表于 2021/11/19 00:44:51 2021/11/19
【摘要】 Babel在面试过程中的考点 Babel功能:解析JS新语法,转化成低版本语法供浏览器使用。 一、环境搭建 & 基本配置 yarn init -y yarn add @babe...

Babel在面试过程中的考点

Babel功能:解析JS新语法,转化成低版本语法供浏览器使用。

一、环境搭建 & 基本配置

yarn init -y
yarn add @babel/cli @babel/core @babel/preset-env @babel/plugin-transform-runtime -D
yarn add @babel/polyfill @babel/runtime

  
 
  • 1
  • 2
  • 3

babel配置文件.babelrc

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

基本使用:

src/index.js

const sum = (a, b) => a + b

  
 
  • 1

执行命令:

yarn babel src/index.js

  
 
  • 1

命令行输出结果:

"use strict";

var sum = function sum(a, b) {
  return a + b;
};

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

babel本身是一个空壳,它只是一个流程工具,它之所以可以将ES6转换成ES5语法,是每个plugin起的作用,而所需要的plugin太多的话,难以记住,所以采取preset预设方案,preset就是把许多plugin重新打一个包取一个名字,比如preset-env,preset-flow,preset-react,preset-typescript, preset-env就包含了很多转换ES6语法的plugin,如果不够用的话还可以配置单独的plugin


二、babel-polyfill

babel-polyfill就是core-jsregenerator的集合

1. Polyfill是一种JS的语法补丁方案。

比如说有些低版本的IE浏览器不支持Array.indexOf,那么就可以在网上找一个Array.indexOfPolyfill放到项目中,处理浏览器兼容性问题

if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function(searchElement, fromIndex) {
    // ......
  }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

2. core-js是官方提供的ES6ES7等新语法的Polyfill集合

3. regeneratorgenerator语法的Polyfill

Babel 7.4 之后弃用babel-polyfill,推荐直接使用core-jsregenerator

babelpreset-env可能无法转换新的API,因为他们的语法已经符合ES5的语法规范,例如:

const sum = (a, b) => a + b

// 新的API
Promise.resolve(100).then(data => data);

[10, 20, 30].includes(20)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

使用babel处理后:

"use strict";

var sum = function sum(a, b) {
  return a + b;
}; // 新的API


Promise.resolve(100).then(function (data) {
  return data;
});
[10, 20, 30].includes(20);

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

所以此时需要引入babel-polyfill

import '@babel/polyfill'
const sum = (a, b) => a + b

// 新的API
Promise.resolve(100).then(data => data);

[10, 20, 30].includes(20)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

进行babel转换后:

"use strict";

require("@babel/polyfill");

var sum = function sum(a, b) {
  return a + b;
}; // 新的API


Promise.resolve(100).then(function (data) {
  return data;
});
[10, 20, 30].includes(20);

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

可以看出babel不处理模块化,只解析语法,模块化是Webpack的工作

4. babel-ployfill 按需引入

  • 文件较大
  • 只用一部分功能,无需全部引入
  • 配置按需引入

.babelrc文件中的preset数组里增加一个配置core-js

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "useBuiltIns": "usage",
        "corejs": 3
      }
    ]
  ],
  "plugins": [
  ]
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

然后移除掉index.js中的polyfill手动导入:

import '@babel/polyfill'
const sum = (a, b) => a + b

// 新的API
Promise.resolve(100).then(data => data);

[10, 20, 30].includes(20)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

重新使用babel处理,实现了按需引入:

"use strict";

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

require("core-js/modules/es.object.to-string");

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

var sum = function sum(a, b) {
  return a + b;
}; // 新的API


Promise.resolve(100).then(function (data) {
  return data;
});
[10, 20, 30].includes(20);

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

5. babel-polyfill的问题

  • 污染全局环境
    // babel-polyfill的实现原理
    window.Promise = function() {}
    Array.prototype.includes = function() {}
    
    // 使用方
    window.Promise = 'abc'
    
        
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 如果做一个独立的web系统,则无碍
  • 如果做一个第三方lib,则会有问题

所以可以使用babel-runtime解决babel-polyfill污染全局变量的问题


三、babel-runtime

.babelrc中配置babel-runtime

{
  "presets": [
    [
      "@babel/preset-env"
    ]
  ],
  "plugins": [
    [
      "@babel/plugin-transform-runtime",
      {
        "absoluteRuntime": false,
        "corejs": 3,
        "helpers": true,
        "regenerator": true,
        "useESModules": false
      }
    ]
  ]
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

使用babel进行处理后结果如下:

"use strict";

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

var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));

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

require("@babel/polyfill");

var _context;

var sum = function sum(a, b) {
  return a + b;
}; // 新的API


_promise["default"].resolve(100).then(function (data) {
  return data;
});

(0, _includes["default"])(_context = [10, 20, 30]).call(_context, 20);

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

我们可以看到处理后的结果方法名前面加了下划线开头,就不再会污染全局变量了。

文章来源: blog.csdn.net,作者:爱玲姐姐,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jal517486222/article/details/109350162

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。