zoukankan      html  css  js  c++  java
  • babel实践

    现在的主流浏览器还没有完全兼容ES6的语法,如ie11就不支持箭头函数。

    使用过es6的人都知道,es6更加简洁和强大,可是使用es6写出来的代码并不能得到所有主流js引擎的支持,针对这一点,一个解决方案就是使用babel这个工具。

    babel是一个js处理器,可以对js代码进行转换,可以转换jsx、es6代码等。这里我们使用它来把es6代码转为es5代码。

    有如下js代码:

    let add = item => item + 1
    console.log(add(1));

    以上代码可以在chrome61 和 node 6.11 下执行,对于ie11,则运行报错。

    首先安装babel指令:

    npm install -g babel-cli

    接着再安装一个我们需要用到的babel转换规则(把js代码转为es5):

    npm install --save-dev babel-preset-es2015

    通知babel去应用这个规则,我们要在项目的根目录添加一个 .babelrc 文件:

    {
      "presets": [
        "es2015"
      ],
      "plugins": []
    }

    以上三个步骤完成后,可以开始进行转换了。执行:

    babel -d dist/ index.js

    以上会把index.js文件转换的代码存放在当前目录的dist目录下。转换结果:

    let add = item => item + 1
    console.log(add(1));
    
    // after convert :

    "use strict"; var add = function add(item) { return item + 1; }; console.log(add(1));

    转换后的代码可以在ie11中运行了。


     以上这个小例子明白后,来看看第二个例子。

    class Person {
        constructor( name ) {
            this.name = name;
        }
        sayHello() {
            return `Hello ${ this.name }!`;
        }
        sayHelloThreeTimes() {
            let hello = this.sayHello();
            console.log(`${ hello } `.repeat(3));
        }
    }
    new Person('ben').sayHelloThreeTimes()

      这段代码同样没办法直接在ie11上运行,对这段代码进行类似第一个例子中的转换后,依然无法运行,提示如下:对象不支持“repeat”属性或方法 

      这里有很重要的一点值得关注,babel 中的  babel-preset-es2015 这条规则只会转换语法,却不会转换新的api 。而以上的字符串repeat方法是es6新增的api,ie11不支持这个特性,就报错了。

      使浏览器支持新的api。这个需求很常用,通常的解决办法就是使用垫片库(polyfill),而在babel生态里边就有对应的垫片库,叫做babel-polyfill。首先下载:

    npm install --save babel-polyfill

      下载好了之后,使用这个垫片库有两种方式:

    // 使用方式1:在新api所在的js中引入这个模块,如下:
    import 'babel-polyfill';
    
    // 使用方式2:在html的头部引入
    <script src="node_modules/babel-polyfill/dist/polyfill.js"></script>

      可以这么理解,只要这个库被引入了,它就会自动往对应对象的原型上添加新api的定义,这样后续你直接在js中使用新的api,也就不会报错了。

    虽然以上例子中的代码只有十多行,但是查看编译后的代码,能明显感觉到稍微复杂了一些

    对于这样的代码感觉没法调试啊,里面的代码和自己写的代码都不一样的。解决办法是使用sourceMap,这个功能能将原来的代码与编译后的代码进行关联,虽然运行的是编译后的代码,但是里面代码的相对执行次序会反映到原来的代码上。在编译时多加一个参数:

    babel -d dist/ index.js --source-maps

    重新访问页面,调试窗口多出来一个文件,是可以在里面打断点进行调试的:

    里面的代码就是编译前的代码了

  • 相关阅读:
    类间关系总结
    Android数据持久化技术
    广播
    活动
    Clean Code
    理解async特性
    async和await构成的异步方法
    ubuntu开启ssh服务
    lumen可以使用laravel-ide-helper
    laravel excel迁移到lumen
  • 原文地址:https://www.cnblogs.com/hellohello/p/7798653.html
Copyright © 2011-2022 走看看