好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Skypack布局前端基建实现过程详解

引言

已经有越来越多前端开发者放弃 webpack ,改用 vite 作为项目打包工具。

其中最主要的原因是 ——  vite 在开发环境基于 ESM 规范实现的 Nobundle 模式,节省了 代码打包 的时间(当然,也有 ESBuild 的功劳)。

而在生产环境,当前仍有打包的需求。

随着浏览器的迭代, ESM 规范兼容性越来越好,终有一天会进入 生产环境大面积可用 的状态。

届时 生产环境打包 将不再是刚需。

另一方面,从 HTTP 协议的角度看,在 HTTP/1.1 时代,多个模块被打包成一个文件能减少 浏览器并发请求数 ,达到优化目的。

但在 HTTP/2 多路复用普及后,这么做的意义就不大了。

可以说,当这些基建成熟后,生产环境使用 ESM 模块是水到渠成的事情。

很多团队预感到这点,很早就开始布局相关产品。今天要介绍的 Skypack 就是这样一款产品。

不一样的CDN

Skypack 首次发布于19年6月(曾用名 Pika CDN ),是一款 基于ESM规范的CDN服务 。

在浏览器中,常见的 CDN 服务通常以 script 标签的形式引入 UMD 规范的代码,以 ReactDOM 举例:

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

代码执行后会在全局暴露对象 window.ReactDOM 。

一些情况下,一个包还会依赖其他包,比如 ReactDOM 还会依赖如下3个包:

React

scheduler

object-assign

为了应对这种情况,在生产环境开发者通常会将第三方依赖统一打包。

而 Skypack 以 ESM 规范引入代码:

// 在业务代码中引入如下语句
import ReactDOM from 'https://cdn.skypack.dev/react-dom';

浏览器会依次发起对 包及其依赖 的请求:

配合上浏览器的Module Preload特性,可以让这些资源统一预加载。

这就解决了第三方依赖需要打包的问题。

按需polyfill

如果你访问上述 CDN 链接( https://cdn.skypack.dev/react... ),会发现返回的结果并不是 ReactDOM 的代码,而是下面两句 export 语句:

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';

语句的背后才是 ESM 规范的 ReactDOM 代码。

之所以这么做是因为: Skypack 会根据 目标浏览器的UA 为浏览器提供适合的包。

在高版本 Chrome 中的代码不需要 polyfill ,而在低版本 IE 中的代码需要 polyfill ,所以不同目标浏览器拿到的是不同的 ReactDOM 代码。

上述 export 语句中哈希(oZ1BXZ5opQ1DbTh7nu9r)的不同就对应 同一个版本的ReactDOM经过不同程度polyfill后的不同结果 。

此外,在 url 后加 min 能得到 压缩后的代码 :

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

接下来让我们看看 Skypack 是如何处理请求的。

处理请求的流程

并不是所有包都有 ESM 规范的产物( React 就没有),当以如下 url 格式访问任意包时:

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

如果之前从未有人访问过这个包,则会 构建包及其依赖的ESM产物 并返回。

比如 ReactDOM 本身只提供 UMD 规范的产物,第一个访问他的 Skypack CDN 链接的用户会经历如下步骤:

收集 ReactDOM 及其依赖 将 ReactDOM 及其依赖变为 ESM 规范 构建不同 polyfill 程度的 ESM 产物 根据目标浏览器 UA 返回对应的 ReactDOM

在 ReactDOM 的产物代码中可以看到,他依赖的三个包已经转为 ESM 规范:

总结

除了 Skypack 外, esm.sh 也是类似功能的 ESM CDN 服务。

等到前端基建成熟的那天,相信这些 ESM CDN 服务一定能大放异彩。

以上就是Skypack布局前端基建实现过程详解的详细内容,更多关于Skypack布局前端基建的资料请关注其它相关文章!

查看更多关于Skypack布局前端基建实现过程详解的详细内容...

  阅读:45次