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 }] ] }
  • 相关阅读:
    -bash: fork: Cannot allocate memory 问题的处理
    Docker top 命令
    docker常见问题修复方法
    The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
    What's the difference between encoding and charset?
    hexcode of é î Latin-1 Supplement
    炉石Advanced rulebook
    炉石bug反馈
    Sidecar pattern
    SQL JOIN
  • 原文地址:https://www.cnblogs.com/JRliu/p/8280055.html
Copyright © 2011-2022 走看看