We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
关于 Babel 介绍:https://github.com/jamiebuilds/babel-handbook/blob/master/translations/zh-Hans/user-handbook.md
Babel 运行方式:
工作流可以理解为:
输入字符串 => parser(@babel/parser) => AST => transformer(不同 plugins 转换代码) => AST => @babel/generator => 输出字符串
by Babel's core packages:https://babeljs.io/docs/en/core-packages
babel/core 做什么用?
babel/core
访问者模式
babel-register 做什么用?
babel-register
改写了 require 命令,并为它添加了一个钩子(Hook)。使用的时候只需要引入文件就可以运行,但是不适合在正式环境中使用。
require
例如创建 register.js 文件,添加如下代码:
register.js
require("babel-register"); require("./index.js");
就可以使用 register.js 来代替 node index.js 运行。
node index.js
$ node register.js
babel-cli
Babel 的 CLI 是一种在命令行下使用 Babel 编译文件的简单方法。
Babel 生成的 AST 是根据 Babel AST format,基于 estree 规范。这个规范定义了一个完整的 ecmascript 语法树,jsx、flow、typescript 在 estree 的规范下做了一些特有的扩充。
关于 AST 树的详细定义 Babel 有文档
https://babeljs.io/docs/en/babel-polyfill
babel-polyfill 这里肯定离不开一个开源库 core-js,它提供了 ES5、ES6 的 polyfill,包括:
处理这类方法的方案则被称为 polyfill。
babel-polyfill 的缺点:
babel-polyfill
babel-plugin-transform-runtime
babel-runtime 是由 Babel 提供的 polyfill 库,它本身就是由 core-js 与 regenerator-runtime 库组成,除了做简单的合并与映射外,并没有做任何额外的加工。
为了解决每个定义方法的文件,重复插入了一段相同的代码,造成的浪费。
比如安装了:
$ npm install --save-dev babel-plugin-transform-runtime $ npm install --save babel-runtime
Babel 会把这样的代码:
class Foo { method() {} }
翻译成:
import _classCallCheck from "babel-runtime/helpers/classCallCheck"; import _createClass from "babel-runtime/helpers/createClass"; let Foo = (function () { function Foo() { _classCallCheck(this, Foo); } _createClass(Foo, [ { key: "method", value: function method() {}, }, ]); return Foo; })();
这样就不用把 _classCallCheck 和 _createClass 这类方法放进每一个需要的文件里去了。
_classCallCheck
_createClass
Q:Babel 只编译语法不编译 API? A:Babel 是处于构建时,转义后的结果在默认情况下不包括 ES6 对运行时的扩展。内置对象、内置类型的原型扩展(例如 ES6 对 Array、Object)等都不包括在内,如果使用了 babel-runtime、babel-plugin-transform-runtime、babel-polyfill 就间接引入了 core-js 标准库。
babel-runtime
Q:regenerator 运行时库? A:用来实现 ES6/ES7 中 generators、yield、async 及 await 等相关的 polyfills。在 babel-runtime 中被引用。
Q:Babel v6 和 Babel v7 的区别? A:如下
-transform
-propoal
详细参考:
Q:Plugin 插件是如何工作的? A:了解 Babel 工作流就好理解插件是干嘛的了,@babel/core 加 Plugin,Babel 会按照插件定义的顺序来访问应用的方法。
@babel/core
Q:整个体系执行顺序是怎样的? A:Plugin(从前向后执行) > Preset(从后向前执行),Preset 的逆向顺序主要是为了保证向后兼容。babel 工作流前面提到了。
详细可以查看:https://github.com/iiuhuy/learning/blob/master/docs/babel/babel.md
The text was updated successfully, but these errors were encountered:
No branches or pull requests
Babel
Babel 运行方式:
工作流可以理解为:
Babel 核心模块
babel/core
做什么用?访问者模式
应用插件对 AST 进行转换;babel-register
做什么用?改写了
require
命令,并为它添加了一个钩子(Hook)。使用的时候只需要引入文件就可以运行,但是不适合在正式环境中使用。例如创建
register.js
文件,添加如下代码:就可以使用
register.js
来代替node index.js
运行。babel-cli
Babel 的 CLI 是一种在命令行下使用 Babel 编译文件的简单方法。
Babel 生成的 AST 是根据 Babel AST format,基于 estree 规范。这个规范定义了一个完整的 ecmascript 语法树,jsx、flow、typescript 在 estree 的规范下做了一些特有的扩充。
关于 AST 树的详细定义 Babel 有文档
babel-polyfill
babel-polyfill 这里肯定离不开一个开源库 core-js,它提供了 ES5、ES6 的 polyfill,包括:
处理这类方法的方案则被称为 polyfill。
babel-polyfill
的缺点:babel-polyfill
会造成全局污染,给一些类的原型链上做了修改,所以会倾向于使用babel-plugin-transform-runtime
babel-runtime
babel-runtime 是由 Babel 提供的 polyfill 库,它本身就是由 core-js 与 regenerator-runtime 库组成,除了做简单的合并与映射外,并没有做任何额外的加工。
babel-plugin-transform-runtime
为了解决每个定义方法的文件,重复插入了一段相同的代码,造成的浪费。
比如安装了:
Babel 会把这样的代码:
翻译成:
这样就不用把
_classCallCheck
和_createClass
这类方法放进每一个需要的文件里去了。一些问题
Q:Babel 只编译语法不编译 API?
A:Babel 是处于构建时,转义后的结果在默认情况下不包括 ES6 对运行时的扩展。内置对象、内置类型的原型扩展(例如 ES6 对 Array、Object)等都不包括在内,如果使用了
babel-runtime
、babel-plugin-transform-runtime
、babel-polyfill
就间接引入了 core-js 标准库。Q:regenerator 运行时库?
A:用来实现 ES6/ES7 中 generators、yield、async 及 await 等相关的 polyfills。在 babel-runtime 中被引用。
Q:Babel v6 和 Babel v7 的区别?
A:如下
-transform
都换成了-propoal
,这样可以更好的区分出一个提议是否为 javascript 官方的。例如:详细参考:
Q:Plugin 插件是如何工作的?
A:了解 Babel 工作流就好理解插件是干嘛的了,
@babel/core
加 Plugin,Babel 会按照插件定义的顺序来访问应用的方法。Q:整个体系执行顺序是怎样的?
A:Plugin(从前向后执行) > Preset(从后向前执行),Preset 的逆向顺序主要是为了保证向后兼容。babel 工作流前面提到了。
The text was updated successfully, but these errors were encountered: