- 前端
- 教程
【免费下载链接】youmightnotneedjquery
本文基于 README.md 展开,深入 youmightnotneedjquery 这一「用原生 JavaScript 实现常见 jQuery 操作」的对照资源库,完整讲解其内容组织方式、
jquery.js / ie8.js / ie9.js / ie10.js / ie11.js / modern.js多版本文件命名与降级展示规则、新增对照组的贡献步骤,以及基于 Astro 的本地构建与发布流程。读完本文,你将掌握该仓库的目录约定、版本适配逻辑和构建命令,能够独立向项目添加新的 jQuery 替代方案对照。
一、项目定位:一份"原生态"的 jQuery 替代资源
youmightnotneedjquery 的 README 开篇即表明其定位:"A resource for doing thingsau naturel"——一份以"原生态(原生浏览器能力)"方式完成日常前端操作的资源库。它的核心思想是:jQuery 及其同类库本身很优秀,如果你的目标是快速开发应用,完全可以继续使用它们;但如果你正在开发一个库,则应慎重考虑是否真的需要把 jQuery 作为依赖——也许几行工具代码就足以替代,而当你只面向现代浏览器时,浏览器自带的 API 可能已经足够。
仓库将这一理念落到了实处:在 src/comparisons 目录下,每一类常见操作都提供了jQuery 写法与原生 JavaScript 写法的对照,并针对不同浏览器时代(IE8、IE9、IE10、IE11、现代浏览器)给出差异化的原生实现。站点的元信息在 src/pages/index.astro 中被概括为:"Examples of how to do common event, element, ajax and utility operations with plain javascript"——即覆盖事件、元素、Ajax 与工具函数四大类常见操作的纯 JavaScript 示例。
值得注意的立场:README 并不贬低 jQuery,而是强调"了解 jQuery 为你做了什么、没做什么"。项目本身建议,在 IE8 之后的时代,浏览器本身已经相当易于处理;而在 IE 时代结束后,浏览器原生能力更强,很多场景根本不需要额外依赖。
二、内容组织:categories → comparisons → engines 三层结构
2.1 目录结构约定
从 src/comparisons 的文件树可以看到,项目内容采用严格的三层目录结构:
- category(分类层):顶层目录,如
ajax、effects、elements、events、utils; - comparison(对照项层):每个分类下的具体操作子目录,例如
elements下的add_class、append、closest、val; - engines(引擎文件层):每个对照项目录下的具体代码文件,按浏览器/框架命名。
当前仓库实际收录的分类与对照项如下:
| 分类目录 | 对照项 |
|---|---|
| ajax | json、load、post、request |
| effects | fade_in、fade_out、hide、show、toggle |
| elements | add_class、after、append、append_to、before、children、clone、closest、contains、contains_selector、contents、create_elements、each、empty、filter、find_children、find_elements、find_selector、first、get_attributes、get_height、get_html、get_outer_html、get_style、get_text、get_width、has_class、index、inner_height、inner_width、is_hidden、is_visible、last、matches、matches_selector、next、offset、offset_parent、outer_height、outer_height_with_margin、outer_width、outer_width_with_margin、parent、parents、position、position_relative_to_viewport、prepend、prev、remove、remove_attributes、remove_class、replace_from_html、scroll_left、scroll_top、serialize、set_attributes、set_height、set_html、set_style、set_text、set_width、siblings、toggle_class、unwrap、val、wrap |
| events | click、delegate、off、on、ready、trigger_custom、trigger_native |
| utils | array_each、bind、deep_extend、extend、index_of、is_array、is_numeric、map、now、object_each、parse_html、parse_json、slice、to_array、trim、type |
其中effects分类还同时使用.css文件(如 fade_in/ie10.css、fade_in/modern.css),这说明引擎文件不限于 JS——CSS 同样可以作为"引擎"参与对照。
2.2 引擎文件命名规则
每个对照项目录内可以包含以下文件(按 README 约定,按需添加即可):
jquery.js:jQuery 写法(必选);ie8.js、ie9.js、ie10.js、ie11.js:面向对应版本 IE 的原生实现;modern.js:面向 Chrome/Safari/Firefox 等现代浏览器的原生实现;alternatives.json(可选,category 级或 comparison 级):推荐的可替代库链接。
例如 src/comparisons/ajax/request 目录同时含有ie8.js、ie9.js、jquery.js、modern.js,分别对应 jQuery 的$.ajax({...})与现代fetch写法;src/comparisons/elements/closest 则提供了ie8.js、ie9.js、ie10.js三种原生降级实现(closest方法在 IE10 之前不存在,需要手动 polyfill)。
2.3 关键的展示降级规则
README 的 Contributing 部分明确指出一条核心规则:
如果你提供了
ie8.js和ie9.js,那么ie9 版本会展示给那些寻找适用于 ie9、ie10、ie11 或现代 JS 解决方案的用户。
这意味着:针对较新浏览器编写的方案(ie9+)自动覆盖所有更新的目标环境;只有当用户声明需要支持更旧的 IE8 时,才回退到 ie8 版本。这正是 src/lib/newest-engine.ts 中getNewestEngine函数实现的逻辑:
export const engineOrder = ['jquery', 'ie8', 'ie9', 'ie10', 'ie11', 'modern']; export default function getNewestEngine( engines: string[], targetEngine?: string ): string { engines = [...engines]; engines.sort((a, b) => engineOrder.indexOf(b) - engineOrder.indexOf(a)); engines = engines.filter((engine) => engine !== 'jquery'); if (!targetEngine) { return engines[0]; } return ( engines.find( (engine) => engineOrder.indexOf(engine) <= engineOrder.indexOf(targetEngine) ) || engines[0] ); }其逻辑可概括为:
- 引擎按
engineOrder(jquery < ie8 < ie9 < ie10 < ie11 < modern)从新到旧排序,并剔除jquery; - 未指定目标版本时,直接返回最新的可用引擎(
engines[0],即modern优先); - 指定目标版本(如
ie9)时,返回第一个"新于或等于"目标版本的引擎;例如目标为ie9且只有ie8.js、ie9.js时,ie9排在ie8之前且其等级(index=2)小于等于目标等级(index=2),因此选中ie9,覆盖 ie9/ie10/ie11/modern 所有场景; - 若没有任何引擎满足条件,则回退到最新的可用引擎。
三、贡献新对照组的完整步骤(对应 README Contributing)
README 对"如何添加一个新的对照 section"给出了极简而明确的指引,结合源码可将其展开为如下可操作流程:
3.1 创建对照项目录与文件
在 src/comparisons 下(或已有分类中)创建一个以下划线命名的目录,例如src/comparisons/elements/toggle_class。目录内至少需要:
jquery.js——jQuery 写法的对照基准。例如 toggle_class/jquery.js 中为$(el).toggleClass(className);;- 按需添加的原生实现——
ie8.js、ie9.js、ie10.js、ie11.js、modern.js中你希望覆盖的任意组合。例如同一目录下的 ie8.js 展示了在不支持classList的 IE8 中如何手动拆分、判断、增删className;而 modern 版本(如果有)则直接使用classList.toggle。
目录命名与jquery.js的必选约束,在 src/lib/comparisons.ts 中有印证:读取时comparison.engines首先以jquery.js内容初始化,随后才处理其余引擎文件。
3.2 补充 Alternatives(可选)
分类目录或对照项目录中可放置alternatives.json,用于向用户推荐替代库。仓库现有示例如:
- 分类级:src/comparisons/ajax/alternatives.json(推荐
fetch库)、src/comparisons/effects/alternatives.json(animate.css、move.js、velocity.js)、src/comparisons/elements/alternatives.json(bonzo、$dom); - 对照项级:src/comparisons/elements/contains_selector/alternatives.json、src/comparisons/utils/extend/alternatives.json、src/comparisons/events/trigger_custom/alternatives.json 等。
从 comparisons.ts 与 comparisons.ts 的实现看,alternatives.json在分类与对照项两个层级都会被解析并剔除出引擎列表,随后在页面中以"Alternatives"链接列表形式渲染(见 index.astro)。
3.3 无需额外注册:文件树即数据源
这是本仓库最巧妙的设计:你不需要修改任何配置文件或注册表来添加对照项。构建时,src/lib/comparisons.ts 通过readfiletree递归读取src/comparisons目录的完整文件树,把目录结构直接当作数据源:
const fileTree: FileTree = await readFileTree( path.join(process.cwd(), 'src', 'comparisons') );注意这里使用的是process.cwd(),源码注释特别说明:Astro 必须在仓库根目录作为当前工作目录运行时运行,才能正确发现对照文件。随后代码会:
- 将每个顶层目录解析为 category,并读取(若存在)分类级
alternatives.json; - 将每个子目录解析为 comparison,强制以
jquery.js为基准,读取其余引擎文件; - 按
engineFile.split('.')拆分出引擎名与扩展名(如ie8.js→ie8+js,modern.css→modern+css); - 对每个引擎内的多段代码排序:JS 优先,其余按语言名排序(见 comparisons.ts);
- 最终通过
sort-keys对引擎(按engineOrder)、对照项、分类三级按键名排序,保证输出稳定(见 comparisons.ts)。
因此,贡献一个新对照项 = 新建一个目录并放置对应命名文件,其余交给构建管线自动完成。
四、本地构建与开发(对应 README Building)
README 明确指出:构建 YMNNJQ 需要Node.js,并在项目根目录执行以下命令:
npm install # 安装依赖 npm run dev # 构建并监听文件变化(开发模式) npm run build # 构建,不监听变化(生产构建)这些命令直接映射到 package.json 的scripts字段:
"scripts": { "dev": "astro dev", "build": "astro build", "format": "prettier -w ." }项目基于Astro(当前仓库锁定astro ^1.1.7)构建。补充说明:
npm run dev启动 Astro 的开发服务器,支持热更新监听,适合边新增对照项边预览;npm run build执行astro build输出静态站点;- 另有
npm run format通过 Prettier(含prettier-plugin-astro)格式化全仓库代码; - 构建产物会经过 astro.config.ts 中配置的
astro-compress集成插件压缩。
依赖栈中还包含readfiletree(递归读取文件树)、sort-keys(按键名排序,均被comparisons.ts使用)、@astrojs/prism(代码高亮,供 CodeBlock.astro 使用)、sass(样式预编译)与modern-normalize(样式重置)等,与上文的目录解析和代码渲染逻辑一一对应。
五、页面渲染与交互机制(源码级)
5.1 服务端渲染:默认展示最新引擎
src/pages/index.astro 在构建期调用getComparisons()拿到完整数据,逐层渲染侧边栏(分类 → 对照项锚点链接)与正文对照卡片。每个对照项渲染所有引擎代码块,但非最新引擎默认隐藏(见 index.astro):
<div class={classNames('engine', { hidden: engineName !== newestEngine && engineName !== 'jquery' })}>赞- 前端
- 教程
【免费下载链接】youmightnotneedjquery
相关推荐
用原生 JavaScript 替代 jQuery 的实战对照指南:You-Dont-Need-jQuery 项目精读
用原生 JavaScript 替代 jQuery 的实战对照指南:You Dont Need jQuery 项目精读 本文是一份以 You Dont Need
教程前端You-Dont-Need-jQuery 波兰语版指南解读:用原生 JavaScript 全面替代 jQuery 的 API 对照手册
You Dont Need jQuery 波兰语版指南解读:用原生 JavaScript 全面替代 jQuery 的 API 对照手册 本指南围绕仓库中的波兰语
教程前端You-Dont-Need-jQuery:用原生 JavaScript 全面替代 jQuery 的实战对照指南(土耳其语版)
You Dont Need jQuery:用原生 JavaScript 全面替代 jQuery 的实战对照指南(土耳其语版) 本文以仓库 README tr.m
教程前端