学习babel的demo
学习babel的demo (babel 6.x)
var babel = require('babel-core')
var path = require('path')
var result = babel.transformFileSync(path.resolve(__dirname) + '/test.js', {
presets: ['env'],
plugins: ['transform-runtime']
})
通过命令行操作babel
babel-node babel-cli下面的一个命令行
node_modules/.bin/babel-node --presets react test.js
举个栗子,还是 node 中执行 jsx,要通过 babel 编译。我们可以把 jsx 的代码 a.js 编译完输出到一个 b.js,然后 node b.js 也是可以执行的。但是太麻烦,不利于开发。让我们看一下通过 register 怎么用:
// register.js 引入 babel-register,并配置。然后引入要执行代码的入口文件
require('babel-register')({ presets: ['react'] });
require('./test')
// test.js 这个文件是 jsx...
const React = require('react');
const elements = [1, 2, 3].map((item) => {
return (
<div>{item}</div>
)
});
console.log(elements);
// 执行
$ node register.js
babel编译的三步:
- (解析)parser:通过 babylon 解析成 AST。
- (转换)transform[s]:All the plugins/presets ,进一步的做语法等自定义的转译,仍然是 AST。
- (生成)generator: 最后通过 babel-generator 生成 output string。
所以plugins是在第二步加强转译的,
{
"plugins": [
["tranform-runtime", {
"helpers": true, // helpers 设为 false,就相当于没有启用 babel-plugin-external-helpers 的效果
"polyfill": true, // false表示不需要babel-runtime中的core-js 里面的 polyfill
"regenerator": true,
"moduleName": "babel-runtime" // moduleName 的话,就是用到的库,你可以把 babel-runtime 换成其他类似的。
}]
]
}
core-js 是用于 JavaScript 的组合式标准化库,它包含 es5 (e.g: object.freeze), es6的 promise,symbols, collections, iterators, typed arrays, es7+提案等等的 polyfills 实现。也就是说,它几乎包含了所有 JavaScript 最新标准的垫片。
babel-polyfill
transform-runtime 是利用 plugin 自动识别并替换代码中的新特性,你不需要再引入,只需要装好 babel-runtime 和 配好 plugin 就可以了。
presets 就是 plugins 的组合,你也可以理解为是套餐,主要有
{
"presets": ["env"]
}
{
"presets": [
["env", {
"targets": {
"browsers": ["last 2 versions", "safari >= 7"],
"node": "current"
},
"modules": true, //设置ES6 模块转译的模块格式 默认是 commonjs
"debug": true, // debug,编译的时候 console
"useBuiltIns": false, // 是否开启自动支持 polyfill
"include": [], // 总是启用哪些 plugins
"exclude": [] // 强制不启用哪些 plugins,用来防止某些插件被启用
}]
],
plugins: [
"transform-react-jsx" // 支持jsx
]
}
{
"presets": [
["env", {
"targets": {
"node": "6.10"
}
}]
]
}
开启debug后,编译结果会得到使用的 targets,plugins,polyfill 等信息
useBuiltIns
env 会自动根据我们的运行环境,去判断需要什么样的 polyfill,而且,打包后的代码体积也会大大减小,但是这一切都在使用 useBuiltIns,而且需要你安装 babel-polyfill,并 import。它会启用一个插件,替换你的import ‘babel-polyfill’,不是整个引入了,而是根据你配置的环境和个人需要单独的引入 polyfill。
.babelrc
配置
{
"presets": [
"env"
],
"plugins": [
["transform-runtime", {
"helpers": true,
"polyfill": true,
"regenerator": true,
"moduleName": "babel-runtime"
}]
]
}