babel兼容低版本游览器

这篇具有很好参考价值的文章主要介绍了babel兼容低版本游览器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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兼容低版本游览器,javascript,前端,vue.js

  • 上述代码没有降级是因为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
    babel兼容低版本游览器,javascript,前端,vue.js

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兼容低版本游览器,javascript,前端,vue.js
  • 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",
						]
					}
				}
			}]
	},

babel兼容低版本游览器,javascript,前端,vue.js

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 文件解析
    babel兼容低版本游览器,javascript,前端,vue.js
> 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
  • 编写规则
    babel兼容低版本游览器,javascript,前端,vue.js
    babel兼容低版本游览器,javascript,前端,vue.js
  • 命令行使用browserslist

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

5.2 browserslist配置

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

babel兼容低版本游览器,javascript,前端,vue.js

  • 多个配置的条件关系
    babel兼容低版本游览器,javascript,前端,vue.js
  • 注意多个游览器兼容配置生效规则
  • 在这里配置的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等
    • 但是某些浏览器压根不认识这些特性,必然会报错;
      babel兼容低版本游览器,javascript,前端,vue.js

注意点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数量的最小化,打包的包相对会小一些;
  • 不设置
    babel兼容低版本游览器,javascript,前端,vue.js
  • 设置
    babel兼容低版本游览器,javascript,前端,vue.js
  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执行两遍
  • 项目地址

7. babel对第三方插件的编译

7.1 react的支持

安装 npm i react react-dom

  • 编写jsx文件
import React, { memo } from 'react'
const app = memo(() => {
	return (
		<div>app</div>
	)
})
export default app
  • 导入react 与react-dom 并插件render 挂载App
  • 注意 要在 index.html 中创建类或者id标签
import React from 'react';
import ReactDom from 'react-dom/client';
import App from './react/app.jsx';

const Root = ReactDom.createRoot(document.querySelector('.root'))
Root.render(<App />)
  • 配置babel-loader
    babel兼容低版本游览器,javascript,前端,vue.js

  • react jsx代码进行处理解析插件:

    • @babel/plugin-syntax-jsx
    • @babel/plugin-transform-react-jsx
    • @babel/plugin-transform-react-display-name
  • 但是开发中,我们并不需要一个个去安装这些插件,直接使用preset来配置

npm install @babel/preset-react -D

module.exports = {
	presets: [
		["@babel/preset-env"],
		["@babel/preset-react"]
	]
}

7.2 TS的支持 ts-loader

  • 前言 我们可以通过TypeScript的compiler来转换成JavaScript:
npm install typescript -D
  • 另外TypeScript的编译配置信息我们通常会编写一个tsconfig.json文件:
tsc --init     // 生成tsconfig.json
  • 可以运行 npx tsc来编译自己的ts代码
  1. 当在webpack中使用TypeScript,那么我们可以使用ts-loader来处理ts文件:

安装 npm install ts-loader -D

  1. 编写TS并使用
export const sum=(num1:number,num2:number)=>{
     return num1+num2
}
  1. 配置loader并打包
{
	test: /\.ts$/,
	use: {loader: "ts-loader",}
}
  1. 注意 如果打包出现下面错误 要配置 tsconfig.json
    babel兼容低版本游览器,javascript,前端,vue.js
  2. 解决第四步错误
  • 执行 tsc --init
  • 配置兼容es版本

