了解babel的作用、原理、基本使用,为什么有babel,以及在webpack中的babel-loader

news2024/9/24 13:22:35

一、为什么有babel?

babel是一个工具链,如今大多数的浏览器都支持es6+的语法和特性,但难免有些旧版本的浏览器是不支持的,为了兼容这些旧版本的浏览器,有了babel这一个 JavaScript 编译器。它能为我们做一些事情:对更高级的语法进行转换,引入第三方 polyfill 模块,对旧版本浏览器不支持的特性打补丁(补充缺失的功能)。

二、基本使用

1.命令行使用

安装以下包:

npm install @babel/cli @babel/core

运行此命令将 src 目录下的所有代码编译到 dist目录:

./node_modules/.bin/babel src --out-dir dist

也可以利用 npm@5.2.0 所自带的 npm 包运行器将 ./node_modules/.bin/babel 命令缩短为 npx babel

npx babel src --out-dir dist

 babel将src目录下的文件都进行转换,并将转换后的代码输出到dist文件夹中。但这时候其实转换前和转换后的代码并无区别。原因是我们没有声明对指定的代码进行怎么样的转换,所以需要用到插件。


2.插件的使用 

插件是小型的 JavaScript 程序,用于指导 Babel 如何对代码进行转换。例如我们需要将ES6+的代码转为ES5的,那么需要用到@babel/plugin-transform-arrow-functions插件

npm install --save-dev @babel/plugin-transform-arrow-functions

npx babel src --out-dir dist --plugins=@babel/plugin-transform-arrow-functions,@babel/plugin-transform-block-scoping

转换前和转换后的效果:

// 转换前
const fnc = () => console.log('箭头函数')

// 转换后
var fnc = function fnc() {
  console.log('箭头函数')
}

3.预设preset的使用

对于上面的语法转换,我们要针对指定代码进行转换,可能需要用到多个插件,如果转换的过多,需要一个个添加,无疑是非常麻烦的。针对这一弊端我们可以使用预设(即一组预先设定的插件)

对于上面的例子,我们只需安装@babel/preset-env包,就可以实现代码转换

npm install @babel/preset-env -D

npx babel src --out-dir dist --presets=@babel/preset-env

4.Babel的配置文件

我们可以将babel的配置 信息放 到一个独立的文件中,有两种编写方式:
  • babel.config.json(或者.js,.cjs,.mjs)文件;
  • .babelrc.json(或者.babelrc,.js,.cjs,.mjs)文件;

这两种方式的区别:

  • .babelrc.json:早期使用较多的配置方式,但是对于配置Monorepos项目是比较麻的;
  • babel . config .j son(babel 7 ):可以直接作用于Monorepos项目的 包, 更加推荐
module.exports = {
  presets: [
    ["@babel/preset-env", {
      targets: "last 2 version"
    }]
  ]
}

5.polyfill的使用

如果我们使用了ES6的一些语法特性(例如Promise, Generator, Symbol),但是这些特性是新增的,我们可以使用polyfill来填充或者说打一个补丁,那么就会包含该特性了。

官网的一段描述, Babel 7.4.0 版本以上的我们使用@babel/core或@babel/plugin-transform-regenerator包,不再使用@babel/polyfill包。

babel7.4.0之后,可以通过单独引入core-js和regenerator-runtime来完成polyfill的使用
npm install core-js regenerator-runtime --save
我们需要在babel.config.js文件中进行配置,给preset-env配置一些属性:
配置之前,我们需要安装@babel/runtime-corejs3
npm install --save @babel/runtime-corejs3
module.exports = {
  presets: [
    ["@babel/preset-env", {
      useBuiltIns: "fasle",
      corejs: 3
    }]
  ]
}
  • useBuiltIns:设置以什么样的方式来使用polyfill,该属性有三个常见值
  1. false打包后的文件不使用polyfill来进行适配,且这个时候是不需要设置corejs属性的.
  2. usage会根据源代码中出现的语言特性,自动检测所需要的polyfill,这样可以确保最终包里的polyfill数量的最小化,打包的包相对会小一些,可以设置corejs属性来确定使用的corejs的版本。
  3. entry如果我们依赖一个库本身使用了某些polyfill的特性,但是因为我们使用的是usage,所以后用户浏览器可能会报错,如果担心这类问题,我们可以使用entry,这样根据browserslist目标导入所有的polyfill,但是对的包会变大。注意,我们需要在入口文件中导入两个包
