一个使用 Rust 编写的超快 Node.js HTML 解析和操作插件。它提供了一套符合标准的 DOM API,与浏览器内置的 DOMParser 保持一致。
- 符合标准:类型定义对齐
lib.dom.d.ts—— 使用Node、Element、Document、Text、Comment等标准 DOM 接口。 - 高性能的 DOM 解析和操作
- 通过 NAPI-RS 暴露简单的 JavaScript API
- 专为服务端和 CLI HTML 处理而设计
- 使用 Rust 编写,兼顾速度与安全性
yarn add domparser-rs
# 或者
npm install domparser-rsconst { DOMParser } = require('domparser-rs');
const parser = new DOMParser();
const doc = parser.parseFromString('<div id="foo" class="bar">hello <span>world</span></div>', 'text/html');
const div = doc.querySelector('div');
console.log(div.getAttribute('id')); // "foo"
console.log(div.textContent); // "hello world"
div.setAttribute('title', 'my-title');
console.log(div.outerHTML); // <div id="foo" class="bar" title="my-title">hello <span>world</span></div>class DOMParser {
parseFromString(string: string, type: DOMParserSupportedType): Document;
}使用指定的 MIME 类型(例如 "text/html")解析字符串并返回 Document。
继承自 Node。表示整个 HTML 文档。
| 属性 | 类型 | 描述 |
|---|---|---|
doctype |
DocumentType | null |
当前文档关联的 DTD |
documentElement |
Element | null |
文档的根元素(例如 <html>) |
head |
Element | null |
<head> 元素 |
body |
Element | null |
<body> 元素 |
title |
string |
文档标题 |
children |
Element[] |
子元素 |
childElementCount |
number |
子元素数量 |
firstElementChild |
Element | null |
第一个子元素 |
lastElementChild |
Element | null |
最后一个子元素 |
createElement(tagName: string): ElementcreateTextNode(data: string): TextcreateComment(data: string): CommentcreateDocumentFragment(): DocumentFragmentcreateProcessingInstruction(target: string, data: string): ProcessingInstructionimportNode<T extends Node>(node: T, deep?: boolean): TadoptNode<T extends Node>(node: T): T
getElementById(elementId: string): Element | nullgetElementsByClassName(classNames: string): Element[]getElementsByTagName(qualifiedName: string): Element[]querySelector(selectors: string): Element | nullquerySelectorAll(selectors: string): Element[]append(...nodes: (Node | string)[]): voidprepend(...nodes: (Node | string)[]): void
继承自 Node。表示一个 HTML 元素。
| 属性 | 类型 | 描述 |
|---|---|---|
tagName |
string |
标签名 |
localName |
string |
限定名称的本地部分 |
namespaceURI |
string | null |
命名空间 URI |
prefix |
string | null |
命名空间前缀 |
id |
string |
id 属性 |
className |
string |
class 属性 |
classList |
DOMTokenList |
类名的实时 token 列表 |
dataset |
Record<string, string> |
data 属性 |
innerHTML |
string |
内部 HTML 内容 |
outerHTML |
string |
外部 HTML 内容 |
children |
Element[] |
子元素 |
childElementCount |
number |
子元素数量 |
firstElementChild |
Element | null |
第一个子元素 |
lastElementChild |
Element | null |
最后一个子元素 |
previousElementSibling |
Element | null |
前一个兄弟元素 |
nextElementSibling |
Element | null |
后一个兄弟元素 |
getAttribute(qualifiedName: string): string | nullsetAttribute(qualifiedName: string, value: string): voidremoveAttribute(qualifiedName: string): voidtoggleAttribute(qualifiedName: string, force?: boolean): booleanhasAttribute(qualifiedName: string): booleanhasAttributes(): booleangetAttributeNames(): string[]getAttributeNS(namespace: string | null, localName: string): string | nullsetAttributeNS(namespace: string | null, qualifiedName: string, value: string): voidremoveAttributeNS(namespace: string | null, localName: string): voidhasAttributeNS(namespace: string | null, localName: string): boolean
querySelector(selectors: string): Element | nullquerySelectorAll(selectors: string): Element[]getElementById(id: string): Element | nullgetElementsByClassName(classNames: string): Element[]getElementsByTagName(qualifiedName: string): Element[]closest(selectors: string): Element | nullmatches(selectors: string): boolean
append(...nodes: (Node | string)[]): voidprepend(...nodes: (Node | string)[]): voidbefore(...nodes: (Node | string)[]): voidafter(...nodes: (Node | string)[]): voidremove(): voidreplaceWith(...nodes: (Node | string)[]): voidinsertAdjacentHTML(position: InsertPosition, html: string): voidinsertAdjacentText(position: InsertPosition, text: string): voidinsertAdjacentElement(position: InsertPosition, element: Element): Element | null
所有 DOM 节点的基础接口。
| 属性 | 类型 | 描述 |
|---|---|---|
nodeType |
number |
节点类型 |
nodeName |
string |
节点名称 |
nodeValue |
string | null |
节点值 |
textContent |
string | null |
文本内容 |
parentNode |
Node | null |
父节点 |
parentElement |
Element | null |
父元素 |
firstChild |
Node | null |
第一个子节点 |
lastChild |
Node | null |
最后一个子节点 |
previousSibling |
Node | null |
前一个兄弟节点 |
nextSibling |
Node | null |
后一个兄弟节点 |
childNodes |
Node[] |
所有子节点 |
ownerDocument |
Document | null |
所属文档 |
appendChild<T extends Node>(node: T): TremoveChild<T extends Node>(child: T): TinsertBefore<T extends Node>(node: T, child: Node | null): TreplaceChild<T extends Node>(node: Node, child: T): TcloneNode(deep?: boolean): Nodecontains(other: Node | null): booleanhasChildNodes(): booleangetRootNode(): Nodenormalize(): voidisSameNode(otherNode: Node | null): booleanisEqualNode(otherNode: Node | null): booleancompareDocumentPosition(other: Node): numberlookupNamespaceURI(prefix: string | null): string | nulllookupPrefix(namespace: string | null): string | nullisDefaultNamespace(namespace: string | null): boolean
继承自 Node。Text、Comment 和 ProcessingInstruction 的基础接口。
data: stringreadonly length: numbersubstringData(offset: number, count: number): stringappendData(data: string): voidinsertData(offset: number, data: string): voiddeleteData(offset: number, count: number): voidreplaceData(offset: number, count: number, data: string): void
splitText(offset: number): Text
readonly target: string
readonly name: stringreadonly publicId: stringreadonly systemId: string
getElementById(elementId: string): Element | nullquerySelector(selectors: string): Element | nullquerySelectorAll(selectors: string): Element[]
npm install
npm run build
npm testnpm run benchmark更多使用示例和高级 API,请参阅仓库中的源代码和测试。