7.3 babel对TS的支持

  • 配置babel-loader
{
	test: /\.ts$/,
	use: {
		loader: "babel-loader",
	}
  • 安装 @babel/preset-typescript 与配置

npm install @babel/preset-typescript -D文章来源地址https://www.toymoban.com/news/detail-585449.html

module.exports = {
	presets: [
		["@babel/preset-env"],
		["@babel/preset-react"],
		["@babel/preset-typescript"]
	]
}
  • ts-loaderbabel-loader选择
    • 使用ts-loader(TypeScript Compiler)来直接编译TypeScript,那么只能将ts转换成js;
    • 如果我们还希望在这个过程中添加对应的polyfill(兼容Promise,includes这样的语法),那么ts-loader是无能为力的;
      • 我们需要借助于babel来完成polyfill的填充功能;
      • 使用babel-loader(Babel)来直接编译TypeScript,也可以将ts转换成js,并且可以实现polyfill的功能;
["@babel/preset-typescript",{
// corejs:3,
// useBuiltIns:"usage"
}]
  • babel-loader在编译的过程中,不会对类型错误进行检测;
    • 执行 npm run type-check可以对ts代码的类型进行检测;
    • 执行 npm run type-check-watch可以实时的检测类型错误
"ts-check":"tsc --noEmit",
"ts-check-watch":"tsc --noEmit --watch"

到了这里,关于babel兼容低版本游览器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用pdf.js预览pdf文件时如何兼容chrome66版本

    最近在做一个需求,在PC端实现预览pdf文件的功能,但是要最低兼容chrome的66版本,因为公司用的chrome浏览器最低版本就是66版本。 现在下载PDF.js (链接:https://mozilla.github.io/pdf.js/) 下载下来的版本是 v3.11.174 ,都是已经构建好的。 我先拿 v3.11.174 这个版本试了一下,发现在

    2024年02月07日
    浏览(52)
  • 前端面试的游览器部分(6)每天10个小知识点

    👍 点赞,你的认可是我创作的动力! ⭐️ 收藏,你的青睐是我努力的方向! ✏️ 评论,你的意见是我进步的财富! 😍( 求奖牌ing ) 浏览器的事件机制是指在网页中用户与页面元素交互时,浏览器是如何处理和传递这些事件的。事件流是描述事件在页面元素之间传播的方

    2024年02月12日
    浏览(75)
  • vue对于低版本浏览器兼容问题

    由于采用了vite3而不是vue-cli,所以以前的很多兼容方式都不能做。接下来就看一下vite是怎么做到低版本兼容的问题。 @vitejs/plugin-legacyds 官方唯一指定的兼容工具库,使用方式官网都有了 虽然有些确实是兼容了低版本,但是,有些工具库利用了些新的特性,页面还是报错。

    2024年02月12日
    浏览(46)
  • 前端vue/uniapp —— 兼容ios与安卓问题

    ① css样式无效:安卓可,ios不可 ② 富文本外层包裹:安卓可,ios不可 ③ 提取富文本文字后加css样式:安卓可,ios可,不完美的解决办法

    2024年02月16日
    浏览(41)
  • JavaScript - 判断当前时间是否在指定区间内,例如:9:00~12:00(检查当前时间是否处于规定的两个时间段范围内),适用于 vue.js / uniapp / 微信小程序等前端项目

    例如,您想知道当前时间是否处于 9:00 ~ 12:00 时间区间内,然后根据这个判断进而实现业务逻辑。 如下示例所示, 本文提供一个函数,您只需要传入 2 个时间区间,便可得出当前时间是否在该时间区间范围内: 您可以一键复制,直接粘贴到您的项目中。 您只需要传入开始时

    2024年02月16日
    浏览(60)
  • web游览器的标签页仿 ios mac 苹果的墓碑机制 (js代码)

    背景: 本来项目开发系统防挂机功能,在其余游览器中均可以使用。但是呢在苹果的safair游览器中会出现几率失效,最后经过排查发现是苹果的墓碑机制导致。即:此标签页活跃,其他标签页假死。然后就导致防挂机失效了。 原理: 假如当前游览器中有3个标签页分别是A,

    2024年02月03日
    浏览(34)
  • Vue、Vue CLI、Webpack 和 Webpack CLI 的版本兼容对照表

    这些指南只是一些常见的版本兼容性指南。在实际项目中,取决于具体的应用场景和使用的组件库,不同版本之间可能还存在其它的兼容性问题。因此,我们建议使用最新版本的 Vue、Vue CLI、Webpack 和 Webpack CLI 来获得最佳的性能、安全性以及最新的功能和改进。同时,在使用

    2024年02月11日
    浏览(38)
  • Vue3实现PDF文件预览 (低版本浏览器兼容)

    前言:         最近和小伙伴们一起合作完成一个企业级知识库项目,其中一个功能就是后端把所有格式的文件转换为PDF,前端实现渲染PDF文件从而实现预览,干了整整一周(考虑到低版本浏览器的兼容),试用了几种方案(iframe预览已被废弃,不适用本项目,想了解的同学

    2024年01月20日
    浏览(40)
  • 深入学习 JavaScript 转译器 Babel ,AST还原混淆代码

    JavaScript 是一种广泛应用于 Web 开发的脚本语言,它最初是由网景公司的 Brendan Eich 开发的。JavaScript 具有易学易用、灵活、动态等特点,它能够帮助开发者在 Web 应用中实现丰富的交互和动态效果。 然而,由于 JavaScript 的语法和特性不断更新,旧版的浏览器和环境可能无法完

    2024年02月07日
    浏览(42)
  • jQuery.js - 前端必备的Javascript库

    作者: WangMin 格言: 努力做好自己喜欢的每一件事 jQuery.js 是什么? jQuery是一个快速简洁、免费开源易用的JavaScript框架, 倡导写更少的代码,做更多的事情 。它封装JavaScript常用的功能代码,提供了一种简便的JavaScript设计模式,以及我们开发中常用到的操作DOM的API,优化HTML文

    2024年02月05日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包