babel兼容低版本游览器

news2024/11/25 20:34:29

文章目录

    • 1. webpack项目的搭建
    • 2. babel 命令行使用
    • 3. babel的预设与编译器流程
    • 4. babel项目中配置
      • 4.1 babel-loader与插件的使用
      • 4.2 `babel-preset`使用
    • 5. 游览器兼容性使用
      • 5.1 browserslist工具与编写规则
      • 5.2 browserslist配置
      • 5.3 优化babel的配置文件
    • 6. `polyfill`
      • 6.1 useBuiltIns属性设置

1. webpack项目的搭建

  1. npm init 初始化项目,并一路回车
│  └─ package.json
  1. webpack与webpack-cli 安装

    执行命令 npm i webpack webpack-cli -D

│  ├─ package.json
│  ├─ node_modules // webpack-cli创建
  1. 安装编译模板并配置入口和出口文件
  1. 安装编译模板 npm i html-webpack-plugin

项目结构

│     ├─ build 
│     │  ├─ build.js
│     │  └─ index.html
│     ├─ node_modules
│     └─ src
│        ├─ index.js | main.js
│     ├─ index.html // 入口文件
|     ├─ package.json
|     ├─ webpack.config.js	

  • 配置 webpack.config.js 新建入口文件index.js, 出口文件 build
const path = require('path')
// 模板编译
const HtmlWeabpckPlugin = require("html-webpack-plugin")
module.exports = {
	mode: 'development',
	devtool: false,   // 取消eval且不生成soucremap,代码清晰不转换
	entry: './src/index.js',
	output: {
		path: path.resolve(__dirname, './build'),
		filename: 'bundle.js',
		// 重新打包时, 先将之前打包的文件夹删除掉
		clean: true
	},
	resolve: {
		extensions: ['.js', '.json', '.wasm', '.jsx', '.ts']
	},
	module: {
	},
	plugins: [
		new HtmlWeabpckPlugin({
			template: "./index.html"
		})
	]
}
  • 修改package.json 打包命令
  "scripts": {
    "build":"webpack"
  },
  1. 配置webpack-dev-server 热更新

安装 npm i webpack-dev-server -D

修改package.json

 "scripts": {
    "build": "webpack",
    "serve": "webpack serve"
  },

2. babel 命令行使用

  • babel本身可以作为一个独立的工具(和postcss一样),不和webpack等构建工具配置来单独使用
  • 如果要在命令行尝试使用babel,需要安装库
    • @babel/core:babel的核心代码,必须安装;
    • @babel/cli:可以让我们在命令行使用babel;
 安装 npm install @babel/cli @babel/core
  1. 使用babel来处理写的ES6代码
   src:是源文件的目录;
   --out-dir:指定要输出的文件夹dist;
   npx babel src --out-dir dist
  • 执行 npx babel ./src/index.js --out-dir dist

会发现代码输出到dist 文件夹了,但是并没有进行降级

在这里插入图片描述

  • 上述代码没有降级是因为babel在这里只进行了抽象语法解析
  • 如果要想对代码进行降级必须使用插件 plugin

安装插件 npm install @babel/plugin-transform-block-scoping -D

  • 在执行命令 npx babel ./src/index.js --out-dir dist --plugins=@babel/plugin-transform-block-scoping
  • 这时就会把es6 代码中的const 转换为var
    在这里插入图片描述

3. babel的预设与编译器流程

  • 上面代码中可以实现es6转es5 ,但是要转换的内容过多,一个个设置是比较麻烦的,这时就可以使用预设(preset)
  1. 安装 npm install @babel/preset-env -D
  2. 使用 npx babel ./src/index.js --out-dir dist --presets=@babel/preset-env
  • 代码中的转换并自动开启严格模式
    在这里插入图片描述
  • babel的底层原理解析 github解析

4. babel项目中配置

4.1 babel-loader与插件的使用

  • 在实际开发中,我们通常会在构建工具中通过配置babel来对其进行使用的,比如在webpack中。
  1. 安装依赖 npm install babel-loader @babel/core
  2. 在webpack中配置与指定插件
  • 添加配置
module: {
		rules: [
			{
				test: /\.m?js$/,
				use: {
					loader: "babel-loader",
					options:{
						plugins: [
							"@babel/plugin-transform-block-scoping",
						]
					}
				}
			}]
	},

在这里插入图片描述

