zoukankan      html  css  js  c++  java
  • babel-preset-es2015,babel-polyfill 与 babel-plugin-transform-runtime

    babel-preset-es2015 是一个babel的插件,用于将部分ES6 语法转换为ES5 语法。转换的语法包括:

    1. 箭头函数
      var a1 = () => 1
      编译为
      var a1 = function a1() {
          return 1;
      };
      var obj = {
          birth: 1990,
          getAge: function () {
              var fn = () => new Date().getFullYear() - this.birth
              return fn()
          }
      }
      
      编译为
      var obj = {
          birth: 1990,
          getAge: function getAge() {
              var _this = this;
      
              var fn = function fn() {
                  return new Date().getFullYear() - _this.birth;
              };
              return fn();
          }
      };
    2. class语法
      class Test {
          constructor (x, y) {
              this.x = x
              this.y = y
          }
      
          toString () {
              return '(' + this.x + ', ' + this.y + ')'
          }
      }
      继承:
      class Testextend extends Test{
          constructor (x, y) {
              super(x, y)  // super表示父类的构造函数
              this.name = 'hello'
          }
      
          getName () {
              return 'haha'
          }
      }        
    3. const和let  
      const con = 1
      con = 2  // babel编译时会报错 
      for (let i = 1; i < 5; i++) {
          setTimeout(function () {
              console.log(i)
          }, 100)
      }
      编译为:
      var _loop = function _loop(i) {
          setTimeout(function () {
              console.log(i);
          }, 100);
      };
      
      for (var i = 1; i < 5; i++) {
          _loop(i);
      }
    4. 对象属性名表达式:
      let a = {
         ['a'+'b']: 1
      }
    5. 对象简写
      var o = { a, b, c };
      
      var cat = {
        getName() {
           return name;
        }
      };
    6. 函数参数的新语法:【默认参数 、剩余参数 】
      function test1 (a = 1, b = 2) {
          alert(a + b)
      }
      编译为
      function test1() {
          var a = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
          var b = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;
      
          alert(a + b);
      }
      function test2 (a, ...args) {
          console.log(args)
      }
      编译为
      function test2(a) {
          for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
              args[_key - 1] = arguments[_key];
          }
      
          console.log(args);
      }
    7. 解构赋值
      let [q, w, e] = [1, 2, 3] 
      编译为
      var q = 1, w = 2, e = 3;
      let {r: ss, t, y} = {r: 1, t: 2, y: 3} 
      编译为
      var _r$t$y = { r: 1, t: 2, y: 3 }, ss = _r$t$y.r, t = _r$t$y.t, y = _r$t$y.y;
    8. 字符串模板
      let str1 = 'hel'
      let str2 = 'ld'
      let str3 = '科科'
      let str4 = `${str1}lo 
      wor${str2}!
      ${str3}`
      
      编译为
      var str1 = 'hel';
      var str2 = 'ld';
      var str3 = '科科';
      var str4 = str1 + 'lo 
      wor' + str2 + '!
      ' + str3;

      (8之后的需要polify支持才能在不完全支持es2015的浏览器正常使用)

    9. for-of
    10. ES2015 modules 转换为 CommonJS
    11. generator语法转换
    12. 正则表达式u修饰符 等

    (项目中现在一般直接使用babel-preset-env,她整合了babel-preset-es2015, babel-preset-es2016, and babel-preset-es2017,而且可以配置需要支持的浏览器/运行环境,仅转化需要支持的语法,使文件更轻量)

    但是babel-preset-es2015并不会转换promise、generator等函数,我们还要引入babel-polify库。

    使用babel-polify时,需要在你的业务代码中,在使用ES6的新函数 前通过<script> 或require 等 引入 babel-polyfill(就像引入jquery一样),她会把promise等函数添加到全局对象上;

    babel-plugin-transform-runtime 插件做了以下三件事:

    • 当你使用 generators/async 函数时,自动引入 babel-runtime/regenerator (使用 regenerator 运行时而不会污染当前环境) 。
    • 自动引入 babel-runtime/core-js 并映射 ES6 静态方法和内置插件(实现polyfill的功能且无全局污染,但是实例方法无法正常使用,如   "foobar".includes("foo") )。
    • 移除内联的 Babel helper 并使用模块 babel-runtime/helpers 代替(提取babel转换语法的代码)。

        他们分别对应下面三个配置(默认都为true)

    {
      "plugins": [
        ["transform-runtime", {
        "regenerator": true, "polyfill": true,
        "helpers": true }] ] }
  • 相关阅读:
    POJ 1611 The Suspects
    POJ 2001 Shortest Prefixes(字典树)
    HDU 1251 统计难题(字典树 裸题 链表做法)
    G++ C++之区别
    PAT 乙级 1013. 数素数 (20)
    PAT 乙级 1012. 数字分类 (20)
    PAT 乙级 1009. 说反话 (20)
    PAT 乙级 1008. 数组元素循环右移问题 (20)
    HDU 6063 17多校3 RXD and math(暴力打表题)
    HDU 6066 17多校3 RXD's date(超水题)
  • 原文地址:https://www.cnblogs.com/JRliu/p/8280055.html
Copyright © 2011-2022 走看看