ติดตั้ง Node.js: ตรวจการทำงานของปุ่มบนเซิร์ฟเวอร์โดยไม่ใช้เบราว์เซอร์

ประกาศแอฟฟิลิเอต Ver 3.1
ประกาศแอฟฟิลิเอต Ver 3.2 (เฉพาะมือถือ)
สภาพแวดล้อมทดสอบตระกูล RHELAlmaLinux 9.8บัญชี rootตรวจสอบ 2026-10-19

การรัน JavaScript บนเซิร์ฟเวอร์ต้องติดตั้ง Node.js ก่อน ได้ติดตั้ง Node.js 24.21.0 บนเซิร์ฟเวอร์ WordPress ที่ใช้ Nginx และ Apache แล้วใช้ jsdom 30.1.3 ตรวจสคริปต์ปุ่มของหน้าเว็บโดยไม่ใช้เบราว์เซอร์

nodejs ในรีโพสิทอรีพื้นฐานคือ 16.20.2 แต่ jsdom 30.1.3 ที่ใช้ตรวจสคริปต์ต้องใช้ Node.js 22.22.2 ขึ้นไป จึงติดตั้งจากสตรีมโมดูล 24 ของ dnf

1️⃣ จุดประสงค์ของการติดตั้ง Node.js และ jsdom บนเซิร์ฟเวอร์

การตรวจสคริปต์ปุ่มบนเซิร์ฟเวอร์ต้องใช้สองอย่าง คือ Node.js และ jsdom

🔲 Node.js

JavaScript ปกติทำงานในเบราว์เซอร์, แต่เมื่อติดตั้ง Node.js แล้ว เซิร์ฟเวอร์ก็อ่านและรัน JavaScript ได้เช่นกัน

การติดตั้ง Node.js คือการวางตัวรัน JavaScript ที่เคยมีแค่ในเบราว์เซอร์ไว้บนเซิร์ฟเวอร์อีกตัวหนึ่ง Node.js จึงใช้สร้างเว็บเซิร์ฟเวอร์ สร้างคำสั่งที่ประมวลผลหลายไฟล์พร้อมกัน หรือโหลดแพ็กเกจอย่าง jsdom มาตรวจหน้าเว็บ Ghost ก็เป็น CMS ที่ทำงานบน Node.js

🔲 jsdom

jsdom เป็นแพ็กเกจสำหรับ Node.js ที่อ่าน HTML แล้วสร้างเป็นเอกสารที่กดปุ่มได้เหมือนในเบราว์เซอร์ โดยสร้างโครงสร้างเอกสาร (DOM) แบบที่เบราว์เซอร์สร้างตอนเปิดหน้าเว็บไว้ในเซิร์ฟเวอร์โดยไม่มีหน้าจอ สคริปต์จึงหาปุ่มและเปลี่ยนข้อความได้เหมือนอยู่ในเบราว์เซอร์จริง และเพราะไม่ต้องเปิดหน้าต่าง จึงรันบนเซิร์ฟเวอร์ได้ด้วยคำสั่งบรรทัดเดียว

นั่นหมายความว่าการตรวจที่คนเคยต้องเปิดเบราว์เซอร์แล้วกดทีละอย่าง เซิร์ฟเวอร์จะทำแทนด้วยคำสั่ง jsdom จึงใช้ทดสอบการทำงานของปุ่มโดยอัตโนมัติทุกครั้งที่แก้ ดึงเฉพาะเนื้อหาอย่างหัวข้อและลิงก์ออกจากหน้าเว็บ หรือแก้ HTML ของบทความทีเดียวจำนวนมาก

ถ้าดึงหน้าเว็บด้วย PHP หรือ curl จะเห็นแค่ HTML ที่ส่งมาครั้งแรก ข้อความที่เปลี่ยนหลังกดปุ่มจะปรากฏเมื่อสคริปต์ทำงานแล้วเท่านั้น

