網(wǎng)站首頁 編程語言 正文
前端開發(fā)過程中,很可能需要兼容IE瀏覽器(雖然很無奈就是了),在兼容IE瀏覽器時(shí)要十分小心,因?yàn)镮E是不支持es2015以上的,所以你可能會(huì)發(fā)現(xiàn)Promise、箭頭函數(shù)等方式通通報(bào)錯(cuò)。
Webpack
前端項(xiàng)目化的過程中,很多都會(huì)使用到Webpack
、Gulp
等工具。
這里我使用的是Webpack
,對于Webpack
的項(xiàng)目配置因?yàn)橐郧耙簿唧w說過,所以這里不再做過多的講述了。
參考鏈接:
一、使用的javascript
包管理工具是yarn
, 先使用yarn init
命令進(jìn)行項(xiàng)目的創(chuàng)建。
二、使用yarn add
安裝項(xiàng)目所需要的webpack
包
命令:yarn add webpack webpack-cli webpack-dev-server
三、在項(xiàng)目文件夾中創(chuàng)建webpack.config.js
,配置基礎(chǔ)的結(jié)構(gòu)。文件夾中創(chuàng)建需要的入口文件main.js
const path = require('path'); // node自帶包
const webpack = require('webpack');
module.exports = {
// 希望打包的文件
entry:'./main.js',
output:{
filename:'main_out.js', // 輸出文件名稱
path:path.resolve(__dirname,'./build/'), //獲取輸出路徑
},
mode: 'development', // 整個(gè)mode 可以不要,模式是生產(chǎn)壞境就是壓縮好對,這里配置開發(fā)壞境方便看生成對代碼
module:{
rules: [
]
},
resolve: {
extensions: ['.js'] // 解析對文件格式
},
devServer: {
hot: false, //開啟熱更新
// 命令行中會(huì)顯示打包的進(jìn)度
progress: false,
liveReload: true,
port: 9000,
filename: 'main_out.js',
},
plugins: [
//熱更新插件
new webpack.HotModuleReplacementPlugin()
],
target: ['node', 'es5'], // 這里我提前設(shè)置了es5
}
四、在package.json
中添加scripts
運(yùn)行命令
"scripts": {
"dev": "webpack --mode development",
"start": "webpack serve --config webpack.config.js --mode development"
}
這樣基礎(chǔ)的webpack
就配置好了,現(xiàn)在我們可以在main.js
中寫一些語句
class A {
a;
constructor(a) {
this.a = a;
}
}
let a1 = new A(10);
console.log(a1);
此時(shí)在終端當(dāng)中運(yùn)行yarn dev
,會(huì)生成build文件夾中的main_out.js
文件。
main_out.js的內(nèi)容
使用node
運(yùn)行main_out.js
,可以看到輸出的結(jié)果
注意: 這里有一個(gè)地方,在
webpack.config.js
中我設(shè)置target
為[‘node’, ‘es5’],如果不添加es5
,生成的main_out.js
中會(huì)有箭頭函數(shù),這樣如果將main_out.js
引入,在IE瀏覽器當(dāng)中是會(huì)出現(xiàn)報(bào)錯(cuò)的。
Babel
通過上面的target配置,可能會(huì)讓人以為已經(jīng)能夠讓IE兼容ES6之后的方式。
但是實(shí)際上,對于promise、Set、class等使用,還是無法編譯為IE瀏覽器可以使用的js。
在main.js添加以下代碼:
class A {
a;
constructor(a) {
this.a = a;
}
}
let a1 = new A(10);
console.log(a1);
let pro = new Promise((resolve, reject)=>{ });
console.log(pro);
let set = new Set([1,2,3,3,7,8,4,7]);
console.log(set);
在yarn dev
生成main_out.js
,在node運(yùn)行時(shí)或者在chrome瀏覽器中運(yùn)行都是能正常的。
但是在IE上還是出現(xiàn)了報(bào)錯(cuò):
安裝Babel
這里就需要引入Babel插件了
介紹: Babel 是一個(gè)工具鏈,主要用于將采用 ECMAScript 2015+ 語法編寫的代碼轉(zhuǎn)換為向后兼容的 JavaScript 語法,以便能夠運(yùn)行在當(dāng)前和舊版本的瀏覽器或其他環(huán)境中。
官方網(wǎng)址: https://www.babeljs.cn/docs/
接下來讓我開始安裝Babel
命令: yarn add @babel/core @babel/cli babel-loader -D
這里的@babel/core
是babel
核心組件,@babel/cli
是Babel 自帶了一個(gè)內(nèi)置的 CLI 命令行工具,可通過命令行編譯文件。
除了上述的兩個(gè)插件外,接下來需要安裝一些其他需要的babel組件
命令:yarn add @babel/preset-env @babel/polyfill @babel/runtime -D
這里面的
@babel/polyfill
是一個(gè)core-js
和generation runtime
的合集,安裝之后在配置文件里配合@babel/preset-env
使用即可。而@babel/runtime
的作用與@babel/polyfill
類似,區(qū)別是它使用了一些helper
函數(shù)來對局部進(jìn)行擴(kuò)展,不會(huì)污染全局環(huán)境
配置Babel
接下來就需要配置Babel
一、創(chuàng)建一個(gè).babelrc
文件,這里面寫如Babel需要支持的配置
{
"presets": [
["@babel/preset-env",
{
"useBuiltIns": "usage",
"corejs": 2, // 新版本的@babel/polyfill包含了core-js@2和core-js@3版本,所以需要聲明版本,否則webpack運(yùn)行時(shí)會(huì)報(bào)warning
}
]
],
}
二、webpack.config.js
中配置rules
,這里使用exclude
表示哪些目錄中的 .js
文件不要進(jìn)行 babel-loader
rules: [
{
test: /\.js$/,
use: {
loader: 'babel-loader',
},
exclude:'/node_modules/',
}
]
現(xiàn)在我的package中配置如下:
此時(shí)再運(yùn)行yarn dev
,生成的main_out.js
就可以在IE瀏覽器中使用了
注意:因?yàn)?strong>Babel版本的更迭,所以網(wǎng)上很多教程其實(shí)版本可能不太一樣,安裝的插件也不同了。之前我參考一個(gè)教程,安裝了Core-js,就一直報(bào)錯(cuò),可能是產(chǎn)生了沖突,移除后就好了。配置項(xiàng)目真的是趟坑躺過來的…
原文鏈接:https://kongchengji.blog.csdn.net/article/details/120934490
相關(guān)推薦
- 2022-11-17 docker容器通信參數(shù)使用及l(fā)ink參數(shù)介紹_docker
- 2022-06-04 Python正則表達(dá)式中flags參數(shù)的實(shí)例詳解_python
- 2022-11-21 解析Rust?struct?中的生命周期_Rust語言
- 2023-04-01 Pytorch中關(guān)于F.normalize計(jì)算理解_python
- 2022-06-04 .NET項(xiàng)目在k8s中運(yùn)行的Dapr持續(xù)集成流程_ASP.NET
- 2022-05-26 Flutter?GridView顯示隨機(jī)單詞效果_Android
- 2022-05-29 Python實(shí)現(xiàn)灰色關(guān)聯(lián)分析與結(jié)果可視化的詳細(xì)代碼_python
- 2022-10-25 golang值接收者和指針接收者的區(qū)別介紹_Golang
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支