Babel
我是从Babel开始搭建的,因为之前对这个鬼东西只存在于会用的阶段,但是具体里面更深入的东西确实没有去了解。借此机会,好好理解一下! 当然,最好的教材就是官网!不过我还是想看中文网
前言,你如果想要了解Babel的具体功能,建议去看看中文网,或者英文官网就行了,看之前就记住Babel就是一个翻译器,它可以将高版本的JS语法翻译成适合在低版本中运行的JS,当然,只限于Javascript。如果想要CSS也兼容一下,那么可以去看另一个Awesome的库:Postcss
目前我所涉及到的部分Babel库:
-
@babel/preset-env它是一个智能预设,它使您可以使用最新的
JavaScript,而无需微观管理目标环境所需的语法转换(以及可选的浏览器polyfill)。 这都使您的生活更轻松,JavaScript包更小! -
@babel/preset-typescript其中包含了@babel/plugin-transform-typescript,用于转化
ts文件的预设插件 -
@babel/plugin-transform-runtime允许重用Babel注入的帮助代码以节省编码的插件。其中如果
corejs指定了3(或2)的话,就需要额外安装另一个对应大版本的@babel/runtime-corejs3插件.同时我们需要安装另一个插件:@babel/runtime. -
@babel/plugin-syntax-dynamic-import动态导入的lib,使代码中能够使用
import()动态引入文件,但是貌似在IE11中有问题,因此就可以用babel-plugin-dynamic-import-polyfill代替一下,等官网有更好的决绝方案问题描述:
-
babel-plugin-dynamic-import-polyfill用于简便的处理
@babel/plugin-syntax-dynamic-import在IE11以下的BUG -
@babel/cli用于命令行执行babel转化的必要工具
-
@babel/corebabel核心代码,这是必须的,主要用于代码的转换,也可直接转化
Ast -
@babel/runtime-corejs3@babel/plugin-transform-runtime指定corejs:3时必须引入的库,否则会找不到这个包。 -
babel-loaderwebpack的加载器
-
@babel/polyfill这将模拟一个完整的ES2015 +环境(不包含第4阶段的提议),并且打算在应用程序中使用,而不是在库/工具中使用。 (使用babel-node时会自动加载此polyfill)。7.4.0之后貌似不推荐了。
-
如果在.babelrc中指定了useBuiltIns:'usage',则在webpack.config.js条目数组或源文件中都不包含@ babel / polyfill。 注意,仍需要安装@ babel / polyfill。
-
如果在.babelrc中指定了useBuiltIns:'entry',则如上所述,通过require或import在应用程序入口点的顶部包含@ babel / polyfill。
总之,必须要安装,或者用7.4.0推荐的用法可以不安装
浏览器的话可以直接接入CDN就行了,如下面这个:
-
-
@babel/runtime@babel/plugin-transform-runtime必须的lib
安装相关库
Babel
npm install --save-dev @babel/core @babel/cli @babel/preset-env
npm install --save-dev @babel/plugin-transform-runtime @babel/runtime
npm install --save-dev @babel/runtime-corejs3
npm install --save-dev babel-plugin-dynamic-import-polyfill
npm install --save @babel/polyfill
根目录的babel.config.json配置:
{
"presets": [
[
"@babel/preset-env",
{
"useBuiltIns": "usage",
"corejs": 3
}
],
[
"@babel/preset-typescript"
]
],
"plugins": [
[
"@babel/plugin-transform-runtime",
{
"corejs": 3
}
],
[
"babel-plugin-dynamic-import-polyfill"
]
]
}
新建一个Demo试验场
-
找到自己的一个目录,新建Demo文件,例如的我的是
babel-run-demo。 -
终端进入这个文件夹
-
执行
npm init -y -
打开
package.json,直接复制我的配置:{ "name": "babel-run-demo", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "start": "babel source --extensions .ts --out-dir dist" }, "keywords": [], "author": "", "license": "ISC", "devDependencies": { "@babel/cli": "^7.10.4", "@babel/core": "^7.10.4", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-transform-runtime": "^7.10.4", "@babel/preset-env": "^7.10.4", "@babel/preset-typescript": "^7.10.4", "@babel/runtime-corejs3": "^7.10.4", "babel-plugin-dynamic-import-polyfill": "^1.0.0", "@babel/polyfill": "^7.10.4", "@babel/runtime": "^7.10.4" } } -
执行
npm i,安装依赖 -
新建一个
babel.config.json配置文件(如果package.json中没有配置的话就会读取)配置如下:{ "presets": [ [ "@babel/preset-env", { "useBuiltIns": "usage", "corejs": 3 } ], [ "@babel/preset-typescript" ] ], "plugins": [ [ "@babel/plugin-transform-runtime", { "corejs": 3 } ], [ "babel-plugin-dynamic-import-polyfill" ] ] } -
新建一个
.browserslistrc文件,用于指定兼容哪些浏览器,如果在babel.config.json中@babel/preset-env没有配置target字段就会读取这里的配置。 -
根目录下新建目录
source,因为我在package.json中指定了只转换source中的文件。 -
随意建一个例如
main.ts的代码(或者js,都行)写点代码上去:const add = (a,b)=>{ return a+b; } new Promise(resolve => { setTimeout(() => { resolve(12234323) }, 2000); }).then(res=>{ console.log(123); }).catch(e=>{ console.log(e) }) console.log([1,2,5,3].includes(1)); console.log(process.env.NODE_ENV); export default { ab: 1332 } -
执行
npm start命令,完成之后就会在根目录下发现一个dist文件夹,其中便是转换过后的代码了。如main.js:"use strict"; var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault"); var _promise = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/promise")); var _interopRequireWildcard2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/interopRequireWildcard")); var _main = _interopRequireDefault(require("@/main")); var _axios = _interopRequireDefault(require("axios")); // import aba from "@/a" console.log(["asssssssssssssssssss"]); let ac = _promise.default.resolve().then(() => (0, _interopRequireWildcard2.default)(require("@/a"))); console.log(ac.then(r => console.log(r))); console.log(_main.default); // console.log(aba); console.log(_axios.default.defaults);
这个时候的代码只能用node执行,如果想在浏览器中执行必须要借助webpack或其他工具将导入的一起打包。如上,转化过后的代码引入了@babel/runtime-corejs3,因此这个包是必须的,如果你发现你转化后的代码没有这个引入,那么安不安装都无所谓。
最后附上Git仓库地址,点击这里
参考资料:
@babel/plugin-transform-runtime 到底是什么