import 'core-js/stable'; 
import 'regenerator-runtime/runtime';
  • corejs:设置corejs的版本,目前使用较多的是3.x的版本

三、babel在webpack中的使用

在实际开发中,我们通常会在构建工具中通过配置babel来对其进行使用的,比如在webpack中。
npm install babel-loader @babel/core

 在webpack.config.js配置文件中配置

{
  test: /\.js$/,
    use:{
      loader: "babel-loader",
      options: {
        presets: [
          "babel/preset-env"
        ]
      }
    }
}

这时有个问题,我们打包项目后部署到浏览器上运行,那我们怎么知道需要转换到什么程度呢?

有两种解决方法:

  • targets属性
{
  test: /\.js$/,
    use:{
      loader: "babel-loader",
      options: {
        presets: [
          "babel/preset-env",
          {
            targets: "last 2 version"
          }
        ]
      }
    }
}
  • browserslist工具
在根目录上创建 ".browserslistrc " 文件
"1%"
"last 2 versions"
"not dead"

如果两个同时配置了,targets属性会覆盖browserslist,但是在开发中,更推荐通过browserslist来配置,因为类似于postcss工具,也会使用browserslist,进行统一浏览器的适配。

四、babel的执行原理

Babel 有编 器的工作 程:
  • 析阶段(Parsing)
  • 转换 阶段 (Transformation)
  • 阶段 (Code G eneration)

简单的执行流程:

转换前的源码 -> 词法分析(将代码中的单词拆分) -> 形成tokens数组 -> 语法分析(解析关键字)-> AST抽象语法树 -> 遍历树结构 -> 访问关键字 -> 应用插件(Plugin)-> 形成新的语法树 ->转换后的源码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1996319.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux中针对文件权限的解析

1.文件权限详细解析: -rw-r--r--. 1 root root 114 4月 10 16:32 100.txt 1)-rw-r--r--. 总共11位 第一个“-”和最后一个“.”不用去管,剩下 rw- r-- r-- 属主 属组 其他人 u g o 第一个是“-”表示普通文件 第一个是“d”表示文件目录 …

从BEVDET来学习如何生成trt以及如何去写这些C++内容

0. 简介 对于深度学习而言,通过模型加速来嵌入进C是非常有意义的,因为本身训练出来的pt文件其实效率比较低下,所以这里我们将以BEVDET作为例子,来向读者展示如何去生成trt,并完善engine加速。这里最近受到优刻得的使用…

autoX.js

一. 概述 AutoX.js 使用 JavaScript 作为脚本语言,目前使用 Rhino 1.7.13 作为脚本引擎,支持 ES5 与部分 ES6 特性。 下载地址: https://github.com/kkevsekk1/AutoX/releases 官方文档: AutoX.js 二. 用法 1. 首先在官网下…

如何快速从文本中找到需要的信息,字典和正则灵活运用

import re #打开文本文件 f open("stock_data.txt",encoding"utf-8") #单独读取第一行数据处理进行分割,末尾换行符去掉 headers f.readline().strip().split(,) print(headers) #定义一个字典,以股标代码做为KEY,每个行做为值 st…

嵌入式学习day14(shell脚本)

一丶概念 shell脚本的本质:shell命令的有序集合 shell既是应用程序又是脚本语言,并且是解释型语言,不需要编译,解释一条执行一条。 shell脚本编程:将shell命令结合一些按照一定逻辑集合到一起,写一个.sh文件…

springboot项目配置https证书

前言 springboot项目直接http访问不安全,如何开启https? 如何配置ssl 创建证书 注意:如果你有CA办法的数字证书,可以使用直接使用CA颁发的证书。非可信CA或者私人颁发的证书在浏览器地址栏会显示红色,不安全不受信任。 如果你没…

Mac/iPhone邮件APP绑定武大邮箱

Mac/iPhone邮件APP绑定武大邮箱 一、准备工作二、新增一个互联网账户三、设置收件箱和发件箱服务器 一、准备工作 武大邮箱账户,确保你知道自己的邮箱登陆密码。 下面的步骤是在Mac上操作,iPhone上的设置也是一样的,主要是收件箱和发件箱服…

DC-4 打靶渗透