เบราว์เซอร์ทำงานสี่ขั้น คือ รับหน้าเว็บ อ่านหน้าเว็บ ลองกดปุ่ม และแสดงบนหน้าจอ jsdom ทำทุกขั้นบนเซิร์ฟเวอร์ยกเว้นขั้นแสดงบนหน้าจอ ตำแหน่งและขนาดของปุ่มจึงต้องตรวจในเบราว์เซอร์

🧩 สิ่งที่เบราว์เซอร์และ jsdom ทำ
แผนภาพอธิบาย
🖥️ ฝั่งที่รัน
รับหน้าเว็บรับ HTML ที่เซิร์ฟเวอร์ส่งมา
อ่านหน้าเว็บรู้ว่าอะไรอยู่ตรงไหน
ลองกดปุ่มสคริปต์เปลี่ยนข้อความ
แสดงบนหน้าจอวาดตำแหน่ง·ขนาด·ฟอนต์
ข้อความเปลี่ยน ✓ข้อผิดพลาด ✓ตำแหน่ง·ขนาด ✓ตำแหน่ง·ขนาด ✗ (ตรวจในเบราว์เซอร์)
เบราว์เซอร์ทำครบทั้งสี่ขั้น
jsdom ทำแค่สามขั้นแรกบนเซิร์ฟเวอร์

2️⃣ ตรวจก่อนติดตั้ง: รีโพสิทอรีพื้นฐานและสตรีมโมดูล

ก่อนรัน [dnf install nodejs] ให้ตรวจก่อนว่าจะได้เวอร์ชันใด nodejs ในรีโพสิทอรีพื้นฐานของ AlmaLinux 9.8 คือ 16.20.2

dnf list --available nodejs
Available Packages
nodejs.x86_64                    1:16.20.2-8.el9_4                     appstream

รีโพสิทอรีโมดูลมีสี่สตรีม คือ 18, 20, 22 และ 24 ณ วันที่ตรวจ สตรีม 22 อยู่ที่ 22.23.2 และสตรีม 24 อยู่ที่ 24.21.0

dnf module list nodejs
nodejs 18     common [d], development, minimal, s2i Javascript runtime
nodejs 20     common [d], development, minimal, s2i Javascript runtime
nodejs 22     common [d], development, minimal, s2i Javascript runtime
nodejs 24     common [d], development, minimal, s2i Javascript runtime

ตามรีจิสทรีของ npm เวอร์ชันที่ jsdom 30.1.3 ต้องการคือ 22.22.2 ขึ้นไปในสาย 22, 24.15.0 ขึ้นไปในสาย 24 หรือ 26 ขึ้นไป สตรีม 22 และ 24 ผ่านเงื่อนไขนี้ทั้งคู่

3️⃣ ติดตั้ง Node.js: dnf module

ครั้งนี้ติดตั้งสตรีม 24 และก่อนรันได้ตรวจรายการแพ็กเกจที่จะติดตั้งด้วยตัวเลือก [--assumeno] ก่อน

dnf module install nodejs:24 --assumeno

ในรายการมีเพียงห้าแพ็กเกจ คือ nodejs, npm, nodejs-libs, nodejs-docs และ nodejs-full-i18n ไม่มีแพ็กเกจเว็บเซิร์ฟเวอร์ PHP หรือเคอร์เนล เมื่อตรวจแล้วให้ติดตั้งด้วยตัวเลือก [-y]

dnf module install -y nodejs:24
Dependencies resolved.
==============================================================================================
 Package            Architecture  Version                                    Repository  Size
==============================================================================================
Installing group/module packages:
 nodejs             x86_64  1:24.21.0-1.module_el9.8.0+321+1555b6a2           appstream   70 k
 npm                noarch  1:11.19.0-1.24.21.0.1.module_el9.8.0+321+1555b6a2 appstream  2.1 M
