esm.sh与esm.run详细比较
esm.sh 与 esm.run 都是流行的 ES Module CDN 服务,但在背景、功能、兼容性和国内访问上差异明显。简单说:esm.sh 功能更强、更灵活、国内优化更好;esm.run 是 jsDelivr 旗下的轻量、稳定方案。
一、基本背景与归属
-
esm.sh
- 独立开源项目(GitHub: esm-dev/esm.sh)
- 口号:
A fast, smart, & global CDN for modern (ES2015+) web development - 自研架构,专注 ESM 转换与优化
- 全球节点 + 中国大陆优化(重要)
-
esm.run (ESM Run)
- jsDelivr 官方推出的 ESM 服务
- 依托 jsDelivr 现有 CDN 网络与运营
- 定位:轻量、可靠、兼容 npm 包的 ESM 分发
- 域名:
https://esm.run/
二、核心功能对比
1. 模块来源与格式
-
esm.sh
- 支持:npm、GitHub、JSR、pkg.pr.new
- 自动:CommonJS → ESM、依赖重写、Tree-shaking
- 内置 Node 核心模块 polyfill(fs/path 等浏览器兼容)
- 支持 TypeScript/JSX/Vue/Svelte 直接运行(
/x/路径)
-
esm.run
- 仅支持:npm 包(不支持 GitHub/JSR 等)
- 基础 CJS → ESM 转换
- 无内置 Node polyfill(依赖包自身兼容)
- 无 TS/JSX 实时编译
2. URL 语法与版本
-
esm.sh
https://esm.sh/[pkg]@[version]/[path]?opts https://esm.sh/react@18 https://esm.sh/x/types/react@18 # TS 类型- 完整 semver、标签、beta/next 支持
- 大量查询参数:
?dev/?min/?bundle/?external等
-
esm.run
https://esm.run/[pkg]@[version] https://esm.run/react@18.2.0- 标准版本范围
- 极少参数(基本靠默认)
3. 环境与运行时
-
esm.sh
- 浏览器、Deno、Node.js、Cloudflare Workers、Vercel Edge Func 等
unenv兼容层,跨环境一致性好- 开发/生产模式切换
-
esm.run
- 浏览器、Deno、Node.js
- 兼容层较弱,更依赖包本身适配
4. 类型(TypeScript)支持
- esm.sh:自动提供 .d.ts,
/x/types/路径专门用于类型 - esm.run:无内置类型支持
5. 国内访问(中国大陆)
- esm.sh:优化明显,有国内节点/线路优化,稳定性高
- esm.run:同 jsDelivr,偶尔受 DNS/网络波动影响
6. 开源与透明性
- esm.sh:完全开源(Go 后端),可自建
- esm.run:闭源服务,依托 jsDelivr 运营
三、性能与缓存
-
esm.sh
- 全球边缘节点 + 国内优化
- 精细缓存、按需构建、依赖拆分
-
esm.run
- jsDelivr 全球 CDN(Fastly/G-Core/Cloudflare)
- 缓存策略保守、更稳、但灵活性低
四、适用场景选择
选 esm.sh 更适合:
- 国内用户/站点(访问更稳)
- 需要 Node 模块(fs/path)在浏览器运行
- 直接用 TS/JSX/Vue 组件
- 复杂依赖、需要 bundle/tree-shaking 控制
- 多环境(Worker/Edge)一致运行
- 希望高度自定义构建参数
选 esm.run 更适合:
- 已信任/在用 jsDelivr
- 简单场景:纯前端、标准 npm 包
- 追求极简、稳定、少配置
- 国际用户为主
五、一句话总结
esm.sh = 全功能、强优化、国内友好、高度可定制;esm.run = jsDelivr 官方轻量 ESM,简单可靠、国际稳定。

浙公网安备 33010602011771号