日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解Vue Cli瀏覽器兼容性實踐

瀏覽:36日期:2023-01-14 17:44:10

瀏覽器市場占有率

在處理瀏覽器兼容性問題之前,我們先來看一下現在的瀏覽器市場份額是怎樣的,👇下面是來自statCounter的數據,基本上覆蓋了全世界瀏覽器市場份額的統計,而且前端er經常使用的caniuse所拉取的瀏覽器數據就是來自statCounter。

世界范圍

詳解Vue Cli瀏覽器兼容性實踐

天朝范圍

詳解Vue Cli瀏覽器兼容性實踐

Plus移動端

詳解Vue Cli瀏覽器兼容性實踐

分析

從統計數據可以看出,對于國內的PC端瀏覽器,QQ瀏覽器以及Sogou的占比還是挺高的,所以在做兼容性處理的時候也需要多考慮這兩款瀏覽器。不過QQ瀏覽器和Sogou都是封裝了Chrome的內核,而它們的更新通常也就是隨著Chrome的版本更新而更新,但是這兩款瀏覽器通常不會和Chrome的最新版本同步,而是會有一定的滯后性,所以通常我們兼容的時候要去考慮它們所使用的Chrome內核版本來處理。

Vue CLI3

簡述

隨著尤大最新力作-Vue CLI3的發布,團隊也將項目的腳手架升級為最新的CLI3了,CLI3帶來了很多新的特性,比如支持webpack4、支持可視化化地配置項目、封裝了很多官方的插件降低了上手的成本等。其中還有對瀏覽器兼容性的支持-結合了社區最新的工具以及現代模式。而CLI 3.0的瀏覽器兼容性處理,主要分為三個部分。browserlist、polyfill以及modern mode(現在模式)。

Broserslist

指定項目的目標瀏覽器范圍,這個值會被@babel/preset-env和Autoprefixer等工具用來確定需要轉譯的JS特性以及需要添加前綴的CSS特性。

