es6(1)——Babel

Babel

参考阮一峰的文章所写。

已细化重点知识,确保可以按步骤复现。并省略某些不常用的内容

解释:

1. 简单来说,就是可以把ES6的代码转换成ES5的代码,这样你就可以在ES5的环境中运行ES6而不必担心兼容性了;
2. ES7的转换也可以靠这个来完成;
3. 其是放置在node_modules文件夹下的插件,就像使用其他通过npm install安装的插件一样使用;
4. 默认只转换语法,不转换API。比如Iterator、Generator、Set、Maps、Proxy、Reflect、Symbol、Promise等全局对象,以及一些定义在全局对象上的方法(比如Object.assign)都不会转码。

【使用方法】

1. 在项目的根目录下创建一个文件,文件名是.babelrc,记得放在项目根目录(一般是和package.json还有readme.md同一个目录下);
2. 注意1:上面那个文件,在windows下不能直接创建(会提示说必须输入文件名),
   解决方法1:用linux、mac或者用IDE(比如webstorm)来创建;
   解决方法2:从我的github中直接下载文件
3. 注意2:那个文件的babelrc就是后缀名,而不是txt格式的(所以会提示没有文件名);
4. 用编译器打开(或者用记事本打开也行,注意编码格式是UTF8),文件内基本格式如下:

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

5. 这个文件用于设置转码规则和插件;
6. presets是转码规则,值的数组里面,填写规则。
7. plugins是插件,有需要就写,不需要的话这个可以省略。
8. 按需安装转码规则(见下面);
9. 将对应的字符串添加到.babelrc中(千万别忘了,我试了半天总转失败,结果发现我没加)
10. 运行转码命令/内嵌到package.json里在项目运行时转码;

转码规则和转码安装:

