浏览器兼容-polyfill-本地服务-优化

babel和webpack结合 

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

这是把src下面的东西都用babel转化一下

webpack可以和babel结合使用,首先下载一个这东西:

npm install babel-loader -D

 webpack配置:

const path = require('path');module.exports = {mode: 'development',entry: './src/index.js',output: {path: path.resolve(__dirname, './build'),filename: 'bundle.js',//重新打包时现将之前打包的文件夹删除clean:true},module:{rules:[{test:/\.js$/,use:{loader:'babel-loader',options:{plugins:['@babel/plugin-transform-arrow-functions','@babel/plugin-transform-block-scoping']}}}]}
}

 要指定对应的插件才生效

如果我们一个个的去安装使用插件就需要手动管理大量的babel插件,我们可以直接给webpack提供一个preset,webpack会根据对应的预设来加载插件列表并将其传递给babel

比较常见的预设有env、react、TypeScript

安装preset-env:

npm install @babel/preset-env

 浏览器兼容性

浏览器的内核都趋向于使用Blink

我们在编写css和js的时候需要考虑到浏览器的兼容性问题,但是对于前端开发者来说既要写代码又要考虑兼容性就很烦,所以急需一些工具帮助对css/js进行转化

对css进行转化的是postcss

对js进行转化的是babel

而代码要不要自动进行转化取决于要适配的浏览器,一个一个对应版本还是太麻烦了

编写一个browserslistrc配置文件可以帮助我们进行浏览器适配

也得是配让我适配的浏览器我才会给他适配

哪个热门人用的多就挑哪个

怎么知道哪个浏览器人用的多呢?看浏览器市场占有率:

"Can I use" usage tablehttps://caniuse.com/usage-table

超过百分之一的人用就需要做兼容了

 写好配置就可以用Browserslist做兼容了(在不同的前端工具之间共享目标浏览器和Node.js版本的配置)

在开发中我们可以编写的条件:

配置browserslist可以配置 package.json也可以单独的一个配置文件.browserslistrc文件

 没有配置也有默认配置,当编写了多个条件之后,多个条件之间的关系:

const path = require('path');module.exports = {mode: 'development',entry: './src/index.js',output: {path: path.resolve(__dirname, './build'),filename: 'bundle.js',//重新打包时现将之前打包的文件夹删除clean:true},module:{rules:[{test:/\.js$/,use:{loader:'babel-loader',options:{// plugins:[//     '@babel/plugin-transform-arrow-functions',//     '@babel/plugin-transform-block-scoping'//    ]presets:["@babel/preset-env",{// 在开发中针对babel的浏览器兼容查询使用browerlist工具,而不是设置targetstargets:">5%"}]}}}]}
}

推荐使用这个工具,不用targets,因为这个工具能进行统一的适配

配置的targets属性会覆盖browserslist

Stage-X的preset

ECMAScript规范定义了JavaScript如何一步步的进化、发展

TC39是指技术委员会第39号

特性的打磨发展是一步一步的:

在babel7之前(babel6中),我们经常会看到这种设置方式:

它表达的含义是使用对应的babel-preset-stage-x预设

从babel7开始不建议使用了,建议使用preset-env来设置

Babel的配置文件

我们可以将babel的配置信息放到一个独立的文件中,babel可以编写两种配置文件:

babel.config.json(或者.js , .cjs , .mjs)文件

.babelrc.json(或者 .babelrc , .js , .cjs , .mjs)文件

他们两个是由区别的:

 认识polyfill

有的时候我们使用了一些语法特性,但是浏览器根本不认识这些特性必然会报错,可以使用polyfill打一个补丁,这样就包含该特性了

useBuiltlns属性设置

第三个值就是entry了

如果我们依赖的某一个库使用了某些polyfill的特性,但是我们使用的是usage之后浏览器可能就会报错

如果担心出现这样的情况可以用entry

需要在入口文件添加import 'core-js/stable'

import 'regenerator-runtime/runtime'

这样做会根据browserslist目标导入所有的polyfill,对应的包也会变大

React的jsx支持

在我们编写react代码时,react使用的语法是jsx,jsx是可以直接使用babel来转换的

对react.jsx处理需要下面的插件:

在开发中不需要一个个的安装这些插件,依然可以用preset配置

npm install @babel/preset-react -D

配置自动构建: 

{"name": "babel_core_demo","version": "1.0.0","main": "index.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1","build": "webpack"},"author": "","license": "ISC","description": "","devDependencies": {"@babel/cli": "^7.27.2","@babel/core": "^7.27.4","@babel/plugin-transform-block-scoping": "^7.27.5","@babel/preset-env": "^7.27.2","@babel/preset-react": "^7.27.1","babel-loader": "^10.0.0","html-webpack-plugin": "^5.6.3"}
}

然后在webpack里配置babel:

const path = require('path');
const HtmlwebpackPlugin = require('html-webpack-plugin');module.exports = {mode: 'development',entry: './src/index.js',output: {path: path.resolve(__dirname, './build'),filename: 'bundle.js',//重新打包时现将之前打包的文件夹删除clean:true},resolve: {extensions: ['.js', '.jsx']  // 这句告诉webpack自动尝试这两个后缀},module:{rules:[{test:/\.jsx?$/,   //表示有0或者1个xuse:{loader:'babel-loader',options:{// plugins:[//     '@babel/plugin-transform-arrow-functions',//     '@babel/plugin-transform-block-scoping'//    ]presets:[["@babel/preset-env", { targets: ">5%" }],"@babel/preset-react"]                  }}}]},plugins:[new HtmlwebpackPlugin({template:'./index.html',filename: 'end.html' })]
}

这个x?已经能即处理js又处理jsx了

但是莫名其妙还是报错,加resolve是永远都搜索这俩文件 

babel的配置文件:

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

模板html:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="root"></div>
</body>
</html>

index.js:

import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './react/App'
//const定义常量(ES6)
const message = 'Hello World';
console.log(message);const foo = ()=>{console.log("foo function exec!");
}
foo();// 使用字符串中的includes方法
const nickname = 'coderwhy';
console.log(nickname.includes('why'));const root = ReactDOM.createRoot(document.querySelector('#root'));
root.render(<App />);

最后运行webpack就会打包并且react能成功解析运行在浏览器中了

ts-loader处理ts代码

npm install ts-loader -D

需要安装一下ts:

npm install -g typescript

然后进行初始化:

tsc --init

初始化后直接生成一个tsconfig.json

 然后直接运行npm run build就可以完成编译了

使用babel-loader

除了可以使用tsc来编译TS,我们也可以使用Babel

Babel是有对TS进行支持

可以使用插件:@babel/transform-typescript

更推荐直接使用preset:@babel/preset-typescript

ts-loader和babel-loader的选择

ts-loader默认使用的是TypeScript complier

里面是不包含polyfill的

所以最好用babel-loader

使用针对ts的预设就可以解决这个问题

使用预设的好处是可以配置polyfill

module.exports = {presets: [['@babel/preset-env',{corejs: 3, // 配置使用core-js的版本useBuiltIns: 'usage', // 根据配置的浏览器兼容,以及代码中使用到的 API 进行引入 polyfill 按需加载}],'@babel/preset-react','@babel/preset-typescript',],};

ts-loader会进行类型的校验,但是babel-loader就不会,所有各有各的优点

建议我们即用babel完成代码类型的转化,又使用tsc来进行类型的检查

但是我们如何使用tsc进行类型的检查呢?

我们可以在scripts中添加两个脚本用于类型检查

执行npm run ts-check可以进行ts类型检测

执行npm run ts-check-watch可以实时检测类型错误

{"name": "babel_core_demo","version": "1.0.0","main": "index.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1","build": "webpack","ts-check":"tsc --noEmit","ts-check-watch":"tsc --noEmit --watch"},"author": "","license": "ISC","description": "","devDependencies": {"@babel/cli": "^7.27.2","@babel/core": "^7.27.4","@babel/plugin-transform-block-scoping": "^7.27.5","@babel/preset-env": "^7.27.2","@babel/preset-react": "^7.27.1","babel-loader": "^10.0.0","html-webpack-plugin": "^5.6.3","ts-loader": "^9.5.2"},"dependencies": {"@babel/preset-typescript": "^7.27.1"}
}

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

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

相关文章

组织结构图软件:数据驱动的可视化架构管理工具

1. 组织结构图软件概述 组织结构图概念 组织结构图是一种图形化工具&#xff0c;用于展示组织内部的层级关系、部门职能和人员分工。它通过清晰的线条和文本框连接&#xff0c;直观呈现企业或机构的架构&#xff0c;帮助管理者和员工快速理解组织的运作模式。 重要性 在企业…

大数据学习(138)-Hive数据分析3

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…

深度学习环境搭建(pycharm+yolov5)

B站 &#xff1a;道传科技上位机 观看教程 一、pycharm的安装 pycharm windows版本下载地址&#xff1a;Download PyCharm: The Python IDE for data science and web development by JetBrains 下载社区版本&#xff08;日常学习使用够用了&#xff09;&#xff0c;专业版…

K8S中应用无法获取用户真实ip问题排查

现象 领导反馈生产环境的用户ip有问题。登陆到这个页面&#xff0c;发现是所有的用户ip都是172.30.94.97&#xff0c;这是个内部网络ip. 排查过程 1 登陆到应用前端nginx&#xff0c; 查看nginx的请求日志 172.30.94.97 - - [17/Jul/2024:02:02:54 0000] "POST /***/n…

2.倒排索引

传统数据库mysql使用的是正向索引 词条是不允许重复的&#xff0c;给词条创建唯一索引&#xff0c;根据词条查找的速度就很快了。

【Android Studio】新建项目及问题解决

新建项目 按照《Android 第一行代码》中 1.3 小节的步骤创建项目。 注意&#xff1a;Minimum API Level 用于设置项目的最低兼容版本。Android 5.0 以上的系统已经占据超过了 99.9% 的 Android 市场份额&#xff0c;因此这里指定为 API 21: Android 5.0 即可。 问题解决 &…

SX1268低功耗sub-1g芯片支持lora和GFSK调制

SX1268 射频收发器是长距离无线应用的理想设备&#xff0c;支持410-810MHZ。它专为长电池寿命而设计&#xff0c;仅消耗4.2 mA的主动接收电流。SX1268 可以使用高效的集成功率放大器在490 MHz传输高达 22 dBm 的信号。在 780 MHZ时&#xff0c;SX1268 在天线端口传输10dBm的信号…

C#高级:利用反射让字符串决定调用哪个方法

一、反射的实现 using System; using System.Reflection; using System.Threading.Tasks;public class Calculator {public int Add(int a, int b){return a b;}public int Subtract(int a, int b){return a - b;}public int Multiply(int a, int b){return a * b;}public do…

图像二分类任务推荐使用Sigmoid函数‌

‌图像二分类任务中可以使用Softmax作为激活函数&#xff0c;但通常更推荐使用Sigmoid函数‌。Softmax函数可以将多个类别的输出转换成概率分布&#xff0c;适合多分类任务。在二分类任务中&#xff0c;虽然可以使用Softmax&#xff0c;但它会生成两个输出值&#xff08;每个类…

湖北理元理律师事务所:债务优化的法律逻辑与生活平衡术

在债务纠纷数量年均增长19%的背景下&#xff08;最高人民法院2023年数据&#xff09;&#xff0c;专业法律服务机构的价值不仅在于解决纠纷&#xff0c;更在于重构债务人与生活的平衡关系。湖北理元理律师事务所的实践显示&#xff0c;科学的债务优化需同时满足三个维度&#x…

window 显示驱动开发-处理视频帧

Microsoft Direct3D 运行时调用用户模式显示驱动程序的 VideoProcessBeginFrame 和 VideoProcessEndFrame 函数&#xff0c;以指示用户模式显示驱动程序可以处理视频帧的这些函数调用之间的时间段。 在用户模式显示驱动程序可以处理任何视频帧之前&#xff0c;Microsoft Direct…

基于 React Native for HarmonyOS5 的跨平台组件库开发指南,以及组件示例

基于 React Native for HarmonyOS5 的跨平台组件库开发&#xff0c;需融合分层架构设计、鸿蒙原生能力桥接及性能优化技术&#xff0c;核心指南如下&#xff1a; ‌一、分层架构设计‌ 采用 ‌模块化分层结构‌&#xff0c;隔离平台差异逻辑&#xff1a; ├── common_har …

一站式了解单例模式

引言 这是设计模式专栏的第一篇文章&#xff0c;在这个专栏里面会讲到我们在开发中经常使用的设计模式&#xff0c;我会用心将它们解析&#xff0c;然后讲给你们听&#xff0c;如果感兴趣可以持续关注这个专栏❤️ 这次我们要讲的是单例模式&#xff0c;这个在大厂面试中十分…

Java应用Flink CDC监听MySQL数据变动内容输出到控制台

文章目录 maven 依赖自定义数据变化处理器flink cdc监听验证 maven 依赖 <properties><flink.version>1.14.0</flink.version><flink-cdc.version>2.3.0</flink-cdc.version></properties><dependencies><!-- Flink dependencie…

猎板厚铜PCB工艺能力如何?

在电子产业向高功率、高集成化狂奔的今天&#xff0c;电路板早已不是沉默的配角。当5G基站、新能源汽车、工业电源等领域对电流承载、散热效率提出严苛要求时&#xff0c;一块能够“扛得住大电流、耐得住高温”的厚铜PCB&#xff0c;正成为决定产品性能的关键拼图。而在这条赛道…

业务:资产管理功能

文章目录 一、项目背景1.1概述1.2编写目的 二、注意点说明三、页面效果四、代码AssetManagementControllerHwinfoAssetManagementHwinfoAssetManagementServiceHwinfoAssetManagementServiceImplHwinfoAssetManagementMapperHwinfoAssetManagementMapper.xmlSfpAssetManagement…

【MySQL进阶】MySQL程序

目录 一.有哪些MySQL程序 二. mysqld —— MySQL服务器 三.mysql——MySQL客户端 3.1.连接mysql客⼾端 3.2.mysql客户端选项 3.2.1.mysql常用选项 3.2.2.在命令⾏中使⽤选项 3.3.MySQL 选项&#xff08;配置&#xff09;文件 3.3.1.Linux环境下默认配置文件的路径 3.…

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…

​​CentOS 7.9​​ 上配置 ​​Fail2ban 自动封禁 IP​​ 的完整步骤,整合了多篇权威资料的最佳实践

&#x1f527; ​​一、安装 Fail2ban​​ ​​启用 EPEL 仓库​​ yum install epel-release -y ​​安装 Fail2ban​​ yum install fail2ban -y ​​启动并设置开机自启​​ systemctl start fail2ban systemctl enable fail2ban ⚠️ 注意&#xff1a;CentOS 7.9 默认 Py…

损坏的RAID5 第十六次CCF-CSP计算机软件能力认证

纯大模拟 提前打好板子 我只通过4个用例点 然后就超时了。 #include<iostream> #include<cstring> #include<algorithm> #include<unordered_map> #include<bits/stdc.h> using namespace std; int n, s, l; unordered_map<int, string>…