成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Preset-Env 按需 Polyfill 是怎么實現的?

系統 瀏覽器
開發時我們會使用一些新的 api,但用戶的瀏覽器各種版本都有,可能并不支持這些 api,但我們也不能因此就不用了,這時候就可以通過 polyfill 來解決。

本文轉載自微信公眾號「神光的編程秘籍」,作者神說要有光。轉載本文請聯系神光的編程秘籍公眾號。

開發時我們會使用一些新的 api,但用戶的瀏覽器各種版本都有,可能并不支持這些 api,但我們也不能因此就不用了,這時候就可以通過 polyfill 來解決。

polyfill 是墊片的意思,也就是在運行業務代碼之前,在全局注入一些 api 的實現,這樣之后運行的業務代碼用到該 api 時就有了,也就不會有兼容問題。

但用戶的瀏覽器可能是各種各樣的,有可能我們 polyfill 的 api 本來就支持,這時候加載 polyfill 就很沒必要,而且也浪費了性能。

有沒有什么辦法能夠既解決不支持這個 api 的運行環境的兼容問題,又不會在支持這個 api 的環境引 入不必要的代碼呢?

答案就是 preset-env,它實現了按需引入 polyfill。

這里的 preset-env 指的是 babel 的 @babel/preset-env 和 postcss 的 postcss-preset-env,它們一個是按需做語法轉換、按需引入 JS 的 polyfill,一個是按需做添加 prefix 等 css 兼容處理。

雖然分別是針對 JS 和 CSS 的,但他們兩個的原理差不多,我們分別來看一下。

@babel/preset-env

按需指的是按照目標運行環境是否支持,那怎么指定目標運行環境呢?

@babel/preset-env 支持通過 targets 來指定目標環境:

{ 
"presets": [
["@babel/preset-env", {
"targets": "> 0.25%, not dead"
}]
]
}

這里的 targets 是 browserslist 的查詢字符串,它可以解析查詢字符串返回對應的瀏覽器版本:

有了這些目標瀏覽器的版本,還需要知道各種特性是在什么版本支持的:

babel 維護了一個數據庫,在 @babel/compat-data 這個包里:

這樣就能根據目標瀏覽器的版本,過濾出哪些特性是支持的,哪些是不支持的。然后只對不支持的特性做語法轉換和 polyfill 即可。

這就是按需 polyfill 的實現原理。

css 的按需做兼容處理也差不多:

postcss-preset-env

postcss 是通過 postcss-preset-env 來做按需處理的,同樣支持配置目標環境,也就是 browsers:

postcssPresetEnv({ browsers: 'last 2 versions' })

同樣也是用 browserslist 來把查詢字符串轉換成對應的瀏覽器版本。

然后再根據哪些 css 特性是從什么瀏覽器版本開始支持的來過濾出不支持的 css 特性。

這里用的是 caniuse 的數據,在 cssdb 這個包里:

知道了目標瀏覽器的版本,知道了這些特性在什么瀏覽器版本支持,那自然就可以過濾出不支持的 css 特性。然后引入不同的 postcss 插件來處理這些特性的 prefix 等就可以了。

這就是 css 的按需 prefix 等處理的原理。

可以看到 babel 和 potcss 都依賴了 browerslist 這個包來查詢目標瀏覽器版本,那自然可以統一成一個,也就是在根目錄下的 .browserslistrc 的配置文件,通過指定同一個的環境來按需做 JS 和 CSS 的兼容處理。

總結

用戶的瀏覽器可能是各種各樣的,我們開發時用的 JS 和 CSS 的特性在用戶的瀏覽器不一定支持,為了保證功能正常就要做兼容處理。

JS 的兼容處理就是 polyfill,CSS 的兼容處理就是添加 prefix 等。

babel 是通過 @babel/preset-env 來做按需 polyfill 和轉換的,原理是通過 browserslist 來查詢出目標瀏覽器版本,然后根據 @babel/compat-data 的數據庫來過濾出這些瀏覽器版本里哪些特性不支持,之后引入對應的插件處理。

postcss 是通過 postcss-preset-env 來做按需 prefix 等的,原理也是通過 browserslist 來查詢出目標瀏覽器版本,然后根據 cssdb 的數據庫(來自 caniuse)來過濾出不支持的 CSS 特性,然后對這些 CSS 做處理即可。

就像 preset-env 的名字一樣,它們的意義就是根據目標環境來按需做處理的,也被叫做智能處理,比之前的 es5、es6 這種粗暴的指定目標,確實聰明了很多。


責任編輯:武曉燕 來源: 神光的編程秘籍
相關推薦

2017-08-23 19:00:29

SDN網絡技術虛擬網絡

2024-05-31 09:31:00

2009-02-17 18:52:06

網絡虛擬化路由系統數據中心

2024-09-18 13:49:42

2021-08-30 22:38:47

VscodeMarkdown預覽

2021-05-11 09:13:08

服務器存儲數據中心

2024-01-15 08:08:27

2014-07-31 10:10:53

全息影像手機數碼

2023-11-23 19:30:35

Python編程語言

2021-09-07 09:18:18

Kubernetes負載均衡服務發現

2024-11-01 16:05:26

2025-03-03 00:15:00

JavaScript開發效率

2022-08-30 19:11:12

Docker虛擬化技術

2009-02-05 09:38:36

企業無線網家庭無線

2024-08-26 11:13:26

字典entry自定義

2021-11-17 09:00:00

Kubernetes集群容器

2021-09-11 19:46:14

配置

2024-11-05 12:59:42

while 循環迭代字節碼

2020-09-11 06:44:29

Python增強算術

2024-07-10 08:22:42

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 伦理午夜电影免费观看 | 久久久久久久久久久国产 | 五月婷六月丁香 | 欧美高清一区 | 狠狠躁夜夜躁人人爽天天高潮 | 亚洲国产成人精品女人久久久 | 日韩精品一区二区三区在线观看 | 国产精品久久 | 欧美一级黄色免费看 | 国产性生活一级片 | 一级特黄a大片 | 久久久久久久久久久久久久av | 亚洲精品国产综合区久久久久久久 | 91在线精品视频 | 操一草 | 在线只有精品 | 国产精品久久久久久久久久免费 | 欧美成人一区二区三区片免费 | 岛国毛片在线观看 | 91精品国产美女在线观看 | 狠狠亚洲 | 亚洲欧美日韩一区二区 | 久久国产综合 | 中文字幕精 | 中文字幕综合在线 | 日韩精品一区二区三区在线播放 | 国产精品一区二区免费看 | 中文字幕精品一区二区三区精品 | 日日噜| 亚洲视频欧美视频 | 亚洲成人精品国产 | 日本成人在线免费视频 | 国产精品99久久久久久久久久久久 | 91免费小视频 | 一色桃子av一区二区 | 日韩成人免费视频 | 黄色一级免费 | 国产精品xxxx| 日韩中文久久 | 欧美日韩精品在线一区 | 日韩成人免费视频 |