菜单

URL 处理

相关源文件

本文档概述了 Node.js 根据 WHATWG URL 标准处理、解析和操作 URL 的方式。URL 处理是 Node.js 中一项基本功能,为网络操作、资源标识和 Web 功能提供支持。本文档重点介绍核心 URL 处理机制,包括解析、组件操作以及国际化域名(IDNA)的特殊处理。

有关基于 URL 处理构建的 HTTP 和网络功能的信息,请参阅 HTTP 和网络

Node.js 中 URL 处理概述

Node.js 在 URL 处理方面实现了 WHATWG URL 标准。该标准定义了 URL 的解析、验证、序列化和操作方式。该实现使用了两个主要依赖项:

  1. Ada - 一个用 C++ 编写的高性能 URL 解析器
  2. SimdUTF - 一个使用 SIMD 操作加速 UTF 处理的库

Node.js 中的 URL 处理功能提供以下能力:

  • 将 URL 字符串解析为结构化的 URL 对象
  • 根据标准验证 URL
  • 操作 URL 组件
  • 处理国际化域名(IDNA)
  • 处理查询参数

URL 组件

Node.js 中的 URL 由以下组件组成:

组件示例描述
协议httpsURL 的协议
用户名user用于认证的用户名
密码pass用于认证的密码
主机名example.com域名或 IP 地址
端口8080端口号
路径名/path/to/resource资源的路径
搜索?query=value查询参数
哈希#section片段标识符

完整的 URL 示例: https://user:pass@example.com:8080/path/to/resource?query=value#section

来源

URL 解析架构

Node.js 中的 URL 解析系统集成了原生代码和 JavaScript 接口,以提供高效的 URL 处理。

URL 解析流程

来源

URL 对象和组件处理

Node.js 中的 URL 对象提供了一个接口来访问和操作各种 URL 组件。该实现遵循 WHATWG URL 标准进行 URL 的解析和序列化。

URL 对象组件流程

来源

百分比编码和解码

Node.js 遵循 WHATWG URL 标准进行 URL 组件的百分比编码和解码。

组件需要编码的字符
路径名控制字符、空格、", #, <, >, ?, `, {, }, 字符 > 127
搜索控制字符、空格、", #, <, >, 字符 > 127
哈希控制字符、空格、", <, >, `, 字符 > 127

该实现使用查找表来高效地确定在不同 URL 组件中哪些字符需要编码。

字符编码过程

来源

国际化域名(IDNA)

Node.js 通过 Ada 库提供的 IDNA 处理能力支持国际化域名。这使得能够正确处理非 ASCII 域名。

IDNA 处理流程

来源

URL 验证

Node.js 提供了验证 URL 并检查其是否符合 WHATWG URL 标准的机制。URL.canParse() 静态方法允许检查一个字符串是否可以成功地解析为 URL。

URL 验证规则

验证过程会检查:

  1. 协议/方案的有效性
  2. 主机/主机名的格式
  3. 端口号范围(0-65535)
  4. 路径格式
  5. 特殊协议处理(http、https、file 等)
  6. 主机名的 IDNA 符合性

来源

URLSearchParams

URLSearchParams 接口提供了用于处理 URL 查询字符串的方法。它允许读取、修改和迭代查询参数。

URLSearchParams 操作

方法描述
append(name, value)追加一个新的键值对
delete(name, value?)按名称删除条目,可选地按值过滤
get(name)返回与名称关联的第一个值
getAll(name)返回与名称关联的所有值
has(name)返回参数是否存在
set(name, value)设置值,替换任何现有值
sort()对键值对进行排序
toString()返回序列化的查询字符串

来源

URL 模式匹配

Node.js 还包括一个 URLPattern API,用于将 URL 与模式匹配。这提供了一种比简单字符串匹配更灵活的方式来处理 URL。

URLPattern API 支持:

  • 通配符和命名组
  • 正则表达式语法
  • 特定组件的匹配
  • 匹配提取

来源

与 Node.js 核心的集成

URL 处理功能与 Node.js 的其他核心模块集成,特别是 HTTP 和网络组件。

来源

性能考量

Node.js 中的 URL 处理通过以下方式进行了优化:

  1. 原生代码集成:使用 C++ 实现执行性能关键型操作
  2. SIMD 加速:通过 simdutf 库进行 Unicode 处理
  3. 查找表:用于快速字符检查和转换
  4. 延迟解析:组件仅在需要时进行解析

来源

标准符合性

Node.js 致力于完全符合 WHATWG URL 标准。该实现经过 Web 平台测试(WPT)的测试,以确保与浏览器实现兼容。

WPT 测试涵盖:

  • URL 解析
  • URL 序列化
  • URL 组件的设置和获取
  • URLSearchParams 的行为
  • IDNA 处理
  • 百分比编码/解码

来源