4.2 babel-preset使用

  • 上述代码中单独配置太麻烦了,可以直接给webpack提供一个presetwebpack会根据我们的预设来加载对应的插件列表,并且将其传递给babel
  • 安装 npm install @babel/preset-env

  • 修改plugin中的配置
	rules: [
			{
				test: /\.m?js$/,
				use: {
					loader: "babel-loader",
					options: {
						presets:[
							["@babel/preset-env"]
						]
					}
				}
			}]

5. 游览器兼容性使用

  • 代码的要不要转换取决于适配的游览器
  • bowserlistrc 文件解析
    在这里插入图片描述
> 0.05%   表示现在使用的游览器市场占有率   (这里默认值是0.5%, 0.1%可兼容谷歌游览器79 )
last 2 versions     表示最近的两个版本
not dead     //表示最近24个月浏览器是否进行更新
  • 使用命令 npx browserslist 可查看兼容的浏览器
  • 游览器市场占有率 : 使用的游览器占有率

5.1 browserslist工具与编写规则

  • browserslist工具可以在css兼容性和js兼容性下共享我们配置的兼容性条件
  • 当设置了一个条件: > 1%;的意思是css要兼容市场占有率大于1%的浏览器,js也要兼容市场占有率大于1%的浏览器
  • Browserslist是一个在不同的前端工具之间,共享目标浏览器和Node.js版本的配置
    • Autoprefixer
    • babel
    • postcss-normalize
  • 编写规则
    在这里插入图片描述
    在这里插入图片描述
  • 命令行使用browserslist

npx browserslist ">1%, last 2 version, not dead"

5.2 browserslist配置

  1. 可以在package.json配置
  2. .browserslistrc文件中配置
> 5%
last 2 versions
not dead

在这里插入图片描述

  • 多个配置的条件关系
    在这里插入图片描述
  • 注意多个游览器兼容配置生效规则
  • 在这里配置的target 会直接覆盖掉browserslistrc文件的配置
		rules: [
			{
				test: /\.m?js$/,
				use: {
					loader: "babel-loader",
					options: {
						presets: [
							["@babel/preset-env",{
								targets: ">5%"
							}]
						]
					}
				}
			}]

5.3 优化babel的配置文件

  • 现在的项目是将babel的配置信息放到一个独立的文件中,babel给我们提供了两种配置文件的编写:

    • babel.config.json(或者.js,.cjs,.mjs)文件;
    • babelrc.json(或者.babelrc,.js,.cjs,.mjs)文件;
  • 它们两个有什么区别呢?目前很多的项目都采用了多包管理的方式(babel本身、element-plus、umi等)

    • .babelrc.json:早期使用较多的配置方式,但是对于配置Monorepos项目是比较麻烦的
    • babel.config.json(babel7):可以直接作用于Monorepos项目的子包,更加推荐;
  • json与js的文件配置只是写法不同而已,功能一致
module.exports = {
	presets: [
		["@babel/preset-env", {
		}
		]
	]
}

