最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Skypack布局前端基建實(shí)現(xiàn)過(guò)程詳解

 更新時(shí)間:2022年07月14日 10:51:17   作者:卡頌  
這篇文章主要為大家介紹了Skypack布局前端基建過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

已經(jīng)有越來(lái)越多前端開(kāi)發(fā)者放棄webpack,改用vite作為項(xiàng)目打包工具。

其中最主要的原因是 —— vite在開(kāi)發(fā)環(huán)境基于ESM規(guī)范實(shí)現(xiàn)的Nobundle模式,節(jié)省了代碼打包的時(shí)間(當(dāng)然,也有ESBuild的功勞)。

而在生產(chǎn)環(huán)境,當(dāng)前仍有打包的需求。

隨著瀏覽器的迭代,ESM規(guī)范兼容性越來(lái)越好,終有一天會(huì)進(jìn)入生產(chǎn)環(huán)境大面積可用的狀態(tài)。

屆時(shí)生產(chǎn)環(huán)境打包將不再是剛需。

另一方面,從HTTP協(xié)議的角度看,在HTTP/1.1時(shí)代,多個(gè)模塊被打包成一個(gè)文件能減少瀏覽器并發(fā)請(qǐng)求數(shù),達(dá)到優(yōu)化目的。

但在HTTP/2多路復(fù)用普及后,這么做的意義就不大了。

可以說(shuō),當(dāng)這些基建成熟后,生產(chǎn)環(huán)境使用ESM模塊是水到渠成的事情。

很多團(tuán)隊(duì)預(yù)感到這點(diǎn),很早就開(kāi)始布局相關(guān)產(chǎn)品。今天要介紹的Skypack就是這樣一款產(chǎn)品。

不一樣的CDN

Skypack首次發(fā)布于19年6月(曾用名Pika CDN),是一款基于ESM規(guī)范的CDN服務(wù)。

在瀏覽器中,常見(jiàn)的CDN服務(wù)通常以script標(biāo)簽的形式引入UMD規(guī)范的代碼,以ReactDOM舉例:

<script crossorigin src="https://unpkg.com/react-dom@18.2.0/umd/react-dom.development.js"></script>

代碼執(zhí)行后會(huì)在全局暴露對(duì)象window.ReactDOM

一些情況下,一個(gè)包還會(huì)依賴(lài)其他包,比如ReactDOM還會(huì)依賴(lài)如下3個(gè)包:

React

scheduler

object-assign

為了應(yīng)對(duì)這種情況,在生產(chǎn)環(huán)境開(kāi)發(fā)者通常會(huì)將第三方依賴(lài)統(tǒng)一打包。

SkypackESM規(guī)范引入代碼:

// 在業(yè)務(wù)代碼中引入如下語(yǔ)句
import ReactDOM from 'https://cdn.skypack.dev/react-dom';

瀏覽器會(huì)依次發(fā)起對(duì)包及其依賴(lài)的請(qǐng)求:

配合上瀏覽器的Module Preload特性,可以讓這些資源統(tǒng)一預(yù)加載。

這就解決了第三方依賴(lài)需要打包的問(wèn)題。

按需polyfill

如果你訪問(wèn)上述CDN鏈接(https://cdn.skypack.dev/react...),會(huì)發(fā)現(xiàn)返回的結(jié)果并不是ReactDOM的代碼,而是下面兩句export語(yǔ)句:

export * from '/-/react-dom@v17.0.1-oZ1BXZ5opQ1DbTh7nu9r/dist=es2019,mode=imports/optimized/react-dom.js';
export {default} from '/-/react-dom@v17.0.1-oZ1BXZ5opQ1DbTh7nu9r/dist=es2019,mode=imports/optimized/react-dom.js';

語(yǔ)句的背后才是ESM規(guī)范的ReactDOM代碼。

之所以這么做是因?yàn)椋?code>Skypack會(huì)根據(jù)目標(biāo)瀏覽器的UA為瀏覽器提供適合的包。

在高版本Chrome中的代碼不需要polyfill,而在低版本IE中的代碼需要polyfill,所以不同目標(biāo)瀏覽器拿到的是不同的ReactDOM代碼。

上述export語(yǔ)句中哈希(oZ1BXZ5opQ1DbTh7nu9r)的不同就對(duì)應(yīng)同一個(gè)版本的ReactDOM經(jīng)過(guò)不同程度polyfill后的不同結(jié)果。

此外,在url后加min能得到壓縮后的代碼

import ReactDOM from 'https://cdn.skypack.dev/react-dom?min';

接下來(lái)讓我們看看Skypack是如何處理請(qǐng)求的。

處理請(qǐng)求的流程

并不是所有包都有ESM規(guī)范的產(chǎn)物(React就沒(méi)有),當(dāng)以如下url格式訪問(wèn)任意包時(shí):

// xxx替換為任意包名
import React from 'https://cdn.skypack.dev/xxx';

