现在的主流浏览器还没有完全兼容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

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

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

babel实践的更多相关文章

  1. babel 实践

    一.@babel/core var babel = require("@babel/core");babel.transform(code, options, function(e ...

  2. react项目实践——(3)babel

    1. babel Babel是一个广泛使用的转码器,可以将ES6代码转为ES5代码,从而在现有环境执行. (1)安装 npm install --save-dev babel-core babel-e ...

  3. vue2.0 开发实践总结之入门篇

    vue2.0 据说也出了很久了,博主终于操了一次实刀. 整体项目采用  vue +  vue-router +  vuex (传说中的vue 全家桶 ),构建工具使用尤大大推出的vue-cli 后续文 ...

  4. avalon2的后端渲染实践

    avalon2为了提高性能,采用全新的架构,四层架构,其中一层为虚拟DOM. 虚拟DOM的一个好处是能大大提高性能,另一个好处是能过错整描述我们的页面结构.因此在非浏览器环境下,虚拟DOM也能正常运行 ...

  5. 深入浅出ES6(九):学习Babel和Broccoli,马上就用ES6

    作者 Jason Orendorff  github主页  https://github.com/jorendorff 现在,我们将向你分步展示如何做到的这一切.上面提及的工具被称为转译器,你可以将它 ...

  6. [转] Node.js 服务端实践之 GraphQL 初探

    https://medium.com/the-graphqlhub/your-first-graphql-server-3c766ab4f0a2#.n88wyan4e 0.问题来了 DT 时代,各种业 ...

  7. 基于 koajs 的前后端分离实践

    一.什么是前后端分离? 前后端分离的概念和优势在这里不再赘述,有兴趣的同学可以看各个前辈们一系列总结和讨论: 系列文章:前后端分离的思考与实践(1-6) slider: 淘宝前后端分离实践 知乎提问: ...

  8. 在React+Babel+Webpack环境中使用ESLint

    ESLint是js中目前比较流行的插件化的静态代码检测工具.通过使用它可以保证高质量的代码,尽量减少和提早发现一些错误.使用eslint可以在工程中保证一致的代码风格,特别是当工程变得越来越大.越来越 ...

  9. ES6核心内容精讲--快速实践ES6(一)

    前言 本文大量参考了阮一峰老师的开源教程ECMAScript6入门,适合新手入门或者对ES6常用知识点进行全面回顾,目标是以较少的篇幅涵盖ES6及部分ES7在实践中的绝大多数使用场景.更全面.更深入的 ...

随机推荐

  1. “XXX.Index”不扩展类“System.Web.UI.Page”,因此此处不允许的问题

    “XXX.Index”不扩展类“System.Web.UI.Page”,因此此处不允许的问题 原因:设计页面继承的路径和后台.cs页面类的路径不一致造成的 看下图 这个是设计页面的样式 这个是后台cs ...

  2. Hexo瞎折腾系列(5) - 使用hexo-neat插件压缩页面静态资源

    为什么要压缩页面静态资源 对于个人博客来说,优化页面的访问速度是很有必要的,如果打开你的个人站点,加载个首页就要十几秒,页面长时间处于空白状态,想必没什么人能够忍受得了吧.我个人觉得,如果能把页面的加 ...

  3. C++构造函数详解(复制构造函数 也是 拷贝构造函数)

    构造函数是干什么的 该类对象被创建时,编译系统对象分配内存空间,并自动调用该构造函数,由构造函数完成成员的初始化工作,故:构造函数的作用:初始化对象的数据成员. 构造函数的种类 1 class Com ...

  4. Lightoj 1025 - The Specials Menu (区间DP)

    题目链接: Lightoj 1025 - The Specials Menu 题目描述: 给出一个字符串,可以任意删除位置的字符,也可以删除任意多个.问能组成多少个回文串? 解题思路: 自从开始学dp ...

  5. 数位dp知识点整理

    题解报告:hdu 2089 不要62 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌 ...

  6. Linux 导出Okular 编辑的pdf批注

    1.环境 ubuntu 14.04 LTS Okular Version 0.19.3 Using KDE Development Platform 4.13.3 2.方法 2.1只导出批注,不改变p ...

  7. 利用layui的load模块解决图片上传

    首先肯定要参考layui官网的upload模块文档:http://www.layui.com/doc/modules/upload.html 讲讲思路:在一份添加表单中,我们有个图片上传的模块,然后我 ...

  8. android开发学习 ------- json数据与实体类之间的相互转换

    在网络请求的时候,会返回给我们实体类,我们需要将实体类转化为json字符串,方便处理数据: 有时候也会将json数据转换为实体类. 在Android Studio中,json要互相转换,需要用到gso ...

  9. AJPFX关于hashmap和hashtable 的区别

    Hashtable和HashMap类有三个重要的不同之处.第一个不同主要是历史原因.Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现. ...

  10. 【学习笔记】深入理解js原型和闭包(2)——函数和对象的关系

    上文(深入理解jS原型和闭包(1)——一切都是对象)已经提到,函数就是对象的一种,因为通过instanceof函数可以判断. var fn = function () { }; console.log ...