Installing dependencies:
 nodejs-libs        x86_64  1:24.21.0-1.module_el9.8.0+321+1555b6a2           appstream   24 M
Installing weak dependencies:
 nodejs-docs        noarch  1:24.21.0-1.module_el9.8.0+321+1555b6a2           appstream  5.3 M
 nodejs-full-i18n   x86_64  1:24.21.0-1.module_el9.8.0+321+1555b6a2           appstream  8.9 M
Installing module profiles:
 nodejs/common                                                                                
Enabling module streams:
 nodejs                     24                                                                

Transaction Summary
==============================================================================================
Install  5 Packages

Total download size: 40 M
Installed size: 185 M

[Installing weak dependencies] คือรายการ weak dependencies หรือแพ็กเกจที่ควรติดตั้งไปพร้อมกัน ขนาดดาวน์โหลด 40M และขนาดหลังติดตั้ง 185M

node -v
v24.21.0
npm -v
11.19.0
cat /etc/dnf/modules.d/nodejs.module
[nodejs]
name=nodejs
stream=24
profiles=common
state=enabled

node ติดตั้งเป็น 24.21.0 และ npm เป็น 11.19.0 ไฟล์ตั้งค่าที่เปลี่ยนหลังติดตั้งมีเพียง [/etc/dnf/modules.d/nodejs.module] ซึ่งบันทึกสตรีม 24 และโปรไฟล์ common ว่าเปิดใช้อยู่

4️⃣ ติดตั้ง jsdom และตรวจสคริปต์ปุ่ม

ติดตั้ง jsdom ด้วย npm ลงในโฟลเดอร์งาน และสร้างโฟลเดอร์งานไว้นอกเว็บรูท

mkdir ~/jsdom-test && cd ~/jsdom-test
npm init -y

[npm init -y] สร้าง package.json ด้วยค่าเริ่มต้น แล้วติดตั้ง jsdom ลงในโฟลเดอร์เดียวกัน

npm install jsdom
added 36 packages, and audited 37 packages in 2s

8 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
npm ls jsdom
jsdom-test@1.0.0 /root/jsdom-test
└── jsdom@30.1.3

ติดตั้งแพ็กเกจ 36 รายการรวม jsdom 30.1.3 แล้ว และช่องโหว่ที่รู้จักเป็น 0 รายการ ขนาดของ node_modules ในโฟลเดอร์งานคือ 26M

node -e 'const { JSDOM } = require(`jsdom`); console.log(new JSDOM(`<h1>สวัสดี</h1>`).window.document.querySelector(`h1`).textContent)'
สวัสดี

เมื่อ jsdom อ่าน HTML ที่มีแท็ก h1 แท็กเดียวเป็นเอกสาร แล้วพิมพ์ข้อความข้างใน [สวัสดี] ออกมา ก็ถือว่าตรวจการทำงานเสร็จ

การตรวจสคริปต์ปุ่มคือการยืนยันบนเซิร์ฟเวอร์ว่าข้อความเปลี่ยนถูกต้องหลังกด ตัวอย่างนี้สร้างไฟล์ HTML ในโฟลเดอร์งาน ที่เมื่อกดปุ่ม [คัดลอก] ข้อความจะเปลี่ยนเป็น [คัดลอกแล้ว]

cat btn.html
<button id="copy">คัดลอก</button>
<script>
document.getElementById('copy').addEventListener('click', function () {
  this.textContent = 'คัดลอกแล้ว';
});
</script>

สคริปต์ตรวจจะอ่านไฟล์ HTML ด้วย jsdom รันสคริปต์ในไฟล์ แล้วพิมพ์ข้อความก่อนและหลังกดปุ่ม ข้อผิดพลาดของสคริปต์จะพิมพ์เป็นบรรทัดที่ขึ้นต้นด้วย [ข้อผิดพลาด:]

cat check.js
const fs = require('fs');
const { JSDOM, VirtualConsole } = require('jsdom');

