当前位置: 首页 > news >正文

babel使用及其底层原理介绍

Babel 是一个工具链,主要用于将采用 ECMAScript 2015+ 语法编写的代码转换为向后兼容的 JavaScript 语法,以便能够运行在当前和旧版本的浏览器或其他环境中。

日常使用

作用

  1. 语法转化,将es6+语法转化为es5
  2. Polyfill支持是指通过代码模拟实现旧版浏览器或环境中缺失的现代JavaScript API的技术手段
  3. 将jsx语法转化为js

使用

npm i @babel/cli@^7.27.2 @babel/core@^7.27.1

1.在src新建index.js

const add = (a, b) => {return a + b;
};

2.添加箭头函数转化插件

npm i @babel/plugin-transform-arrow-functions@^7.27.1

 3.packjson.js

 "scripts": {"build": "babel src -d dist"},

4.babel.config.js


module.exports = {plugins:['@babel/plugin-transform-arrow-functions']
};

5.执行命令npm run build

则可以在dist下面得到

babel提供了大量的插件,但是这样每个语法转化都要下载对应的插件很麻烦,所以babel提供了@babel/preset-env,这个预设集成了很多插件只需要安装这个就可以了,下面是关于babel预设的介绍

1. vue-cli创建的项目可以直接使用@vue/cli-plugin-babel

npm i @vue/cli-plugin-babel@~4.5.0
module.exports = {presets: ['@vue/cli-plugin-babel/preset']
}

2.基础通用版

npm install --save-dev @babel/preset-env
module.exports = {presets: [['@babel/preset-env', { targets: { node: 'current' } }]],plugins: ['@vue/babel-plugin-jsx'],
};

   解释:

  1. presets 配置项
    预设(presets)是一组预定义的插件集合,用于处理特定场景的转译需求。

    • @babel/preset-env 是一个智能预设,能根据目标环境(浏览器或 Node.js)自动确定需要转译的语法特性。
    • { targets: { node: 'current' } } 表示转译后的代码要兼容当前运行的 Node.js 版本,不需要额外兼容更旧的 Node 版本。
  2. plugins 配置项
    插件(plugins)用于处理特定的语法扩展或转译需求。

    • @vue/babel-plugin-jsx 是 Vue 官方提供的 Babel 插件,用于支持在 Vue 项目中使用 JSX 语法(类似 React 的 JSX 写法),让开发者可以用更灵活的方式编写 Vue 组件。

@vue/cli-plugin-babel/preset和@babel/preset-env区别

特性@vue/cli-plugin-babel/preset@babel/preset-env
本质Vue CLI 专用预设(基于 @babel/preset-env 扩展)基础通用预设(无框架依赖)
适用项目Vue CLI 创建的 Vue 项目所有 JS 项目(无框架限制)
包含内容内置 @babel/preset-env + Vue 专属配置仅核心 JS 语法转译逻辑
配置复杂度低(自动集成 Vue CLI 配置)高(需手动配置 targets 等参数)

    babel.config.json和babel.config.js区别

    当你的 Babel 配置简单、固定且无动态逻辑时,适合用 babel.config.json

    // babel.config.json
    {"presets": ["@babel/preset-env"],"plugins": ["@babel/plugin-proposal-class-properties"]
    }

    当你的配置需要动态逻辑或复杂处理时,必须用 babel.config.js(因为 JSON 不支持代码逻辑)

    // babel.config.js
    module.exports = (api) => {// 判断当前环境(开发/生产)const isProduction = api.env('production');return {presets: [['@babel/preset-env',{// 生产环境兼容更多旧浏览器,开发环境只兼容最新浏览器targets: isProduction ? '>0.25%, not dead' : 'last 1 chrome version'}]]};
    };

    解释

    • 当 isProduction 为 false(开发环境)时,targets 设为 'last 1 chrome version'

      • 表示只需要兼容「最新版本的 Chrome 浏览器」。
      • 开发环境不需要兼容太多旧浏览器,这样可以减少转译工作量,加快开发时的编译速度。

    深入理解

    babel底层原理

    babel是核心通过解析 - 遍历转换 - 生成三个步骤实现的,通过parser解析成ast抽象语法树,然后通过traverse遍历转化,最后通过generator生成将ast转化回代码

    npm i  @babel/generator@^7.28.3 @babel/parser@^7.28.3 @babel/traverse@^7.28.3 

    packjson.json

     "scripts": {"build": "node index.js"},

    src/index.js

    const a=1
    const b=2

    index.js

    import parser from "@babel/parser";
    import traverse from "@babel/traverse";
    import generator from "@babel/generator";import fs from "node:fs";if (!fs.existsSync("./dist")) {fs.mkdirSync("./dist");
    }
    const codePath = "./src/index.js";
    const destPath = "./dist/index.js";const code = fs.readFileSync(codePath, {encoding: "utf-8",
    });// babel底层 先语法解析 生成ast(抽象语法树),然后遍历ast,按照一定规则查找需要转化的节点 最后生成解析代码// 1. 语法解析
    const ast = parser.parse(code);
    // console.log("ast", ast);// 2.游历ast
    //  访问者模式
    const visitor = {VariableDeclaration(path) {if (path.node.kind === "const" || path.node.kind === "let") {path.node.kind = "var";}},
    };traverse.default(ast, visitor);// // 3. 生成代码
    const result = generator.default(ast, {}, code);
    console.log("result", result.code);fs.writeFileSync(destPath, result.code);
    

    http://www.dtcms.com/a/352518.html

    相关文章:

  1. Java 集合笔记
  2. 第二章 进程与线程
  3. 简明 | Yolo-v3结构理解摘要
  4. Python-机器学习概述
  5. ruoyi-vue(十二)——定时任务,缓存监控,服务监控以及系统接口
  6. Python 轻量级的 ORM(对象关系映射)框架 - Peewee 入门教程
  7. CentOS 7 升级 OpenSSH 10.0p2 完整教程(含 Telnet 备份)
  8. 性能瓶颈定位更快更准:ARMS 持续剖析能力升级解析
  9. 告别繁琐运维,拥抱自动化:EKS Auto Mode 实战指南
  10. C代码学习笔记(二)
  11. RK3506 开发板:嵌入式技术赋能多行业转型升级
  12. 大数据时代UI前端的智能化升级路径:基于用户行为数据的预测性分析
  13. PMP项目管理知识点-⑨项⽬资源管理
  14. 大模型应用编排工具Dify之插件探索
  15. 【LeetCode - 每日1题】求对角线最长矩形的面积
  16. Claude 的优势深度解析:大模型竞争格局中的隐藏护城河
  17. NX773HSA19美光固态闪存D8BJND8BJQ
  18. inline内联函数
  19. TensorFlow 深度学习:使用 feature_column 训练心脏病分类模型
  20. 【软考论文】论可观测性架构技术的应用
  21. 【资源】Github资源整理
  22. C6.3:发射结交流电阻
  23. Vue3 + Element Plus实现表格多行文本截断与智能Tooltip提示
  24. 【黑客技术零基础入门】2025最新黑客工具软件大全,零基础入门到精通,收藏这篇就够了!
  25. 【数据结构】单链表详解
  26. Java基础 8.26
  27. 【7】SQL 语句基础应用
  28. 基于SpringBoot的演唱会网上订票系统的设计与实现(代码+数据库+LW)
  29. 自由学习记录(89)
  30. 一份兼容多端的HTML邮件模板实践与详解