@lukeed/html: پارسر HTML سریع با آفست سورس و سلکتور CSS
خلاصهٔ کاملتر
@lukeed/html یه پارسر HTML جدید از Luke Edwards هست که درخت کامل سند رو با سرعت ۴۰۰ تا ۶۰۰ مگابایت بر ثانیه میسازه. طبق README پروژه، این یعنی ۳ تا ۶ برابر سریعتر از بقیهٔ پارسرهای جاوااسکریپت. ساختار درختش هم مثل htmlparser2 هست و سلکتورهاش مثل css-select کار میکنن، پس اگه قبلاً با اونا کار کردی، چیز جدیدی لازم نیست یاد بگیری.
سرعتش از یه ترفند ساده میاد: پارس lazy، یعنی attributeها و متنها فقط وقتی پارس و entity-decode میشن که واقعاً بخونیشون. هر نود هم start و end داره که آفستش تو سورس اصلیه، و document.position() اینو به شماره خط و ستون تبدیل میکنه. stringify() هم سورس رو lossless برمیگردونه، یعنی دقیقاً همون چیزی که نوشته شده بود، حتی با همون فاصلهها و حروف بزرگ و کوچیک.
مثلاً این تیکه از مثال خود پروژه، همهٔ عکسهایی که alt ندارن رو پیدا میکنه و جای دقیقشون رو چاپ میکنه. یعنی برای ساختن linter یا ابزار گزارش خطا روی HTML خیلی بهدردبخوره:
doc.find("link[rel=canonical]")?.getAttr("href"); //=> "/"
for (let img of doc.all("img:not([alt])")) {
let { line, column } = doc.position(img.start);
console.log(`${line}:${column}`, stringify(img));
}پکیج دو تا نسخه داره. نسخهٔ اصلی فقط خوندنیه و حجمش با gzip حدود 6.3 کیلوبایته (با entities میشه 21.8). نسخهٔ @lukeed/html/mutable اجازهٔ ویرایش میده، مثل setAttr()، append()، remove() و setterهای text و html. حجمش 8.8 کیلوبایته و یه کم کندتره و حافظهٔ بیشتری میخواد. نکتهٔ جالبش اینه که موقع stringify() فقط بخشهای ویرایششده دوباره ساخته میشن و بقیه عین سورس کپی میشن.
سلکتورها بیشتر چیزای رایج رو پشتیبانی میکنن: id، class، انواع attribute با فلگهای i و s، combinatorها و pseudo-classهایی مثل :nth-child()، :not()، :is() و :where(). سلکتور نامعتبر SyntaxError میده، ولی خود parse() هیچوقت خطا نمیده و HTML خراب رو مثل htmlparser2 درست میکنه. نویسنده صریح گفته این پکیج sanitizer نیست. چون درختش با الگوریتم WHATWG ساخته نمیشه، ممکنه مرورگر از همون HTML خراب یه درخت دیگه بسازه، پس نباید ازش برای تشخیص امن بودن HTML استفاده کرد.
تو بنچمارک روی ۱۲ صفحهٔ واقعی (4.79 مگابایت) روی Bun 1.4.4 و Node v26، پارس با @lukeed/html حدود 7.9 میلیثانیه طول کشیده، در حالی که htmlparser2 روی 40.9 و parse5 روی 86.7 میلیثانیه بودن. فقط HTMLRewriter بومی خود Bun تو حالتهای streaming ازش سریعتره.
نکات کلیدی:
- سرعت ساخت درخت ۴۰۰ تا ۶۰۰ مگابایت بر ثانیه، ۳ تا ۶ برابر سریعتر از پارسرهای دیگهٔ جاوااسکریپت
- هر نود آفست start و end داره و position() خط و ستونش رو میده
- نسخهٔ فقطخواندنی 6.3 کیلوبایت و نسخهٔ mutable برای ویرایش 8.8 کیلوبایت (gzip)
- پارس روی 4.79 مگابایت: 7.9ms در برابر 40.9ms برای htmlparser2 روی Bun
- sanitizer نیست و نباید برای امنسازی HTML ازش استفاده کرد
- لایسنس MIT




