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

news2025/6/9 22:17:36

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工具,而不是设置targets
                        targets:">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个x
          use:{
             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.coloradmin.cn/o/2405904.html

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

相关文章

c++ decltype关键字

decltype为类型推导关键字。 示例代码&#xff1a; // decltype也可用于函数模板编程: template<typename T, typename U> auto add(T t, U u) -> decltype(t u) {return t u; }// decltype推导函数返回类型 auto doubleNumFunc(int x) -> decltype(x * 2) {ret…

Selenium自动化测试工具安装和使用(PyCharm)

一&#xff0c;了解驱动 手工测试我们很了解&#xff0c;假设我要测试百度首页是否正常&#xff0c;只需要鼠标点击打开浏览器&#xff0c;然后输入百度网址即可 但是对于程序来说&#xff0c;打开浏览器&#xff0c;需要用到对应的驱动&#xff0c;就好比你给电脑装了个外置…

【网络安全】fastjson原生链分析

fastjson 原生链 前言 说起 fastjson 反序列化&#xff0c;大部分的利用都是从 type 把 json 串解析为 java 对象&#xff0c;在构造方法和 setter、getter 方法中&#xff0c;做一些文件或者命令执行的操作。当然&#xff0c;在 fastjson 的依赖包中&#xff0c;也存在着像 …

【人工智能 | 项目开发】Python Flask实现本地AI大模型可视化界面

文末获取项目源码。 文章目录 项目背景项目结构app.py(后端服务)index.html(前端界面)项目运行项目图示项目源码项目背景 随着人工智能技术的快速发展,大语言模型在智能交互领域展现出巨大潜力。本项目基于 Qwen3-1.7B 模型,搭建一个轻量化的智能聊天助手,旨在为用户提…

词法分析和词性标注 自然语言处理

目录 一. 概述 1 不同语言的词法分析 2 英语的形态分析 英语单词的形态还原&#xff08;和正常英语的词法变化一样&#xff09; 1.有规律变化单词的形态还原 ​编辑 2.动词&#xff64;名词&#xff64;形容词&#xff64;副词不规则变化单词的形态还原 3.对于表示年代&…

QT聊天项目DAY14

1. 客户端登录 1.1 初始化玩家头像 将头像的大小固定在250 * 250 void InitHeadImage(); // 初始化头像/* 初始化头像 */ void LoginWidget::InitHeadImage() {// 加载头像QPixmap OriginalPixmap(":/Chat/Images/head_5.jpg");OriginalPixmap …

架构设计技巧——架构设计模板

一份实用、高效、覆盖核心要素的架构设计模板是确保设计质量、促进团队沟通和指导实施的关键。以下是一个经过提炼的架构设计文档核心模板框架&#xff0c;结合了业界最佳实践&#xff0c;并强调灵活裁剪&#xff1a; 架构设计文档模板 (核心框架) 文档标识 项目/系统名称&a…

【Ragflow】27.RagflowPlus(v0.4.1):小版本迭代,问题修复与功能优化

概述 RagflowPlus v0.4.0 在发布后&#xff0c;收到了积极的反馈&#xff0c;同时也包含一些问题。 本次进行一轮小版本更新&#xff0c;发布 v0.4.1 版本&#xff0c;对已知问题进行修复&#xff0c;并对部分功能进行进一步优化。 开源地址&#xff1a;https://github.com/…

【Oracle】数据仓库

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 数据仓库概述1.1 为什么需要数据仓库1.2 Oracle数据仓库架构1.3 Oracle数据仓库关键技术 2. 数据仓库建模2.1 维度建模基础2.2 星形模式设计2.3 雪花模式设计2.4 缓慢变化维度&#xff08;SCD&#xff09;处…

基于开源AI大模型AI智能名片S2B2C商城小程序源码的中等平台型社交电商运营模式研究

摘要&#xff1a;本文聚焦中等平台型社交电商&#xff0c;探讨其与传统微商及大型社交电商平台的差异&#xff0c;尤其关注产品品类管理对代理运营的影响。通过引入开源AI大模型、AI智能名片与S2B2C商城小程序源码技术&#xff0c;构建智能化运营体系。研究结果表明&#xff0c…

Vite 双引擎架构 —— Esbuild 概念篇

Vite 底层采用 双引擎架构&#xff0c;核心构建引擎是 Esbuild 和 Rollup&#xff0c;二者在开发和生产环境中分工协作&#xff0c;共同实现高性能构建。不可否认&#xff0c;作为 Vite 的双引擎之一&#xff0c;Esbuild 在很多关键的构建阶段(如依赖预编译、TS 语法转译、代码…

阿里云Alibaba Cloud安装Docker与Docker compose【图文教程】

个人记录 进入控制台&#xff0c;找到定时与自动化任务 进入‘安装/卸载扩展程序’ 点击‘安装扩展程序’ 选择docker社区版&#xff0c;点击下一步与确定&#xff0c;等待一会 安装成功 查询版本 查询docker sudo docker version查询docker compose sudo docker compo…

ADB识别手机系统弹授权框-如何处理多重弹框叠加和重叠问题

ADB识别手机系统弹授权框-如何处理多重弹框叠加和重叠问题 --蓝牙电话SDK自动部署 上一篇&#xff1a;手机App-插入USB时自动授权点击确定按钮-使系统弹出框自动消失 下一篇&#xff1a;编写中。 一、前言 我们在上一篇《手机App-插入USB时自动授权点击确定按钮-使系统弹出框…

uniapp+<script setup lang=“ts“>解决有数据与暂无数据切换显示,有数据加载时暂无数据闪现(先加载空数据)问题

声明showEmpty 为false&#xff0c;在接口返回处判断有数据时设置showEmpty 为false&#xff0c;接口返回数据为空则判断showEmpty 为true &#xff08;这样就解决有数据的时候会闪现暂无数据的问题啦&#xff09; <!--* Date: 2024-02-26 03:38:52* LastEditTime: 2025-06…

详解鸿蒙Next仓颉开发语言中的动画

大家上午好&#xff0c;今天来聊一聊仓颉开发语言中的动画开发。 仓颉中的动画通常有两种方式&#xff0c;分别是属性动画和显示动画&#xff0c;我们今天以下面的加载动画为例&#xff0c;使用显示动画和属性动画分别实现一下&#xff0c;看看他们有什么区别。 显示动画 显示…

Redis常见使用场景解析

1. 数据库缓存 Redis 作为典型的 Key-Value 型内存数据库,数据缓存是其最广为人知的应用场景。使用 Redis 缓存数据操作简便,通常将序列化后的对象以 string 类型存储。但在实际应用中,需注意以下关键要点: Key 设计:必须确保不同对象的 Key 具有唯一性,且尽量缩短长度,…

起重机指挥人员在工作中需要注意哪些安全事项?

起重机指挥人员在作业中承担着协调设备运行、保障作业安全的关键职责&#xff0c;其安全操作直接关系到整个起重作业的安全性。以下从作业前、作业中、作业后的全流程&#xff0c;详细说明指挥人员需注意的安全事项&#xff1a; 一、作业前的安全准备 资质与状态检查&#xff…

JAVA-springboot log日志

SpringBoot从入门到精通-第8章 日志的操作 一、Spring Boot默认的日志框架 SpringBoot支持很多种日志框架&#xff0c;通常情况下&#xff0c;这些日志框架都是由一个日志抽象层和一个日志实现层搭建而成的&#xff0c;日志抽象层是为记录日志提供的一套标准且规范的框架&…

1.springmvc基础入门(一)

1.Spring MVC概念 Spring MVC 是 Spring Framework 提供的 Web 组件&#xff0c;全称是 Spring Web MVC&#xff0c;是⽬前主流的实现 MVC 设计模式的框架&#xff0c;提供前端路由映射、视图解析等功能。 Java Web 开发者必须要掌握的技术框架。 2.Spring MVC 功能 MVC&am…

模块缝合-把A模块换成B模块(没写完)

把MLP Head替换为KAN 1.在model文件下新建一个python文件 2.把 模块文件里的整个KAN代码复制到新的python文件中 3.在开头导入 from model.KAN(新建文件名&#xff09; import KAN&#xff08;新建文件中的类名&#xff09; 4.sys.path.append(r"D: Icode(Kansformer"…