babel 是一个广泛的转码器, 可以把 es6/7 等最新语法转换成 es5 语法, 让浏览器兼容
babel的配置文件 .babelrc 主要有两个配置:
babel是如何把 es6代码转换成 es5代码的?
babel将es6代码转换成es5,主要有三个阶段;
注意事项:babel默认不转换的代码需要通过安装babelpolyfill来支持,比如 :
如何写一个babel插件?
实现流程
补充
补充:Babel 是一个 JavaScript 编译器(又称 transpiler),主要用于把 ES6+ / TypeScript / JSX 等新语法转换为浏览器或 Node.js 兼容的旧语法。其配置文件通常是
.babelrc、babel.config.js或package.json中的babel字段,主要由两部分组成:
- presets(一组插件):如
@babel/preset-env(按目标环境按需转换 ES 语法)、@babel/preset-react(JSX)、@babel/preset-typescript。- plugins(具体功能):如
@babel/plugin-transform-runtime(减少辅助函数重复)、@babel/plugin-proposal-optional-chaining(可选链)。Babel 工作流程:
parse→transform→generate,即先把源码解析成 AST(@babel/parser),再通过插件遍历 AST(@babel/traverse)进行节点改写,最后由@babel/generator输出新代码。Polyfill:Babel 只能转换语法,遇到
Promise、Array.from等新 API 还需要 polyfill(core-js+regenerator-runtime);现代做法是用@babel/preset-env配合useBuiltIns: "usage"自动按需引入。手写一个 Babel 插件(把源码里所有
console.log替换成console.warn):module.exports = function ({ types: t }) { return { visitor: { CallExpression(path) { const callee = path.node.callee; if ( t.isMemberExpression(callee) && t.isIdentifier(callee.object, { name: 'console' }) && t.isIdentifier(callee.property, { name: 'log' }) ) { callee.property = t.identifier('warn'); } } } }; };把上述代码放到
babel.config.js或单独文件后,在plugins中引入即可在编译时生效。
来源整理自:我的有道云笔记



