读 JavaScript 资源大全中文版:从语言到 UI 的生态地图
本文目录
完整映射原仓库 64 个主题,扩展为现代 JavaScript 工程选型指南,覆盖模块、测试、浏览器 API、媒体交互、供应链与维护。
本文围绕 jobbole/awesome-javascript-cn 做原创工程整理。项目来自 腾讯新闻前端团队 2022 年的 25 个 Awesome 项目推荐;上游 README 固定到 2020-12-26 commit 4a72e7015da022592a0d782e75e80992cc0231e6;快照含 64 个顶层主题、660 条外链记录(653 个不同目标),GitHub 未声明 SPDX 许可且根目录没有 LICENSE 下方保留固定版本入口。
仓库内容地图
- 完整保留依赖/构建、测试/QA、应用架构、语言/数据、内容/媒体、UI/交互和扩展资源主题
- 补充浏览器 ESM 与 Node ESM/CJS、package exports、tree-shaking 和依赖边界
- 区分测试框架、断言、覆盖率、runner、组件测试与 E2E
- 覆盖 API/SDK、CMS、模板、静态生成、客户端路由与服务端授权边界
- 梳理日期/本地化、存储、函数式/响应式、跨标签页通信、IntersectionObserver
- 说明编辑器、文件、表格、图表、地图、音视频、语音、图像和机器学习组件的工程成本
- 给出无障碍、性能、供应链、安全、许可证与退出方案的选型检查表
怎么读才有收获
先把目录当作“能力问题地图”,写出当前应用真正需要解决的场景,再比较原生平台能力和少量候选库。本文按固定 README 的所有顶层目录重排并逐类说明;项目状态、版本和许可要在实际选型时回到官方来源核验。
一、先读懂这份资源地图的年代与边界
固定快照来自 jobbole/awesome-javascript-cn 的 README commit 4a72e7015da022592a0d782e75e80992cc0231e6(2020-12-26)。这份目录有 64 个顶层主题、660 条外链记录、653 个不同目标;GitHub API 没有声明 SPDX 许可,仓库根目录也没有 LICENSE。本文完整映射它的主题范围并重新撰写工程说明,不把 660 条第三方链接编排整份搬进站内;原仓库固定入口留在文末。目录中的项目名称代表曾经被收录,不代表今天仍维护、兼容或安全。
读这种 Awesome 清单,先把“能力类别”和“具体产品”分开。类别可以帮助发现问题空间;产品则必须按当前项目的运行时、团队能力、浏览器支持、数据敏感度、许可和维护情况重新选择。README 的更新日期、包的最近发布、漏洞公告与支持矩阵都可能变化,选型当天必须回到项目官方资料核验。
二、完整目录映射:64 个主题如何归位
下表保留上游 README 的全部顶层主题标题,按工程决策重新分组。测试框架之下另含框架、断言、覆盖率和运行器;表单组件之下另含输入、日历、选择器、文件上传和其它。
| 工程域 | 上游目录主题 |
|---|---|
| 依赖与构建 | 包管理器、组件管理器、加载器、打包工具、类型检测、静态页面生成器、Boilerplates、框架、ES6 |
| 测试与质量 | 测试框架(框架/断言/覆盖率/运行器)、QA 工具、基准测试 |
| 应用架构 | MVC 框架和库、基于 Node 的 CMS 框架、模板引擎、路由、控制流、SDK、API |
| 语言与数据 | 函数式编程、响应式编程、数据结构、日期、字符串、数字、存储、颜色、国际化和本地化、正则表达式、日志、安全性 |
| 内容与专业能力 | 文章和帖子、数据可视化、时间轴、电子表格、编辑器、文档、文件、语音命令、流媒体、视觉检测、机器学习、浏览器检测 |
| 界面与交互 | UI、代码高亮、加载状态、验证、键盘封装器、导览与指南、通知、幻灯片、滑块控件、表单组件(输入/日历/选择器/文件上传/其它)、提示、模态框和弹出框、滚动、菜单、表格/栅格、手势 |
| 媒体与扩展 | 地图、视频/音频、动画、图片处理、大杂烩(含其他 Awesome 前端资源系列) |
目录不等于依赖清单
“文章和帖子”是学习入口,不是运行时依赖;“框架”可能包含已过时的整套方案;“浏览器检测”要先问能否用标准 feature detection;“安全性”类目更不能替代威胁建模和服务端授权。把 64 个主题当作检查需求是否被覆盖的索引,比把它们当作 64 个需要安装的类别更有用。
三、从语言、模块和打包链开始
先确认代码跑在哪里:浏览器、Node.js、边缘运行时、小程序还是 Electron。相同的 JavaScript 语法并不意味着相同的全局对象、文件系统能力、网络限制或模块解析规则。浏览器原生 ESM 使用 URL/路径解析;Node 项目还要处理 ESM 与 CommonJS、文件扩展名、package.json 的 type、exports 和条件入口。应用开发通常依赖构建器解析别名、CSS、图片和环境变量;库作者还要定义消费者可稳定使用的公开入口。
包管理器负责依赖图和锁文件;加载器/编译转换负责把源码或资源变成目标构建器理解的模块;打包器分析依赖图、输出 chunk 和资源。Babel/TypeScript 转译、类型检查、压缩、CSS 预处理和 bundling 是不同职责,不要因为一条旧教程把它们串在一起就认为必须用同一工具完成。优先从仓库已有配置和脚本还原真实链路,再改工具。
包的公开 API 要有清晰边界。正确配置 ESM/CJS 双入口和类型声明时,要在干净的消费者项目里分别测试 import、require、TypeScript 与目标 bundler;不要只在包仓库自身测试相对路径。exports 可限制公开子路径,减少消费者依赖内部文件,但也可能改变旧版本 Node 或构建工具的解析结果,因此需要定义兼容矩阵。
{
"type": "module",
"exports": {
".": {
"types": "./dist/index.d.ts",
"import": "./dist/index.js",
"require": "./dist/index.cjs"
}
}
}
Tree-shaking 依赖静态可分析的模块边界和准确的副作用声明;它不是包管理器承诺的自动瘦身。全量语言包、全局注册、CSS 注入、polyfill、CommonJS 动态 require 与 barrel 文件副作用都可能改变结果。对应用要查看实际生产 bundle;对库要验证消费者产物,并避免把有副作用的入口错误标成无副作用。
四、测试与质量:把四种“测试工具”分清
原目录把测试框架、断言、覆盖率和运行器分别列出。现代工具可能把它们整合到一个包里,但概念仍不同:测试框架提供生命周期和用例组织;断言表达期望;coverage 统计被执行的代码区域;runner 负责发现、隔离、并行和输出。覆盖率数字不是质量结论,尤其分支、错误路径、异步取消和权限边界往往比行覆盖率更重要。
单元测试验证纯函数和边界条件;组件测试验证交互、语义和状态;端到端测试验证真实浏览器里的关键用户流程。QA 不只是 bug 清单,还包括浏览器/设备矩阵、无障碍、性能、网络失败、国际化、迁移和发布回滚。基准测试要固定运行时、硬件、输入分布、预热和重复次数;单次最快数字无法支撑性能选型。
适合自动化的最小质量门禁包括:格式/静态分析、类型检查、单元与组件测试、关键流程 E2E、依赖审计、构建产物检查。对视觉和媒体页面,再检查移动端布局、键盘操作、替代文本、加载失败、减少动态效果与慢网。测试应该按风险配置:登录、支付、文件上传、权限和跨租户缓存通常比纯展示组件需要更强的回归保护。
五、应用架构和服务端资源
MVC、Node CMS、模板引擎和静态站点生成器解决的问题并不相同。选择前明确数据由谁拥有、页面如何渲染、内容如何编辑、认证在哪里完成、缓存如何失效、构建与发布由谁负责。前端路由只控制导航,不授权数据;浏览器中的环境变量也不是秘密存储。需要权限的资源必须由服务端按用户、租户和对象逐次判定。
API/SDK 设计先稳定资源标识、错误结构、分页、幂等性和超时语义,再封装客户端。封装层应保留取消请求、重试策略、可观测 trace id 和明确错误类型;不要把所有失败都变成空数组或静默重试。模板和 CMS 渲染用户内容时,要区分纯文本、Markdown 与 HTML,并对输出上下文做编码或经过可信 sanitizer。
控制流与路由要覆盖直接刷新、深链接、返回/前进、未知路由、权限失败和异步加载失败。静态页面适合内容稳定、构建期可确定的场景;个性化页面需要谨慎处理缓存键和用户数据,不能因用了静态生成就忽视访问控制。Boilerplate 适合学习结构,不应未经清理复制默认密钥、旧依赖和演示账号。
六、数据与浏览器能力:优先原生,再评估封装
日期、数字、字符串、颜色与本地化经常有地区和格式边界。内部以明确的数据类型保存事实,在展示层使用 Intl 等平台能力;不要用格式化后的本地字符串再做计算。时区要区分 UTC 时间点和用户所在地的日历日期。正则表达式需要限制输入长度,避免灾难性回溯造成 ReDoS;复杂语法优先用成熟 parser。
存储目录覆盖内存、URL、Cookie、session/local storage、IndexedDB 与服务端持久化。选择时说明生命周期、容量、跨标签页行为、清理时机和敏感性。不要在 localStorage 放高风险长期凭证;Cookie 要正确配置 Secure、HttpOnly、SameSite 与作用域。浏览器本地缓存不能成为唯一数据源,也不能用于服务端权限判断。
函数式和响应式编程是组织数据流的方式,不是所有代码都要套一套库。不可变更新、纯 reducer 和组合式操作有助于测试;响应式订阅要有结束条件,防止页面切换后 observer、subscription 或 effect 继续运行。数据结构按复杂度和访问模式选择,先测真实瓶颈,不要为了“高级”换掉可读的普通对象或数组。
跨标签页同步可以选 BroadcastChannel、storage event、SharedWorker 或服务端推送。广播消息是同源上下文之间的协调信号,不是安全边界:消息中不要放密码、访问令牌或未经服务端校验的授权结果。为消息加版本、类型、有限 payload 和来源策略,并在关闭标签页/登出时关闭 channel 和清理状态。
const channel = new BroadcastChannel("app-session-v1");
channel.addEventListener("message", event => {
const message = event.data;
if (!message || message.type !== "session-invalidated") return;
if (message.version !== 1) return;
clearPrivateClientState();
});
function disposeSessionSync() {
channel.close();
}
仅广播“状态需要重新校验”,而不是广播谁有权访问什么。每个标签页都应向服务端确认当前会话;服务端仍是身份和授权的唯一可信来源。
七、内容、媒体与专业组件
编辑器、文档、文件和电子表格组件的关键成本通常不是初始安装,而是输入法、焦点、快捷键、粘贴、撤销、协作、导出、文件大小、内存与移动端触控。先定义文档模型、保存协议、冲突策略和可访问性交互,再比较候选组件。富文本和 Markdown 都要将编辑模型与预览渲染分开;原始 HTML、链接协议和上传图片必须经过安全处理。
图表、时间轴、表格和地图首先要确认数据规模、交互密度、响应式策略和无障碍需求。不要默认把几万行全部渲染到 DOM;列表虚拟化、聚合或分页可能比换一个图表库更重要。地图、视觉检测和机器学习还涉及数据来源、隐私、模型大小、设备性能和授权,不能只看 Demo 是否能运行。
音频/视频/流媒体要设计缓冲、自动播放限制、字幕、倍速、键盘控制、移动网络和错误重试;大文件播放应考虑 Range 请求和 CDN。语音命令要给出可见的收音状态、权限说明和不支持时的替代操作。图片处理需要控制解码尺寸、内存、方向、透明度、导出格式与元数据隐私。动画与滑块要支持暂停、键盘和 prefers-reduced-motion。
UI 基础能力覆盖加载状态、验证、提示、模态框、菜单、键盘导航、通知、幻灯片、手势和表单输入。把每个组件的状态机列出来:初始、加载、成功、空、错误、禁用、提交中。弹窗处理焦点进入/返回、Escape 和滚动锁;表单将客户端提示与服务端最终校验分开;文件上传校验 MIME、扩展名、大小和服务端内容,不信任文件名。验证和提示不能只靠颜色表达,也不能覆盖用户输入。
浏览器检测优先 feature detection;只有确实影响功能时才分支。IntersectionObserver 适合延迟加载、视口进入和可见性阈值观察,不应用滚动事件加密集布局查询模拟。回调在主线程执行,批量观察并及时 unobserve/disconnect;图片解码、长任务和布局读写仍需单独优化。
const observer = new IntersectionObserver(entries => {
for (const entry of entries) {
if (!entry.isIntersecting) continue;
const image = entry.target;
image.src = image.dataset.src;
observer.unobserve(image);
}
}, { rootMargin: "160px 0px" });
document.querySelectorAll("img[data-src]").forEach(image => observer.observe(image));
function disposeLazyImages() {
observer.disconnect();
}
生产实现还要保留宽高或 aspect-ratio 防止布局跳动,设置失败占位图,并处理不支持 IntersectionObserver 的目标环境。懒加载不是越多越好:首屏关键图通常应优先加载。
八、依赖选型、维护与迁移检查
- 写清需求:列出用户场景、输入规模、目标浏览器/运行时、性能预算和失败后的替代路径。
- 先看平台能力:确认原生 API 是否覆盖需求、兼容性如何;只为缺失能力引入库。
- 评估候选项目:看最近发布与维护者响应、活跃问题、安全公告、支持矩阵、依赖树、包体、许可证、无障碍和 SSR 行为。
- 做小型验证:用真实数据跑关键流程,在目标设备测加载、渲染、内存和错误恢复;单独验证 ESM/CJS、TypeScript 和生产构建。
- 建立退出方案:隔离适配层,记录版本与升级约束,避免业务代码到处直接依赖库的内部 API。
- 定期复核:锁文件可复现安装,自动化审计发现已知风险;审核升级差异后再更新,不把 audit 自动修复无审查地推到生产。
npm audit 能报告依赖中已知漏洞,但它不等于完整安全审计,也不能证明一个包没有恶意行为。结合 lockfile review、来源可信度、维护者变更、最小权限、可复现构建和运行时监测。对库升级采用小步 PR 与回归测试;对高风险主版本迁移准备双版本验证和回滚。
建议的项目评审表
| 维度 | 需要回答的问题 |
|---|---|
| 适配 | 支持哪些浏览器、Node/小程序版本、框架与模块系统? |
| 交付 | 产物是否 tree-shake、分包、SSR 安全,是否影响首屏? |
| 体验 | 键盘、读屏、触屏、输入法、窄屏和减少动态效果如何? |
| 可靠 | 加载失败、离线、请求取消、重试和卸载时如何处理? |
| 安全 | 是否执行 HTML、读取存储、接触文件或向外发数据? |
| 维护 | 许可证、发布节奏、漏洞响应、迁移成本和退出路径是什么? |
当前官方参考
- MDN:JavaScript Modules
- Node.js:Modules 与包边界
- MDN:BroadcastChannel
- MDN:Intersection Observer API
- Playwright:测试入门与浏览器覆盖
- npm:审计依赖中的已知安全漏洞
上游快照与使用边界
原 README 固定快照 commit 为 4a72e7015da022592a0d782e75e80992cc0231e6,包含 64 个顶层目录、660 条外链记录(653 个不同 URL);该仓库未声明 SPDX 许可,也没有根目录 LICENSE。本文逐项覆盖其主题分类并提供原创解释,不转载整份链接目录、第三方文章正文或项目介绍。上游索引最后推送于 2022 年,许多条目更早;请将它视为历史发现地图,并在采用前核查官方文档、维护状态和许可。
动手路线
- 为编辑器、文件上传和数据可视化分别写需求/兼容/安全/退出矩阵。
- 用浏览器原生 ESM、BroadcastChannel 或 IntersectionObserver 重做一个小功能,再衡量引入库是否真正降低复杂度。
- 每季度复核直接依赖的维护状态、许可证、安全公告与生产 bundle 影响。
使用边界
上游 README 是 2020 年的历史清单,仓库未声明 SPDX 许可证且没有根目录 LICENSE。本文完整覆盖目录主题并提供原创工程解释,不复制 660 条第三方链接编排或链接目标正文。
原始入口
Live Notes
留言提交后会先进入审核,审核通过后对其他读者公开。