const vc = new VirtualConsole();
vc.on('jsdomError', (e) => console.log('ข้อผิดพลาด:', e.message));

const dom = new JSDOM(fs.readFileSync(process.argv[2], 'utf8'), {
  runScripts: 'dangerously',
  virtualConsole: vc,
});
const btn = dom.window.document.querySelector('#copy');
console.log('ก่อนกด:', btn.textContent);
btn.click();
console.log('หลังกด:', btn.textContent);
node check.js btn.html
ก่อนกด: คัดลอก
หลังกด: คัดลอกแล้ว

หลังกด ข้อความเปลี่ยนเป็น [คัดลอกแล้ว] จึงยืนยันได้ว่าสคริปต์ปุ่มทำงาน

แค่พิมพ์ผิดตัวเดียวในสคริปต์ ผลก็เปลี่ยน ได้รันการตรวจแบบเดียวกันกับไฟล์ที่เปลี่ยนตัว I พิมพ์ใหญ่ใน getElementById เป็นตัว l พิมพ์เล็ก

sed 's/getElementById/getElementByld/' btn.html > btn-broken.html
node check.js btn-broken.html
ข้อผิดพลาด: Uncaught [TypeError: document.getElementByld is not a function]
ก่อนกด: คัดลอก
หลังกด: คัดลอก

ข้อผิดพลาดพิมพ์ออกมาที่บรรทัดแรกและสคริปต์หยุด แม้กดปุ่มแล้วข้อความก็ยังเป็น [คัดลอก]

กำหนดความกว้าง 120px และความสูง 40px ให้ปุ่มด้วย CSS แล้วพิมพ์ขนาดออกมา

cat size.js
const { JSDOM } = require('jsdom');
const dom = new JSDOM('<button id="copy" style="width:120px;height:40px">คัดลอก</button>');
const btn = dom.window.document.querySelector('#copy');
console.log('ความสูง:', btn.offsetHeight, '/ ความกว้าง:', btn.getBoundingClientRect().width);
node size.js
ความสูง: 0 / ความกว้าง: 0

jsdom ไม่มีขั้นวาดบนหน้าจอ ความสูงและความกว้างจึงพิมพ์ออกมาเป็น 0

🔢 FAQ & เนื้อหาแนะนำ

เวอร์ชันที่ jsdom 30.1.3 ต้องการตามรีจิสทรีของ npm คือ Node.js 22.22.2 ขึ้นไป 24.15.0 ขึ้นไป หรือ 26 ขึ้นไป สตรีม 18 และ 20 จึงไม่อยู่ในเงื่อนไขนี้

node ที่ไม่อยู่ใน PATH จะไม่แสดงใน [which node] เซิร์ฟเวอร์ที่ตรวจก็ไม่มีผลจาก [which node] แต่มี Node.js 18.4.0 ที่ติดตั้งผ่านแพ็กเกจ pip ชื่อ nodejs-bin อยู่ในโฟลเดอร์ของผู้ใช้

[d] คือเครื่องหมายค่าเริ่มต้น (default) ถ้าอยู่หลังโปรไฟล์ common เมื่อติดตั้งโดยไม่ระบุโปรไฟล์ จะได้โปรไฟล์ common