6. polyfill

  • polyfill 其实就是给代码打一个补丁,可以帮助我们更好的使用JavaScript;
  • 为什么时候会用到polyfill呢?
    • 比如我们使用了一些语法特性(例如:Promise, Generator, Symbol等以及实例方法例如Array.prototype.includes等
    • 但是某些浏览器压根不认识这些特性,必然会报错;
      在这里插入图片描述

注意点babel7.4.0之前,可以使用 @babel/polyfill的包,但是该包现在已经不推荐使用了

  • babel7.4.0之后,可以通过单独引入core-js和regenerator-runtime来完成polyfill的使用:

npm install core-js regenerator-runtime --save

  1. 配置babel.config.js
    • useBuiltIns:设置以什么样的方式来使用polyfill;
    • corejs:设置corejs的版本,目前使用较多的是3.x的版本,比如我使用的是3.8.x的版本;
      • 另外corejs可以设置是否对提议阶段的特性进行支持;
      • 设置 proposals属性为true即可;

6.1 useBuiltIns属性设置

  1. fasle值 ,不设置默认值
    • 打包后的文件不使用polyfill来进行适配; 并且这个时候是不需要设置corejs属性的;
  2. usage
    • 会根据源代码中出现的语言特性,自动检测所需要的polyfill; 这样可以确保最终包里的polyfill数量的最小化,打包的包相对会小一些;
  • 不设置
    在这里插入图片描述
  • 设置
    在这里插入图片描述
  1. entry
    • 如果要依赖的某一个库本身使用了某些polyfill的特性,但是因为我们使用的是usage,所以之后用户浏览器可能会报错; 就可以使用 entry
// 入口文件引入
import 'core-js/stable';
import 'regenerator-runtime/runtime';
  • 完整配置
module.exports = {
	presets: [
		["@babel/preset-env", {
			// corejs:3,
			// useBuiltIns:false   // 默认值就是不使用polyfill
			// corejs:3,
			// useBuiltIns:"usage"   //自动检测需要的polyfill, 会把使用string的方法代码全部做个打包

			corejs: 3,
			useBuiltIns: "entry" // 解决 依赖的某一个库本身使用了某些polyfill的特性
			//  需要在入口文件中添加 `import 'core-js/stable'; import 'regenerator-runtime/runtime'
		}
		]
	]
}
  • 项目完整目录
│     ├─ build 
│     │  ├─ build.js
│     │  └─ index.html
|     ├─ dist 
│     ├─ node_modules
│     └─ src
│        ├─ index.js | main.js
│     ├─ index.html // 入口文件
|     ├─ package.json
|     ├─ webpack.config.js	
|     ├─.browserslistrc
|     ├─ babel.config.js

参考文章

  • coderwhy
  • jcat_李小黑
  • DevHappy
  • github browserslist
  • 附加,vue2项目升级到vue3项目执行打包时,build执行两遍
  • 项目地址

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

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

相关文章

会声会影 Corel VideoStudio Ultimate 2023 v26.0.0.136 旗舰版百度网盘免费下载

会声会影 Corel VideoStudio Ultimate 2023 v26.0.0.136 旗舰版是一款易于使用,初学者也可以轻使用的,可自定义的 3D 标题、新的面部效果、动画 AR 贴纸、GIF 和摄像机移动过渡,让您轻松、直观地制作最佳视频。探索高级编辑工具,如…

JavaWeb——垃圾回收

目录 一、垃圾回收定义 二、垃圾回收处理内存区域 三、垃圾标记 1、引用计数 (1)、定义 (2)、缺陷 2、可达性分析 (1)、定义 (2)、缺点 四、垃圾回收过程 1、标记清除 &…

SAP MM 创建双单位采购信息记录

SAP创建不同基本单位的信息记录 1、前台维护MM01 2、ME11维护信息记录 3、通过BAPIBDC实现:ME_INFORECORD_MAINTAIN_MULTIMEK1录屏 因为单独使用ME_INFORECORD_MAINTAIN_MULTI创建信息记录无法创建双单位,创建第一个单位时可以,第二个就会报…

企业邮箱的成本与收费:了解真相,合理选择

企业邮箱的成本对于希望迁移到云端的企业来说可能是一个问题。但这并不一定是必须的。企业邮箱对于今天的企业来说是必不可少的,因为它们提供必要的工具和服务来帮助您与客户、合作伙伴和商业社区保持联系。企业邮箱的收费贵不贵?成本高么? 对…

【Linux】进程间通信 -- 信号量

概念引入为什么要信号量?信号量操作接口1.申请信号量semget2.控制信号量semctl3.处理信号量semop IPC资源的组织方式 概念引入 信号量是什么? 本质是一个计数器,通常用来表示公共资源中,资源数量多少的问题 公共资源&#xff1a…

BUUCTF-JustEscape

目录 信息搜集 bypass 黑名单机制 绕过沙盒执行系统命令 总结 这是一道 Node.js 沙盒逃逸的题目&#xff0c;在此记录一些技巧。 信息搜集 进入题目环境&#xff1a; 直接给出了一个可执行任意代码的入口 /run.php?code<code>&#xff0c;直接复制第二个 demo 的路…

常见安装工具以及命令(工作常用)

dockermongodbnginxredis 1.docker 启动2.docker 安装 MongoDB3.启动nginx4.redis配置&#xff0b;安装4.1 Redis的启动和停止4.2 后台启动方式 1.docker 启动 安装docker # 1.安装gcc和g yum -y install gcc yum -y install gcc-c # 2. 安装需要的软件包 yum install -y yum…

DNS详细解析

文章目录 DNS是什么以及作用下载DNS服务named.conf DNS查询DNS缓存机制解析过程递归查询和迭代查询 DNS服务器的类型DNS域名DNS服务器的类型搭建dns服务器缓存域名服务器主域名服务器从域名服务器排错反向解析 CDN介绍 DNS转发介绍配置 DNS劫持 DNS 是什么以及作用 DNS&#…

WEB:Web_php_include(多解)

背景知识 文件包含 file://协议 php://协议 data://协议 了解strstr函数 题目 <?php show_source(__FILE__); echo $_GET[hello]; /*可以构造payload*/ $page$_GET[page]; while (strstr($page, "php://")) { /*strstr()函数*/$pagestr_replace("php://&q…

JavaSwing+MySQL的购物系统项目

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/88052733?spm1001.2014.3001.5503 JDK1.8 MySQL5.7 功能&#xff1a;管理员与用户两个角色&#xff0c;管理员可以对商品进行增删改查处理&#xff0c;用户可以浏览查找商品&#xff0c;注…

CROSSROADS1靶机复盘

CROSSROADS1靶机复盘 这个靶机学会了三个工具enum4linux&#xff0c;smbclient&#xff0c;stegoveritas。枚举服务器可能开启的一些资源&#xff0c;smb扫描工具&#xff0c;还有一个隐写术的工具。 靶场下载地址&#xff1a;https://download.vulnhub.com/crossroads/cross…

4.5.tensorRT基础(1)-onnx文件及其结构的学习,编辑修改onnx

目录 前言1. onnx1.1 导出onnx1.2 读取onnx1.3 创建onnx1.4 编辑onnx1.5 onnx总结1.6 本节知识点 2. 补充知识2.1 Protobuf2.1.1 Protobuf简介2.1.2 基本使用流程 总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记…

【Nacos】适配PostgreSQL数据库

目录 本文环境介绍修改application.properties下载PostgreSQL扩展插件初始化PostgreSQL启动测试 本文环境介绍 组件依赖版本Nacos2.2.3OpenJDK17.0.2PostgreSQL Server15 修改application.properties ### Deprecated configuration property, it is recommended to use spri…

手搓一台简单的网络损伤仪——弱网测试

1、介绍 支持对链路带宽、传输时延、丢包率和无码率的手动设置&#xff1b; 1.1、网络损伤仪在使用时&#xff0c;网络拓扑连接 1.2、网络损伤仪管理页面展示 2、使用的设备及相关技术栈 一台Intel 赛扬 J1900的迷你主机【拥有4个千兆网口】&#xff1b;ubuntu-18.04.5-live…

(数组与矩阵) 剑指 Offer 04. 二维数组中的查找 ——【Leetcode每日一题】

❓ 剑指 Offer 04. 二维数组中的查找 难度&#xff1a;中等 在一个 n * m 的二维数组中&#xff0c;每一行都按照从左到右 非递减 的顺序排序&#xff0c;每一列都按照从上到下 非递减 的顺序排序。请完成一个高效的函数&#xff0c;输入这样的一个二维数组和一个整数&#x…

使用Stable Diffusion和PyTorch创建艺术二维码

大家好&#xff0c;本文将介绍如何利用Stable Diffusion和PyTorch的能力来创建AI生成的QR码艺术。通过将这些技术相结合&#xff0c;可以生成独特的、具有视觉吸引力的艺术作品&#xff0c;其中包含QR码&#xff0c;为艺术作品增添了互动元素。 Stable Diffusion和PyTorch 稳…

赢得CSDN铁粉的秘诀!(记录写作三个月的点点滴滴)

在CSDN上写博客已经三个多月了&#xff0c;从开始的陌生到渐渐熟悉CSDN网站的每个角落&#xff0c;猛然发现还有这么一个活动&#xff0c;想了想还是写一篇博客吧&#xff0c;不仅是参加活动&#xff0c;也是记录这一路慢慢探索的过程。 1.CSDN铁粉介绍及说明 CSDN 是为中国 I…

C++进阶:map和set

map和set STL容器分为序列式容器和关联式容器。 序列式容器vector、list等底层为线性数据结构&#xff0c;数据元素之间没有联系&#xff0c;一般用来存储数据。关联式容器map、set等底层采用平衡搜索树&#xff0c;存储的是<key/value>式的键值对&#xff0c;数据检索效…

NOSQL简单实战

目录 实战一&#xff1a; 1、 string类型数据的命令操作&#xff1a; &#xff08;1&#xff09; 设置键值&#xff1a; &#xff08;2&#xff09; 读取键值&#xff1a; &#xff08;3&#xff09; 数值类型自增1&#xff1a; &#xff08;4&#xff09; 数值类型自减1&…

基于html2canvas和jspdf将document DOM节点转换为图片生成PDF文件,并下载到本地

这里要用到html2canvas将document DOM节点转换为图片&#xff0c;并下载到本地_你挚爱的强哥的博客-CSDN博客前端用原生js编辑文件内容→创建生成文件(格式可以自定义)→下载文件_你挚爱的强哥的博客-CSDN博客。会自动创建一个html文件。https://blog.csdn.net/qq_37860634/art…