{ 'browserslist': [ 'last 1 version', //表示最新一個版本 ]}

Browserslist本質是對一系列瀏覽器的queries,查詢瀏覽器的版本, 它會從caniuse中拉取數據來查詢!它的好處是給予了開發者一個標準的地方存放項目支持的瀏覽器版本,他們可以在配置中找到這個支持版本。

下面是用法解釋

詳解Vue Cli瀏覽器兼容性實踐

Transpile

下面要要介紹的是Vue CLI3所用到的Babel預設- @Babel/preset-env,它是在CLI3中指導Babel進行轉譯的一個工具,說起Babel就不得不提一下轉譯,和其他語言中的編譯不同,轉譯是類似如下圖所示的一個過程:

詳解Vue Cli瀏覽器兼容性實踐

總的來說,靜態語言的編譯比如Java是將源代碼編譯為字節碼,這兩種通常是處于不同抽象層次的語言,而Transpile的兩端本質上是相同層次上的抽象,它一般是從一種支持更高級特性的比如ES2017的實現,轉為一種語言特性較少的比如ES5的實現。在解決瀏覽器兼容性時,很大程度上是需要依賴Babel轉譯來解決低版本瀏覽器不支持某些新特性的情況。

CLI3如何使用browserslist以及babel進行轉譯

babel是一個編譯JS文件的和工具。用于編譯新JS新特性到支持的目標瀏覽器。babel/preset-env從browserlistrc文件中加載目標瀏覽器:

'babel': { 'presets': [ [ '@babel/preset-env' ] ]}

然后babel會把新標準中的JS語法特性編譯到當前目標瀏覽器支持的代碼:

const array = [1, 2, 3];const [first, second] = array;

output:

const array = [1, 2, 3];const first = array[0], second = array[1];

此處的const特性,因為該目標瀏覽器支持了,所以不需要降級處理。

** Babel的轉譯可以簡單地用以下三個階段概括: **

parser: 通過babel-parser,基于babel-AST-format將JS代碼轉譯成AST。 transform: 所有的插件/presets進一步做語法等自定義轉譯,仍然為AST generator: 最后通過generator生成轉譯后的字符串。

不同的特性,結合Browserslist以及@Babel/preset-env會根據當前的目標瀏覽器支持的特性的情況來轉譯,不支持的特性再去降級處理。Babel本身是個復雜的話題,后續有余力結合編譯原理再去深挖一下。

Polyfills

Polyfill通常是在特性檢測后,來決定是否需要引入的一段JS代碼,它是用基于目標瀏覽器支持的代碼編寫的。

if(browserSupportAllFeatures()) { main();} else { loadScript(’polyfills.js’, main);}

原理默認情況下,它會把useBuiltIns: ’usage’ 傳遞給 babel/preset-env,這樣它會根據源代碼中出現的語言特性自動檢測需要的polyfill。 確保了最終包里的polyfill數量最小化。然而,這也意味著如果其中一個依賴需要特殊的polyfill,默認情況下babel無法檢測出來。

// 源代碼var a = new Promise();

// 輸出import ’core-js/modules/es6.promise’;var a = new Promise();

依賴需要Polyfills如果有依賴需要polyfill,你有幾種選擇:(來自babel-preset-app)

如果該依賴基于一個目標環境不支持的ES版本撰寫,將其添加到vue.config.js中的 traspileDependcies選項。這會為該依賴同時開啟語法轉換和根據使用情況檢測polyfill。默認情況下,babel-loader會忽略所有node_modules中的文件。如果想要通過Babel顯式轉譯一個依賴,可以在這選項中列出:

trasnpileDependencies: [lodash,...]

如果該依賴交付了ES5代碼并顯式列出了需要的polyfill: 你可以使用@vue/babel-preset-app 的polyfills選項 預包含所需要的polyfill。( 注冊es6.promise將被默認包含,因為現在的庫依賴Promise非常普遍。)

// babel.config.jsmodule.exports = { presets: [ [’@vue/app’, { polyfills: [ ’es6.promise’, ’es6.symbol’ ], useBuiltIns: ’entry’ }] ]}

推薦這種方式添加polyfills而不是在源代碼中直接導入它們,因為如果這里列出的polyfill在browserflist的目標不需要,則它會被自動排除。 3. 如果該依賴交付了ES5 代碼,但使用了ES6+ 特性且沒有顯式列出需要的polyfill,請使用useBuiltIns: ’entry’ 然后在入口文件添加 import ’@babel/polyfill’。 這會根據browserlist 目標導入所有polyfill,這就不需要擔心依賴的polyfill問題了, 缺點:但是包含了一些沒有用到的polyfill所以最終的包可能會增加。(這也沒辦法,因為依賴沒有顯式列出需要的polyfill)

// 源代碼import ’@babel/polyfill’

// 輸出import ’core-js/modules/es7.string.pad-start’;import ’core-js/modules/es7.string.pad-end’;

Modern mode(現代模式)

什么是現代模式?現代模式是Vue CLI3提出的,為了解決支持更老的瀏覽器而為它們交付笨重的代碼的問題,使用官方所給的腳手架搭建好項目后,可以像下面這樣運行:

vue-cli-service build --modern

CLI3內置的Service服務會調用webpack構建編譯生成兩種類型的包,一種是現代版的包,它不會引入額外的polyfill。 一種是舊版的包,面向不支持的舊版瀏覽器,它會根據browserslist以及babel-preset-env的配置引入額外的polyfill。

現代的包會通過 <script type='module'> 在被支持的瀏覽器中加載;它們還會使用 <link rel ='modulepreload'> 進行預加載。 舊版的包通過 <script nomodule> 加載,會被支持ESM的瀏覽器忽略。

輸出對比未使用現代模式:

詳解Vue Cli瀏覽器兼容性實踐

Vue CLI 3 現代模式:

詳解Vue Cli瀏覽器兼容性實踐

使用了modern的方式,會在目錄下生成了兩種包:

詳解Vue Cli瀏覽器兼容性實踐

解釋

<script src='http://www.b3g6.com/xx/sxx.js' nomodule></script>

script標簽中聲明了nomodule特性的,會告訴支持ES2015 Module的瀏覽器,不要去執行這個腳本。這種標簽通常就是在老舊瀏覽器中使用的,引用的是帶有legacy標識的腳本。

<script type='module' src='http://www.b3g6.com/xxx/sss/a.js'></script>

當script標簽中聲明了type特性的值為module時,瀏覽器就會把里面的代碼視作一整個JS模塊,腳本內容的處理不受charset和defer屬性的影響,代碼的行為可能會與不指定為module時表現得不同。 (以前type的值一般是JS MIME值,在符合HTML5的瀏覽器,表示腳本為JS。但現在H5規范要求開發者省略這個屬性而不提供冗余的MIME類型。)

小結

Vue CLI 3提供了一整套的解決方案,里面提供了社區以及Vue官方的工具,包含Browserslist、Babel、@Babel/preset-env以及現代模式來共同處理瀏覽器兼容性這個大坑。CLI3構建出的工程會利用Browserslist去進行瀏覽器查詢(包括類型和版本),然后結合預設對Babel進行配置共同來針對目標環境對源代碼進行轉譯或引入Polyfills來解決兼容性問題。Moreover,現代模式同樣會根據這些設定以及目標環境去構建出適合運行在支持項目所有新特性的瀏覽器以及不支持特性的瀏覽器的兩種包。最后,預告一下,下一篇文章會結合Modernizr和CLI3來進行實踐 ---- 《瀏覽器兼容性實踐-Mondernizr篇》

Reference

Stat Counter

瀏覽器對H5、CSS3特性支持

目標瀏覽器配置表

browserlist

Vue CLI3

Babel

Babel AST format

到此這篇關于詳解Vue Cli瀏覽器兼容性實踐的文章就介紹到這了,更多相關Vue Cli瀏覽器兼容性內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Vue
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
成人影视亚洲图片在线| 日韩av在线播放中文字幕| 美女视频网站久久| 久久精品一区二区三区中文字幕| 久久精品福利| 日韩精品第一区| 一级欧洲+日本+国产| 香蕉精品999视频一区二区| 亚洲bt欧美bt精品777| 国产探花一区在线观看| 日韩综合在线| 老牛国产精品一区的观看方式| 日本欧美在线| 人人草在线视频| 色吊丝一区二区| 免费日韩一区二区| 国产精品午夜av| 99热精品久久| 视频国产精品| 日韩成人a**站| 视频在线观看91| 国产精品尤物| 香蕉久久精品| 日韩在线观看一区二区三区| 国产精品一区二区三区www| 成人午夜网址| 免费精品视频| 精品三级在线| 久久午夜视频| 欧美激情视频一区二区三区在线播放| 美女av在线免费看| 热久久国产精品| 日产午夜精品一线二线三线| 视频一区欧美日韩| 久久亚洲道色| 99在线观看免费视频精品观看| 91成人在线网站| 91精品国产自产在线观看永久∴ | 7777精品| 亚洲福利国产| 国产亚洲字幕| 欧美在线网站| 国产不卡av一区二区| 欧美中文字幕| 天堂中文av在线资源库| 日韩av电影一区| 美女久久久久| 精品视频在线你懂得| 免费观看日韩电影| 桃色一区二区| 免费在线亚洲| 蜜桃av一区二区在线观看| 高潮久久久久久久久久久久久久| 午夜久久av| 国产综合精品| 精品一区二区三区亚洲| 蜜桃视频一区二区三区在线观看| 日韩在线观看| 精品一区视频| 国产精品一在线观看| 热久久免费视频| 五月精品视频| 久久久久中文| 97在线精品| 免费在线播放第一区高清av| 蜜桃视频免费观看一区| 激情视频一区二区三区| 极品av在线| 风间由美中文字幕在线看视频国产欧美| 亚洲精品影院在线观看| 色爱av综合网| 高清一区二区| 精品一区视频| 久久亚洲资源中文字| 国产三级精品三级在线观看国产| 一区二区国产在线| 一区福利视频| 好吊日精品视频| 欧美精选一区二区三区| 日韩av免费| 亚洲天堂免费电影| 国产一区二区三区国产精品| 国产精品网站在线看| 97久久亚洲| 久久国产日韩欧美精品| 色狠狠一区二区三区| 免费看精品久久片| 亚洲自啪免费| 蜜桃一区二区三区在线| 蜜桃视频在线观看一区二区| 伊人久久亚洲| 亚洲天堂免费| 日本不卡一区二区| 日韩欧美四区| 日韩av午夜在线观看| 欧美综合社区国产| 国产精品欧美在线观看| 免费亚洲一区| 日本激情一区| 三级精品视频| 国内激情久久| 激情91久久| 亚洲精品精选| 国产精品中文字幕制服诱惑| 国产精品www.| 成人在线超碰| 91精品久久久久久久久久不卡| 日本国产精品| 亚洲一区中文| 亚洲18在线| 国产精品视频3p| 成人国产精品| 欧美在线亚洲| 日韩精品中文字幕一区二区| 国产欧美日韩一区二区三区在线| 久久精品资源| 91亚洲一区| 亚洲福利一区| 亚洲精品乱码久久久久久蜜桃麻豆 | 国产丝袜一区| 国产一区二区三区四区二区| 中文字幕高清在线播放| 亚洲天堂黄色| 亚洲精品影视| 麻豆精品久久久| av资源亚洲| 在线国产一区| 亚洲v天堂v手机在线| 免费日韩成人| 亚洲香蕉网站| 91欧美精品| 国产麻豆久久| 亚洲综合福利| 97精品一区二区| 亚洲深深色噜噜狠狠爱网站 | 欧美日韩一区二区三区在线电影| 高清在线一区| 国产精品婷婷| 麻豆成人在线观看| 国产精品日韩| 国产一区丝袜| 亚洲一区亚洲| 精品美女在线视频| 99视频一区| 精品国产午夜肉伦伦影院| 国产亚洲综合精品| 久久精品午夜| 巨乳诱惑日韩免费av| 久久精品伊人| 久久亚洲欧洲| www在线观看黄色| 日韩精品成人| 亚洲二区视频| 卡一卡二国产精品| 日韩精品一区第一页| 四虎8848精品成人免费网站| 美女91精品| 国产 日韩 欧美一区| 欧美天堂一区二区| 国产精品丝袜xxxxxxx| 亚洲黄色网址| 国产精品流白浆在线观看| 91精品二区| 国产一区精品福利| 欧美天堂一区二区| 石原莉奈在线亚洲二区| 久久天堂av| 国模大尺度视频一区二区| 四虎精品永久免费| 精品在线播放| 欧美久久天堂| 国产视频一区二| 蜜桃久久久久久| 午夜国产精品视频| 日韩国产网站| 久久精品亚洲| 日本免费新一区视频| 美女久久一区| 亚洲精品网址| 久久久久网站| 亚洲国产欧美日本视频| 鲁大师精品99久久久| 日韩国产欧美在线播放| 夜夜嗨一区二区| 久久久久久久久丰满| 福利一区和二区| 国产精品色在线网站| 最新亚洲国产| 丝袜美腿亚洲一区二区图片| 亚洲欧美一区在线| 久久久人人人| 婷婷成人在线| 久久亚洲专区| 日韩精品免费一区二区在线观看| 精品国产一区二区三区av片| 国产一级成人av| 欧美综合精品| 国产另类在线| 欧美激情麻豆| 色欧美自拍视频|