瀏覽器兼容-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
繁體地址,請注明出處:http://hk.pswp.cn/news/909119.shtml
英文地址,請注明出處:http://en.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>…