jsdom؛ یه مرورگر جعلی داخل Node.js
خلاصهٔ کاملتر
jsdom یه پیادهسازی خالص جاوااسکریپتی از خیلی از استانداردهای وبه — مخصوصاً استانداردهای DOM و HTML از WHATWG — که برای اجرا روی Node.js ساخته شده. توی مستندات پروژه اومده که هدف، ساختن یه مرورگر کامل نیست؛ فقط اونقدر از رفتار مرورگر شبیهسازی میشه که بشه اپلیکیشنهای واقعی وب رو تست و اسکرپ کرد. نسخههای جدیدترش هم به نسخههای تازهتر Node نیاز دارن.
کار باهاش سادهست: سازندهٔ JSDOM رو با یه رشتهٔ HTML صدا میزنی و یه شیء برمیگردونه که مهمترین ویژگیش windowـه. از اون به بعد با همون APIهای آشنای مرورگر کار میکنی، و jsdom دقیقاً مثل مرورگر تگهای ضمنی مثل html و body رو هم به سند اضافه میکنه:
const { JSDOM } = require("jsdom");
const dom = new JSDOM(`<p>Hello world</p>`);
console.log(dom.window.document.querySelector("p").textContent); // "Hello world"پارامتر دوم سازنده برای تنظیماته: url مقدار window.location رو تعیین میکنه و روی حلشدن آدرسهای نسبی و محدودیت same-origin اثر میذاره، contentType مشخص میکنه سند بهعنوان HTML پارس شه یا XML، includeNodeLocations اطلاعات موقعیت پارسر رو نگه میداره (به قیمت کمی افت سرعت) و storageQuota سقف حجم localStorage و sessionStorage رو تعیین میکنه که پیشفرضش حدود ۵ میلیون واحد برای هر origin ـه.
قویترین قابلیت jsdom اجرای اسکریپت داخل خود سنده، ولی خطرناکترین بخشش هم همینه. مستندات صریح هشدار میده که سندباکسش ضدگلوله نیست و کدی که داخل DOM اجرا میشه، اگه بهاندازهٔ کافی تلاش کنه، میتونه به محیط Node و در نتیجه به ماشین تو دسترسی پیدا کنه. برای همین این قابلیت پیشفرض خاموشه و فقط با runScripts: "dangerously" روشن میشه؛ حالت ملایمتر runScripts: "outside-only" هم هست که فقط گلوبالهای استاندارد جاوااسکریپت و window.eval رو فراهم میکنه.
پیشفرض هیچ زیرمنبعی — استایلشیت، تصویر یا iframe — بارگذاری نمیشه مگه اینکه resources: "usable" رو بدی؛ برای حالتهای پیشرفتهتر میتونی dispatcher یا interceptor سفارشی undici بدی تا پروکسی تنظیم کنی یا پاسخ ساختگی برگردونی. گزینهٔ pretendToBeVisual هم document.hidden رو false و requestAnimationFrame رو فعال میکنه، ولی jsdom همچنان هیچ layout و رندری انجام نمیده. خروجی کنسول صفحه هم از راه «کنسول مجازی» کنترلشدنیه.
نکات کلیدی:
- پیادهسازی خالص جاوااسکریپتی استانداردهای DOM و HTML برای Node.js
- ساخته شده برای تست و اسکرپ، نه برای جایگزینی مرورگر واقعی
- اجرای اسکریپتهای صفحه پیشفرض خاموشه؛ روشنکردنش روی محتوای ناشناس خطرناکه
- بارگذاری زیرمنبعها اختیاریه و با dispatcher و interceptor سفارشی قابل تنظیمه
- بدون layout و رندر؛ pretendToBeVisual فقط وانمود میکنه که صفحه دیده میشه