🧭 เนื้อหาการจัดการแพ็กเกจแนะนำ 9 บทความ · 2 อ้างอิง
🗂️ การจัดการแพ็กเกจ
📄 คำสั่ง yum 📄 คำสั่ง yum-config-manager 📄 ความต่างของ RPM · YUM 📄 คำสั่ง apt · apt-get 📄 ติดตั้ง snapd
📄 ติดตั้ง Node.js 📄 ติดตั้ง Nginx · PHP บน CentOS 7 📄 ติดตั้ง phpMyAdmin 📄 ติดตั้งและตั้งค่า PHP-FPM
📡 DNF Module Command 📡 Node.js Previous Releases
yum check-update (yum - คำสั่งจัดการแพ็กเกจ).png
Linux · แพ็กเกจ
คำสั่ง yum | วิธีใช้ | ตัวเลือก | yum-utils | จัดการแพ็กเกจและรีโพสิทอรี🔝
คำสั่ง YUM ที่ใช้ในดิสทริบิวชัน Linux ตระกูล Red Hat เป็นคำสั่งสำหรับจัดการแพ็กเกจ (ติดตั้ง อัปเดต ลบ)
อ่านบทความ →เนื้อหาปัจจุบัน
รีโพสิทอรี YUM_CentOS-Base.repo (CentOS 7)
Linux · แพ็กเกจ
คำสั่ง yum-config-manager | ตั้งค่ารีโพสิทอรี YUM
โดยค่าเริ่มต้น คำสั่ง yum จะติดตั้งแพ็กเกจจากรีโพสิทอรีพื้นฐาน (ปกติเป็นเวอร์ชันเสถียร)
อ่านบทความ →เนื้อหาปัจจุบัน
yum update
Linux · แพ็กเกจ
Linux: ความต่างระหว่าง RPM กับ YUM
RPM (Red Hat Package Manager) และ YUM (Yellowdog Updater, Modified) เป็นโปรแกรมติดตั้งที่ใช้ติดตั้งแพ็กเกจบน Linux
อ่านบทความ →เนื้อหาปัจจุบัน
โลโก้ Ubuntu
Linux · แพ็กเกจ
[Ubuntu] คำสั่ง apt | วิธีใช้และความต่างของคำสั่ง apt-get
Linux ตระกูล Red Hat ใช้คำสั่ง dnf จัดการแพ็กเกจ ส่วนตระกูล Debian ใช้คำสั่ง apt
อ่านบทความ →เนื้อหาปัจจุบัน
Linux (ลูกบาศก์ไม้บนพื้นสีเทา)
Linux · แพ็กเกจ
Linux snapd | ติดตั้ง snapd บน Rocky Linux
Snapcraft หรือ Snap เป็นระบบจัดการแพ็กเกจที่พัฒนาขึ้นเป็นเครื่องมือเผยแพร่และแพ็กซอฟต์แวร์สำหรับระบบปฏิบัติการสมาร์ตโฟน Ubuntu ที่ Canonical เริ่มไว้ แพ็กเกจที่เรียกว่า snap และเครื่องมือที่ใช้ snapd ช่วยให้การแพ็กซอฟต์แวร์จากต้นทาง (upstream) ง่ายขึ้นและใช้ได้ในดิสทริบิวชัน Linux หลากหลาย
อ่านบทความ →เนื้อหาปัจจุบัน

ℹ️ ประกาศเรื่องลิงก์แอฟฟิลิเอต
เนื้อหาของเว็บไซต์นี้มีลิงก์แอฟฟิลิเอต หากผู้เข้าชมซื้อสินค้าหรือบริการผ่านลิงก์เหล่านี้ เว็บไซต์นี้จะได้รับค่าคอมมิชชันจากผู้ขาย ในกระบวนการนี้ ราคาที่ผู้ซื้อจ่าย(ราคาจะลดลงเมื่อมีโปรโมชัน↓)จะไม่สูงขึ้นแต่อย่างใด ราคา ส่วนลด และข้อมูลสต็อกที่แสดงเป็นข้อมูล ณ เวลาที่เขียนและอาจต่างจากความเป็นจริง โปรดตรวจสอบกับผู้ขายอีกครั้งก่อนซื้อ การเลือกและการประเมินสินค้าเขียนตามเกณฑ์ของเราเอง และการได้รับค่าคอมมิชชันหรือไม่ไม่มีผลต่อลำดับการแนะนำหรือเนื้อหาการประเมิน

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *

Prove your humanity: 2   +   3   =