1. 首先应该安装对应的转码规则集(他的规则像安装npm插件一样安装);
2. 然后在"presets"这个数组中填写对应的值;
3. 官方提供的规则集如下(转自[阮一峰的博客](http://es6.ruanyifeng.com/#docs/intro)):

        注:
        $表示命令行,实际输入的时候从npm开始输入(应该不会有人不知道吧);
        #表示注释,不要输这个后面的文字啊

        # ES2015转码规则
        $ npm install --save-dev babel-preset-es2015
        # 添加的字符串为:"es2015"(""表示这是个字符串),下同

        # react转码规则
        $ npm install --save-dev babel-preset-react
        # 添加的字符串为:"react"

        # ES7不同阶段语法提案的转码规则(共有4个阶段),选装一个
        $ npm install --save-dev babel-preset-stage-0
        $ npm install --save-dev babel-preset-stage-1
        $ npm install --save-dev babel-preset-stage-2
        $ npm install --save-dev babel-preset-stage-3
        # 添加的字符串为:"stage-0"至"stage-3"中的一个(显然后面包含前面)

4. 安装完转码规则之后(根据实际需要安装,不用全部装),在.babelrc文件的"presets"的值中添加对应的字符串作为数组元素,参考上面;

方法一:全局使用babel-cli转码(命令行、单文件、所有文件夹输出结果)

优点:

1.简单直接暴力,全局安装,哪里都能用;

缺点:

1.项目要求有环境依赖,换了环境不能用(比如说换台电脑,但他没装babel-cli就尴尬了);

前置准备:

1. 先配置好,参考【使用方法】
2. 命令行输入以下代码,来全局安装babel-cli工具
       npm install --global babel-cli

步骤:

1.控制台输出转换结果(控制台输出):

1. 命令行输入以下代码:(下同,都是控制台输入)
       babel input.js
2. 然后控制台会输出以下内容(转换结果,下同,结果内容都是以下的内容):
       "use strict";

       var input = [];
       input.map(function (item) {
         return item + 1;
       });

2.将转换结果输出到指定文件内(单文件转换):

1. 输入:
       babel input.js -o output.js
2. 输出:
       同目录下自动生成output.js,文件内容是上面的转换结果
3. -o表示--out-file,即输出为文件

3.将一个目录下的所有文件(递归执行)全部转码输出到某个文件夹下(同名转换):

1. 先建立一个input文件夹,把之前的input.js复制一份进去;
2. 输入:
       babel input -d output
3. -d表示--out-dir,即输出到文件夹,前面的input表示输入文件夹名,后面的output表示的是输出的文件夹名;
4. 输出:output目录被创建,里面有input文件夹下的同名input.js,但内容是转换后的
5. input文件下所有文件都会被转换,转换过程是递归的(即子文件夹下的子文件,甚至更深层也会被转换);

非全局使用babel-cli转码(作为项目的依赖转码)

优点:

1.非全局,不要求PC环境全局安装babel-cli;
2.方便版本管理

缺点:

1.需要配置package.json,比较麻烦一些;

前置准备:

1. 先配置好,参考【使用方法】
2. 修改package.json,添加相应的脚本代码;
3. 具体来说,根目录下创建一个package.json,然后文件内容如下:
       {
         "devDependencies": {
           "babel-cli": "^6.0.0"
         },
         "scripts": {
           "build": "babel input -d output"
         }
       }

转换方法:

1. 先建立一个input文件夹,把之前的input.js复制一份进去;
2. 然后在根目录(即package.json以及.babelrc所在目录的控制台输入:
       npm run build
3. 效果和全局使用的【转换方法3】是一样的;

注1:

npm run build里的build,指的是package.json里面,scripts里的build属性的属性名,如果把属性名改为test,那么就是npm run test

注2:

npm run build相当于执行了babel input -d output这个指令。只不过这里的babel来源于node_modules文件夹下的babel-cli,而不是之前通过控制台运行的全局的babel-cli

其他转码

如:

  1. 提供一个可以直接运行ES6的REPL环境,无需转码直接运行ES6脚本,点击直达
  2. 加钩子,每当使用require加载.js、.jsx、.es和.es6后缀名的文件,自动转码点击直达
  3. 对某些代码进行转码(按需转码)点击直达
  4. 对API进行转码 点击直达
  5. 在浏览器环境中实时转码(会影响性能,而以上是直接转完后发给浏览器) 点击直达
  6. 还有在线转换(输入ES6代码,输出ES5代码,然后复制拿走使用) 点击直达%3B)
  7. 还有关于Google公司的Traceur转码器,或者是babel和其他框架的配合等,请点击右方链接直达阮一峰的博客来查阅

关于插件

1、例如Object.assign这样的方法,在IE下不行。那么就需要用插件

如这个插件:https://babeljs.io/docs/plugins/transform-runtime/

就可以让IE支持这个功能

或者

另外提一句,Babel默认情况下,是不能转换Set和Map等数据类型的,引自:

Babel 默认只转换新的 JavaScript 句法(syntax),而不转换新的 API,比如Iterator、Generator、Set、Maps、Proxy、Reflect、Symbol、Promise等全局对象,以及一些定义在全局对象上的方法(比如Object.assign)都不会转码。
举例来说,ES6在Array对象上新增了Array.from方法。Babel 就不会转码这个方法。如果想让这个方法运行,必须使用babel-polyfill,为当前环境提供一个垫片。

阮一峰

我自己实践测试来看:

  1. 必须引用babel-polyfill才能正常运行Set和Map类型(不然会报错);
  2. 引入的方法就是安装这个插件,然后import或者require他就行;
  3. 但单独js引入是不行的,需要利用webpack之类的打包(因为一般情况,浏览器是不支持直接跑js文件的require语法);
时间: 2024-09-22 12:18:58

es6(1)——Babel的相关文章

es6(2)——let和const

let 解释: 1. 简单来说,就是类似var,但使用该方法声明的变量,只在当前作用域生效: 几个特点: 1.let和var相比,不存在变量提升(即先使用后声明会报错): { console.log(a); //Uncaught ReferenceError: a is not defined let a = 1; } 2.使用let声明的变量,当前作用域里,该变量唯一. 即,假如在当前作用于的父级作用域里声明一个var a,在当前作用域里也声明一个let a,那么在当前作用域里,只有let声明

三十分钟熟悉es6(es6常用功能总结)

1.前注 关于es6的详细说明,可以参照我的系列文章es6 从入门到熟练,或者阮一峰的ECMAScript 6 入门. 我的系列文章,是在阮一峰的基础上,增加了更多适合初中级开发者的内容(包括大量的示例代码和解释),以降低学习难度,丰富说明. 本文是对es6整体的回顾,结合我的实际开发经验,对es6的一个小结. 为了精炼内容,es6里不常用的内容已经去掉,而对常用.重要的es6知识,附上简单的代码说明,并另附有详细说明的博文链接,方便初中级开发者理解. 2.开发环境 关键字:IE9.Babel.

[译]为什么在使用了类之后会使得组合变得愈发困难(软件编写)(第九部分)

本文讲的是[译]为什么在使用了类之后会使得组合变得愈发困难(软件编写)(第九部分), 原文地址:Why Composition is Harder with Classes 原文作者:Eric Elliott 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- 译者:yoyoyohamapi 校对者:sunui IridescentMia 注意:这是 "软件编写" 系列文章的第十部分,该系列主要阐述如何在 JavaScript ES6+ 中从零开始学习

[译] 新一代 JavaScript 的开发图谱(2017)

本文讲的是[译] 新一代 JavaScript 的开发图谱(2017), 原文地址:A Map To Modern JavaScript Development 原文作者:Santiago de León 译文出自:掘金翻译计划 译者:gy134340 校对者:IridescentMia,Tina92 过去 5 年里你一直使用 REST 接口.或者你一直在优化搜索公司里庞大的数据库.又或者你一直在给微波炉写嵌入式软件.自从你用 Prototype.js 来对浏览器进行面向对象编程已经过去很久了,

手把手教你webpack3(5)babel-loader详细使用说明

前注: 文档全文请查看 根目录的文档说明. 如果可以,请给本项目加[Star]和[Fork]持续关注. 有疑义请点击这里,发[Issues]. 5.1.babel-loader 这个用于将使用ES6规范的js代码,转为ES5. 首先安装一大堆东西,参照下面的命令,一共是4个(包括webpack) npm install --save babel-loader babel-core babel-preset-env webpack 创建babel规则文件.babelrc,内容设置为: { "pre

webpack3实战(5)打包一个多页、jQuery、图片转base64、压缩混淆、异步模块加载的项目

前注: 文档全文请查看 根目录的文档说明. 如果可以,请给本项目加[Star]和[Fork]持续关注. 有疑义请点击这里,发[Issues]. 实战项目示例目录 0.使用说明 安装: npm install 运行(注,这里不像之前用的 test ,而是改用了 build): npm run build 1.需求列表 基本需求: 引入jQuery(或其他类似库,之所以用 jQuery 是每个前端开发者都理应会 jQuery): 使用 less 作为 css 预处理器: 标准模块化开发: 有异步加载

node.js学习笔记(9) 和谐模式

众所周知,ECMAScript 是一种开放的.国际上广为接受的脚本语言规范. 它本身并不是一种脚本语言.正如在 Web 应用程序中执行有用操作的 bean 集合(例如,Netscape 的 AWT)是 Sun 的 JavaBean 规范的一种实现一样,JavaScript 是 ECMAScript 规范的一种实现. 2015年6月17日,ECMA国际发布了EcmaScript2015,即EcmaScript6(以下简称ES6)草案的正式版.ES6是继ES5之后的一次主要改进,语言规范由ES5.1

使用重构件(Codemod)加速 JavaScript 开发和重构

本文讲的是使用重构件(Codemod)加速 JavaScript 开发和重构, 使用重构件(Codemod)加速 JavaScript 开发 在花园里耕耘乐趣无穷,但如果除草不勤,最后收获可能是一团揪心.漏掉一次除草本身可能并无大碍,但积少成多最后会毁掉整座花园.没有杂草的花园让维护工作神清气爽.这个道理对代码库也类似. 我通常讨厌除草,经常忘记这事的结果就是一团糟.谢天谢地在编程界有像 ESLint 和 SCSS-Lint 这样的好东西提醒我们勤理代码.但是如果面对的是大段大段的历史代码,光是

Jason Miller: Preact: Into the void 0(译)

title: Preact:Into the void 0(译) date: 2017-09-04 19:00:00 tags: [Preact, JSX, 虚拟DOM, 性能] 本文整理自Jason Miller在JSConf上的talk.原视频地址: https://www.youtube.com/watch?v=LY6y3HbDVmg 开场白 嗨,大家好,我是Jason,Github上那个developit和推特上的_developit,是一系列库的作者(serial library au