• 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 }] ] }
  • 相关阅读:
    gulp.js基础入门
    正则匹配
    app的meta标签
    移动端UC浏览器和QQ浏览器的部分私有meta属性
    雅虎团队经验:网站页面性能优化的 34条黄金守则
    DOCTYPE声明作用及用法详解
    DOCTYPE 中xhtml 1.0和 html 4.01区别分析
    html doctype 作用介绍
    WebStorm
    JQuery的Ajax跨域请求原理概述及实例
  • 原文地址:https://www.cnblogs.com/JRliu/p/8280055.html
Copyright © 2020-2023  润新知