Harper.js:基于 WebAssembly 与 Rust 核心构建的 Web 端语法检查库

Harper.js:基于 WebAssembly 与 Rust 核心构建的 Web 端语法检查库 Harper.js基于 WebAssembly 与 Rust 核心构建的 Web 端语法检查库【免费下载链接】harperOffline, privacy-first grammar checker. Fast, open-source, Rust-powered项目地址: https://gitcode.com/GitHub_Trending/har/harper本篇围绕 Harper 项目中harper.js库的官方介绍文档展开说明这个 ECMAScript 模块如何把 Harper 的 Rust 核心算法编译为 WebAssemblyWASM并打包给浏览器与 Node.js 使用读完你将掌握harper.js的定位、安装方式npm 与 CDN 两条路径、LocalLinter与WorkerLinter两种实现的选择依据以及该库当前 API 稳定性状态等关键实战信息。使命为什么需要 harper.jsHarper 是一个离线、隐私优先privacy-first的语法检查器用 Rust 编写始终在设备本地运行因此不存在数据上传服务器的隐私顾虑。harper.js的诞生动机可以概括为两点源自官方文档 Introduction to harper.js开发者日常技术栈绝大多数开发者每天使用 JavaScript 或 TypeScript项目中几乎必然包含其中一种写作场景集中在客户端大量有专注感的写作focused authorship发生在浏览器或基于 Electron 的桌面应用中。因此 Harper 团队的目标是让把优秀的语法检查能力集成进 Web 应用这件事变得极为简单trivial。harper.js就是为此而生的官方封装层目前它同时支撑着 Harper 的 Obsidian 插件与官方网站的语法检查功能。技术架构ESM 外壳 WASM 内核harper.js本质上是一个ECMAScript 模块内部使用了一份 Harper 核心算法编译成的 WebAssembly 二进制。从 packages/harper.js/package.json 可以看到这一架构的关键证据type: module整个包以原生 ESM 发布开发依赖中包含harper-wasmworkspace:*WASM 产物来自同一 monorepo 内的 Rust 工作区成员 harper-wasm由 Rust 核心harper-core编译而来运行依赖仅有fflate用于二进制解压缩等。包的exports字段定义了5 个入口这也是理解整个库的使用方式的钥匙入口导出内容适用场景harper.js.完整 APILocalLinter、WorkerLinter、Dialect、Lint、LintOptions等类型通用入口harper.js/binary常规 WASM 二进制模块需要按需加载 .wasm 文件的场景harper.js/slimBinary精简版二进制体积敏感场景harper.js/binaryInlined内联base64 化WASM 二进制CDN 单文件引入、无需额外网络请求harper.js/slimBinaryInlined精简版内联二进制同上体积更小从源码结构看二进制的封装集中在 src/BinaryModule.ts 及 src/binaries/ 目录下的binary.ts、slimBinary.ts、binaryInlined.ts等文件中WASM 负责重活分词、词性标注、规则匹配TypeScript 层负责配置管理、内存生命周期与跨线程通信。安装harper.js在 npm 上发布当前仓库中版本为2.9.1许可证 Apache-2.0。文档中通过install-pkg(harper.js)指令渲染的安装命令即等价于标准包管理器安装例如在 pnpm 工作区中执行pnpm add harper.js或 npm/yarn 的对应命令即可。需要特别注意官方文档中的稳定性声明harper.js目前处于 early access早期接入阶段API 尚未稳定团队仍在打磨。这意味着集成时应做好随版本调整 API 调用的准备并建议锁定版本号。两种消费路径文档指出harper.js可以原生地在浏览器中使用CDN 方式也可以通过 npm 安装后在 Node.js 中消费。两条路径各有对应的仓库示例。路径一浏览器 CDN免构建对于纯 HTML 页面可以直接用原生 ESM 语法从 CDN 引入无需任何构建工具。仓库中的完整示例位于 examples/raw-web/index.html其核心流程如下script typemodule // 使用原生 ESM 语法从 CDN 引入版本号为示例锁定值 import { binaryInlined } from https://unpkg.com/harper.js2.4.0/dist/binaryInlined.js; import { WorkerLinter } from https://unpkg.com/harper.js2.4.0/dist/index.js; // 浏览器环境中推荐使用 WorkerLinter它不会阻塞事件循环 const linter new WorkerLinter({ binary: binaryInlined }); // 每次 textarea 输入变化时执行检查并刷新错误列表 async function onInput(e) { const lints await linter.lint(e.target.value); const list document.getElementById(errorlist); list.innerHTML ; for (const lint of lints) { const item document.createElement(LI); item.textContent lint.message(); list.appendChild(item); } } const inputField document.getElementById(maininput); inputField.addEventListener(input, onInput); onInput({ target: inputField }); /script注意这里使用的是内联二进制入口binaryInlined——WASM 以 base64 形式打包在 JS 文件里避免了浏览器对第二个.wasm文件的网络请求配合WorkerLinter在 Web Worker 中运行主线程的输入响应完全不被语法检查阻塞。该示例对应文档站中的 Using a CDN 页面。路径二npm Node.jsharper.js同样可以运行在 Node.js 中但有两个约束见 Using Harper in Node.js不能用WorkerLinter——它依赖浏览器专属 APIWeb WorkerNode.js 中必须使用LocalLinter需要较新版本的 Node.js——因为包是 ESM导入机制要求运行环境支持。仓库提供的官方示例 examples/commonjs-simple/index.js 展示了完整用法async function main() { const harper await import(harper.js); const { binary } await import(harper.js/binary); // Node.js 中不能使用 WorkerLinter依赖浏览器 API // 这里构造一个消费美式英语的 LocalLinter。 const linter new harper.LocalLinter({ binary, dialect: harper.Dialect.American, }); try { const lints await linter.lint(This is a example of how to use harper.js.); console.log(Here are the results of linting the above text:); for (const lint of lints) { console.log( - , lint.span().start, :, lint.span().end, lint.message()); if (lint.suggestion_count() ! 0) { console.log(Suggestions:); for (const sug of lint.suggestions()) { console.log( \t - , sug.kind() harper.SuggestionKind.Remove ? Remove : Replace with, sug.get_replacement_text(), ); } } } } finally { await linter.dispose(); } } main();这个示例覆盖了harper.js最小可用闭环构造 Linter → 调用lint()→ 遍历Lint的 span/message/suggestions →dispose()释放资源。Linter 接口与 LocalLinter 实现剖析harper.js的公共 API 是一个名为Linter的接口定义在 src/Linter.ts。它统一了两种实现浏览器用的WorkerLinter与本地用的LocalLinter主要方法族包括核心检查setup()预下载/编译 WASM 二进制可提前到空闲时机执行以降低首检延迟、lint(text, options)、organizedLints(text, options)按规则分组返回、applySuggestion(text, lint, suggestion)把某条建议应用到文本上配置管理getLintConfig()/setLintConfig()/setLintConfigWithJSON()、getDefaultLintConfig()、面向 UI 渲染的getStructuredLintConfig()以及getLintDescriptions()规则的 Markdown/HTML 描述语言判定isLikelyEnglish(text)与isolateEnglish(text)接口注释中自述为proof of concept级别的算法可靠性有限词典与方言importWords()/exportWords()/clearWords()getDialect()/setDialect()忽略记录ignoreLint()/ignoreLints()/ignoreLintHash()exportIgnoredLints()/importIgnoredLints()以隐私友好的哈希形式导出contextHash()统计与自定义规则summarizeStats()/generateStatsFile()/importStatsFile()以及loadWeirpackFromBlob()/loadWeirpackFromBytes()加载 Weirpack 自定义规则包规则自带测试失败时返回失败报告。构造参数LinterInit只有两项export interface LinterInit { /** WebAssembly 二进制模块即上面 5 个入口之一导出的对象 */ binary: BinaryModule; /** Harper 使用的英语方言省略时默认为美式英语 */ dialect?: Dialect; }LocalLinter的实现src/LocalLinter.ts有几个值得注意的设计懒加载内部 WASM Linter 通过p-lazy包装首次真正调用时才完成初始化构造本身不阻塞可阻塞性契约类注释明确说明LocalLinter在当前 JS 上下文运行允许阻塞事件循环——这正是它在 Node.js 中无妨、在浏览器中应优先选择WorkerLinter的原因方言切换即重建setDialect()发现方言变化时会释放旧 WASM 实例inner.free()并新建一个保证方言状态干净参数映射lint()的LintOptionslanguage、forceAllHeadings、regex_mask、dedup、isolateEnglish见 src/main.ts被显式映射为 WASM 调用参数其中language未指定时默认按markdown解析dedup默认为true。API 稳定性与集成建议再次强调官方文档的结论harper.js处于early access阶段——API is not yet stable and we are still working out the kinks。对集成方来说实践上意味着在package.json中锁定具体版本如2.9.1这样的精确版本避免^范围符带来的破坏性变更关注lint()/Linter接口与二进制入口binary、slimBinary、binaryInlined、slimBinaryInlined的变化这些是日常使用面最大的部分规则开关LintConfig被刻意设计为Recordstring, boolean | null记录结构注释明确要求不要硬编码任何特定规则的存在性应基于运行时查询到的配置来泛化处理——这是应对 early access 阶段规则增删的内置缓冲。延伸阅读仓库内路径文档源Introduction to harper.js、Using a CDN、Using Harper in Node.js、Linting包源码packages/harper.js/src/main.ts、packages/harper.js/src/Linter.ts、packages/harper.js/src/LocalLinter.ts、packages/harper.js/src/WorkerLinter/index.ts可运行示例examples/raw-web/index.html、examples/commonjs-simple/index.js上游 WASM 层harper-wasm/src/lib.rs、harper-wasm/benches/wasm_bench.js【免费下载链接】harperOffline, privacy-first grammar checker. Fast, open-source, Rust-powered项目地址: https://gitcode.com/GitHub_Trending/har/harper创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考