一、信息收集 1、查看靶机MAC地址: 2、查看靶机的ip地址: nmap 192.168.13.0/24 3、查看靶机开放的端口: nmap -p- -sC -sT -sV -A 192.168.13.161 4、访问靶机的80端口: 5、扫描目录: dirsearch -u "http://192…

Redis远程字典服务器(3)——常用数据结构和单线程模型

目录 一,常用数据结构 1.0 前言 1.1 string 1.2 hash 1.3 list 1.4 set 1.5 zset 1.6 演示 二,关于单线程模型 2.1 关于Redis的单线程 2.2 Redis为什么快 一,常用数据结构 1.0 前言 Redis是采用键值对的方式来存储数据的&#…

pixel 3a 刷机和root 流程

1、下载镜像文件 官方下载出厂镜像刷入 或者直接下载手机本身自带的镜像。 下载地址:https://developers.google.com/android/images 找到对应手机的版本,可以通过指令 adb shell getprop 找到 [ro.bootimage.build.fingerprint]: [google/sargo/sargo:1…

代码随想录算法训练营第九天|151.翻转字符串里的单词 卡码网:55.右旋转字符串

LeetCode 151 翻转字符串里的单词 题目: 给你一个字符串 s ,请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意…

超声波眼镜清洗机哪个品牌比较好用?四大高赞耐用单品全面测评

随着大家对健康卫生的关注不断提升,超声波清洗机逐渐受到佩戴眼镜人士的青睐。超声波清洗机是一种既方便又高效的智能清洁工具。它利用超声波技术,通过在眼镜表面产生高频振动,将污垢和油脂彻底分离,从而实现卓越的清洁效果。下面…

基于PSO-LSTM的多变量多特征数据分类预测

一、数据集 数据特征:12个多分类:4分类 二、PSO-LSTM网络 PSO-LSTM 网络是一种结合粒子群优化算法(Particle Swarm Optimization, PSO)和长短期记忆网络(Long Short-Term Memory, LSTM)的混合模型。它将 …

好领导都会用三招管好下属!

管不住人,你就当不好官,高明领导管人就靠这3大秘诀! 秘诀一:敢于亮剑 身为领导,,有时候需要有勇气面对挑战和问题,勇于做出决策,拿出魄力,勇于亮剑,向一切宣…

【HarmonyOS NEXT星河版开发学习】小型测试案例11-购物车数字框

个人主页→VON 收录专栏→鸿蒙开发小型案例总结​​​​​ 基础语法部分会发布于github 和 gitee上面(暂未发布) 前言 经过一周的学习,我发现还是进行拆分讲解效果会比较好,因为鸿蒙和前端十分的相识。主要就是表达的方式不同罢了…

2024年高教社杯全国大学生数学建模竞赛报名第一次通知!建议收藏!预测类模型及应用场景汇总

对于数学建模而言,算法模型选的对,文章写的顺~其中预测类模型是数模中常用的模型之一,通过预测模型,我们可以对未来的趋势和事件进行合理推测。今天,数模0error给大家汇总一下预测类模型及其应用场景,供大家参考,小伙伴们码住! 2024年高教社杯全大学生数学建模竞赛通知…

docker学习初体验

docker学习初体验 docker是什么 docker 包括三个基本概念: 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 roo…

四款口碑比较好充电宝排名,哪些性价比高?适合入手充电宝推荐

2024年快到下旬了,市场上的充电宝价格也是差不多都沉淀起来了。所以就性价比高的充电宝的入手时间来说,那确实是年底左右的时间挑选入手会比较好一点。而挑选性价比高的充电宝类型呢,那说充电宝,我个人其实也有入手过不少品牌的充…

晶体振荡器的频率容差与温度稳定性

晶体振荡器作为电子设备中不可或缺的频率源,其频率的准确性与稳定性至关重要。本文旨在阐述晶体振荡器的频率容差与温度稳定性的定义、测量单位及其在实际应用中的重要性。 一、频率容差定义及测量单位 频率容差是指晶体振荡器在特定条件下(通常是25C的…

mysql 监控开始时间,结束时间,平均取n个时间点

需求 最近1小时 1分钟 60个点 最近3小时 5分钟 36个点 最近6小时 10分钟 36个点 最近12小时 20分钟 36个点 最近1天 1小时 24个点 最近3天 3小时 24个点 最近1周 6小时 28个点 如果你的递归查询支持递归CTE(如MySQL 8.0),可以使用递归查询来…