如果之前從未有人訪問(wèn)過(guò)這個(gè)包,則會(huì)構(gòu)建包及其依賴(lài)的ESM產(chǎn)物并返回。

比如ReactDOM本身只提供UMD規(guī)范的產(chǎn)物,第一個(gè)訪問(wèn)他的Skypack CDN鏈接的用戶(hù)會(huì)經(jīng)歷如下步驟:

  • 收集ReactDOM及其依賴(lài)
  • ReactDOM及其依賴(lài)變?yōu)?code>ESM規(guī)范
  • 構(gòu)建不同polyfill程度的ESM產(chǎn)物
  • 根據(jù)目標(biāo)瀏覽器UA返回對(duì)應(yīng)的ReactDOM

ReactDOM的產(chǎn)物代碼中可以看到,他依賴(lài)的三個(gè)包已經(jīng)轉(zhuǎn)為ESM規(guī)范:

總結(jié)

除了Skypack外,esm.sh也是類(lèi)似功能的ESM CDN服務(wù)。

等到前端基建成熟的那天,相信這些ESM CDN服務(wù)一定能大放異彩。

以上就是Skypack布局前端基建實(shí)現(xiàn)過(guò)程詳解的詳細(xì)內(nèi)容,更多關(guān)于Skypack布局前端基建的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 以JS開(kāi)發(fā)為例詳解版本號(hào)的作用與價(jià)值

    以JS開(kāi)發(fā)為例詳解版本號(hào)的作用與價(jià)值

    這篇文章主要為大家介紹了以JS開(kāi)發(fā)為例詳解版本號(hào)的作用與價(jià)值詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Javascript中綁定click事件的四種方式介紹

    Javascript中綁定click事件的四種方式介紹

    今天小編就為大家分享一篇關(guān)于Javascript中綁定click事件的四種方式介紹,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-10-10
  • 項(xiàng)目中使用TypeScript的TodoList實(shí)例詳解

    項(xiàng)目中使用TypeScript的TodoList實(shí)例詳解

    這篇文章主要為大家介紹了項(xiàng)目中使用TypeScript的TodoList實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 微信小程序 網(wǎng)絡(luò)API Websocket詳解

    微信小程序 網(wǎng)絡(luò)API Websocket詳解

    這篇文章主要介紹了微信小程序 網(wǎng)絡(luò)API Websocket詳解的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • JS創(chuàng)建對(duì)象的四種方式

    JS創(chuàng)建對(duì)象的四種方式

    這篇文章主要給大家分享JS創(chuàng)建對(duì)象的四種方式,分別是字面量的方式去創(chuàng)建對(duì)象、使用new字符創(chuàng)建對(duì)象、自定義構(gòu)造函數(shù)、工廠模式創(chuàng)建對(duì)象,更多詳細(xì)內(nèi)容,請(qǐng)參考下面文章的具體內(nèi)容
    2021-11-11
  • typeScript?泛型使用和泛型接口結(jié)合

    typeScript?泛型使用和泛型接口結(jié)合

    本篇文章主要介紹?typeScript?中新增的泛型概念、泛型使用、泛型與接口結(jié)合等內(nèi)容。具有一定的參價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你有所幫助
    2022-02-02
  • 微信小程序 彈幕功能簡(jiǎn)單實(shí)例

    微信小程序 彈幕功能簡(jiǎn)單實(shí)例

    這篇文章主要介紹了微信小程序 彈幕功能簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • JavaScript?API?ResizeObserver使用示例

    JavaScript?API?ResizeObserver使用示例

    這篇文章主要為大家介紹了JavaScript?API?ResizeObserver的使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 深入淺出探究JavaScript中的async與await

    深入淺出探究JavaScript中的async與await

    任意一個(gè)名稱(chēng)都是有意義的,先從字面意思來(lái)理解。async 是“異步”的簡(jiǎn)寫(xiě),而 await 可以認(rèn)為是 async wait 的簡(jiǎn)寫(xiě)。所以應(yīng)該很好理解 async 用于申明一個(gè) function 是異步的,而 await 用于等待一個(gè)異步方法執(zhí)行完成。下文將帶你深入探究JavaScript中的async與await
    2021-09-09
  • 微信小程序中使用javascript 回調(diào)函數(shù)

    微信小程序中使用javascript 回調(diào)函數(shù)

    這篇文章主要介紹了微信小程序中使用javascript 回調(diào)函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2017-05-05

最新評(píng)論

上林县| 西宁市| 开平市| 开封县| 栾城县| 白山市| 桃园市| 托克逊县| 汉源县| 万宁市| 西和县| 太仆寺旗| 中江县| 宝丰县| 吴旗县| 宾阳县| 防城港市| 磴口县| 康马县| 白朗县| 云和县| 白玉县| 伊春市| 巴东县| 临漳县| 根河市| 信阳市| 纳雍县| 辽宁省| 房产| 玛纳斯县| 利辛县| 杨浦区| 阳山县| 侯马市| 孙吴县| 北碚区| 商城县| 罗源县| 吴旗县| 枣强县|