มีอะไรใหม่ใน Node.js v20 (Test Runner, Permission Model, SEA, V8 JS Engine 11.3)
เผยแพร่แล้ว: 2023-04-28Node.js v20 พร้อมใช้งานแล้ว! เมื่อวันที่ 18 เมษายน 2023 มีการเปิดเผยต่อสาธารณะและทุกคนสามารถใช้งานได้แล้ว ด้วยการเปิดตัวนี้ Node.js ควรมีความปลอดภัยมากขึ้นและทำงานได้ดีขึ้น
สิ่งสำคัญที่ต้องทราบ เนื่องจากนี่เป็นรุ่นเลขคู่ จึงถูกกำหนดให้เป็นเวอร์ชันการสนับสนุนระยะยาว (LTS) ในเดือนตุลาคม 2023 และจะได้รับการสนับสนุนจนถึงเดือนเมษายน 2026 อย่างไรก็ตาม ทีมงาน Node.js กำลังมองหาชุมชนอย่างจริงจัง คำติชมเพื่อระบุและแก้ไขปัญหาใด ๆ ก่อนที่จะเลื่อนระดับเป็น LTS
Node.js รุ่นใหม่นี้นำเสนอการอัปเดตที่น่าตื่นเต้นและคุณสมบัติที่นักพัฒนาจะต้องประทับใจอย่างแน่นอน เช่น Permission Model รุ่นทดลอง, synchronous import.meta.resolve
, ตัวรันการทดสอบที่เสถียร, อัปเดตเอ็นจิ้น V8 JavaScript เป็นเวอร์ชัน 11.3, นำการปรับปรุงประสิทธิภาพและจุดบกพร่อง แก้ไขและอื่น ๆ อีกมากมาย
ในบทความนี้ คุณจะสำรวจการเปลี่ยนแปลงที่เกิดขึ้นใน Node.js v20 ซึ่งจะให้ข้อมูลเชิงลึกเกี่ยวกับคุณสมบัติและความสามารถใหม่ๆ
เริ่มต้นใช้งาน Node.js v20
การติดตั้ง Node.js v20 ค่อนข้างคล้ายกับ Node.js เวอร์ชันอื่นๆ สิ่งที่คุณต้องทำคือ:
- ดาวน์โหลดแพ็คเกจตัวติดตั้งจากเว็บไซต์ทางการของ Node.js
- เมื่อคุณดาวน์โหลดตัวติดตั้งแล้ว ให้เรียกใช้และทำตามคำแนะนำเพื่อสิ้นสุดกระบวนการติดตั้ง กระบวนการนี้ค่อนข้างตรงไปตรงมา และคุณเพียงแค่ต้องยอมรับข้อตกลงใบอนุญาตและคลิกปุ่ม "ถัดไป"
- รีสตาร์ทระบบ/เครื่องของคุณหลังจากกระบวนการติดตั้งเสร็จสิ้นเพื่อให้แน่ใจว่าการเปลี่ยนแปลงทั้งหมดจะมีผล
- ตรวจสอบการติดตั้ง Node.js ของคุณโดยเรียกใช้คำสั่งต่อไปนี้:
node -v
หากคุณเห็นหมายเลขเวอร์ชัน (v20.0.0) แสดงว่าติดตั้ง Node.js อย่างถูกต้อง และคุณพร้อมที่จะเริ่มทำงานกับ Node.js v20 แล้ว
มีอะไรใหม่ใน Node.js v20
เรามาสำรวจการอัปเดตหลัก 5 รายการที่นำมาใช้กับ Node.js รุ่นนี้กัน คุณสมบัติเหล่านี้รวมถึง:
รูปแบบการอนุญาตการทดลอง
การเปิดตัว Permission Model รุ่นทดลองใน Node.js v20 เป็นส่วนเสริมที่สำคัญที่ช่วยให้นักพัฒนาสามารถควบคุมการเข้าถึงทรัพยากรเฉพาะในระหว่างการดำเนินการได้มากขึ้น
คุณลักษณะใหม่นี้มีประโยชน์เมื่อการรักษาความปลอดภัยและการใช้ทรัพยากรมีความสำคัญ เช่น ในสภาพแวดล้อมการผลิต
โมเดลการอนุญาตมาพร้อมกับความสามารถหลายอย่าง รวมถึงการจำกัดการเข้าถึงระบบไฟล์, child_process, worker_threads และส่วนเสริมแบบเนทีฟ
นักพัฒนาสามารถใช้แฟล็กเช่น --allow-fs-read
, --allow-fs-write
และ --allow-child-process
เพื่อระบุทรัพยากรที่สามารถเข้าถึงได้ ในการเปิดใช้งานแฟล็กเหล่านี้ นักพัฒนาจำเป็นต้องใช้แฟล็ก --experimental-permission
ร่วมกับสิทธิ์ที่จำเป็น
ต่อไปนี้คือตัวอย่างวิธีใช้ Permission Model เพื่ออนุญาตการเข้าถึงแบบอ่านและเขียนไปยังระบบไฟล์ทั้งหมด:
$ node --experimental-permission --allow-fs-read=* --allow-fs-write=* index.js
นักพัฒนายังสามารถใช้ Permission Model เพื่อระบุการเข้าถึงโฟลเดอร์และไฟล์เฉพาะ ตัวอย่างเช่น คำสั่งต่อไปนี้อนุญาตให้เข้าถึงการเขียนไปยังโฟลเดอร์ /tmp/ :
$ node --experimental-permission --allow-fs-write=/tmp/ --allow-fs-read=/home/index.js index.js
ประโยชน์ที่สำคัญประการหนึ่งของ Permission Model คือความสามารถในการควบคุมการเข้าถึงระบบไฟล์อย่างละเอียดยิ่งขึ้น ตัวอย่างเช่น นักพัฒนาสามารถระบุพาธและรูปแบบไวด์การ์ดเพื่ออนุญาตให้เข้าถึงโฟลเดอร์หรือไฟล์ที่ต้องการได้
$ node --experimental-permission --allow-fs-read=/home/user/* index.js
คำสั่งดังกล่าวมอบสิทธิ์การอ่านให้กับทุกโฟลเดอร์ภายในไดเร็กทอรี /home/user/
นอกจากนี้ยังสามารถใช้คุณสมบัติการอนุญาตของวัตถุกระบวนการเพื่อตรวจสอบว่ามีการอนุญาตเฉพาะที่ได้รับอนุญาตในขณะรันไทม์หรือไม่ ตัวอย่างเช่น หากคุณต้องการตรวจสอบว่ากระบวนการ Node.js มีสิทธิ์อ่านโฟลเดอร์ /home/user/documents หรือไม่ คุณสามารถใช้รหัสต่อไปนี้:
if (process.permission.has('fs.read', '/home/user/documents')) { console.log('Read access granted to /home/user/documents'); } else { console.log('Read access not granted to /home/user/documents'); }
เมื่อใช้ Permission Model คุณจะสามารถควบคุมการเข้าถึงระบบไฟล์ของกระบวนการ Node.js ได้ละเอียดยิ่งขึ้น ซึ่งจะนำไปสู่ความปลอดภัยที่ดีขึ้นและการใช้ทรัพยากรที่มีประสิทธิภาพมากขึ้น
สิ่งสำคัญคือต้องทราบว่า Permission Model ยังอยู่ในขั้นทดลองและอาจมีการเปลี่ยนแปลงใน Node.js รุ่นต่อๆ ไป ขอแนะนำให้ติดตามเอกสารประกอบ Permission Model ที่ทันสมัยอยู่เสมอ และใช้ความระมัดระวังเมื่อใช้ฟีเจอร์ทดลองเหล่านี้
รองชนะเลิศการทดสอบที่มีเสถียรภาพ
Node.js v20 มีโมดูล test_runner เวอร์ชันเสถียรที่ช่วยให้นักพัฒนาสร้างและเรียกใช้ชุดทดสอบ JavaScript ได้อย่างรวดเร็วและง่ายดายโดยไม่ต้องติดตั้งการพึ่งพาเพิ่มเติม
ขณะนี้การทดสอบรันเนอร์ที่เสถียรประกอบด้วยบล็อกการสร้างหลายรายการ เช่น describe
it
/ test
และฮุก สำหรับการเขียนและจัดโครงสร้างไฟล์ทดสอบ พร้อมกับการจำลอง โหมดเฝ้าดู และความสามารถในการเรียกใช้ไฟล์ทดสอบหลายไฟล์พร้อมกันโดยใช้ node --test
คำสั่ง node --test
ต่อไปนี้คือตัวอย่างวิธีใช้ตัวทดสอบ:
import { test, mock } from 'node:test'; import assert from 'node:assert'; import fs from 'node:fs'; mock.method(fs, 'readFile', async () => "Hello World"); test('synchronous passing test', async (t) => { // This test passes because it does not throw an exception. assert.strictEqual(await fs.readFile('a.txt'), "Hello World"); });
ตัวดำเนินการทดสอบนำเสนอตัวรายงานการทดสอบที่สามารถกำหนดค่าได้และกำหนดเองผ่านแฟล็ก --test-reporter
ความครอบคลุมการทดสอบเชิงทดลองผ่านแฟล็ก --experimental-test-coverage
และความสามารถในการเยาะเย้ย
แม้ว่าจะไม่ได้มีจุดประสงค์เพื่อแทนที่เฟรมเวิร์กการทดสอบที่มีคุณสมบัติครบถ้วนเช่น Jest หรือ Mocha แต่ตัวทดสอบที่เสถียรมอบวิธีที่ง่ายและรวดเร็วในการสร้างชุดทดสอบ ได้รับการปรับปรุงอย่างมากตั้งแต่เปิดตัวใน Node.js v19 และด้วยการทดสอบและข้อเสนอแนะจากผู้ใช้ปลายทาง ตอนนี้จึงได้รับการทำเครื่องหมายว่าเสถียรใน Node.js v20
ดูข้อมูลเพิ่มเติมได้ในคำขอดึงที่ผสานนี้
V8 JavaScript Engine อัปเดตเป็น 11.3
เอ็นจิ้น V8 JavaScript ซึ่งขับเคลื่อน Node.js ได้รับการอัปเดตเป็นเวอร์ชัน 11.3 ใน Node.js v20 สิ่งนี้นำมาซึ่งประสิทธิภาพที่ดีขึ้นและแนะนำคุณสมบัติภาษาใหม่ คุณสมบัติใหม่บางอย่างในการอัปเดตนี้ประกอบด้วย:
-
String.prototype.isWellFormed
และtoWellFormed
: เมธอดเหล่านี้มีประโยชน์อย่างยิ่งสำหรับการตรวจสอบรูปแบบสตริงที่เหมาะสม วิธีนี้ช่วยให้แน่ใจว่าอินพุตสตริงของผู้ใช้อยู่ในรูปแบบ UTF-16 ที่ถูกต้อง ซึ่งช่วยลดข้อผิดพลาดในยุคของอิโมจิ - วิธีที่เปลี่ยน Array และ TypedArray ด้วยการคัดลอก: วิธีนี้จะมีประโยชน์สำหรับการสร้างสำเนาของอาร์เรย์ที่แก้ไขแล้วโดยไม่ส่งผลกระทบต่อข้อมูลต้นฉบับ ซึ่งมีความเกี่ยวข้องอย่างยิ่งในกรณีที่คุณต้องการเก็บรักษาข้อมูลต้นฉบับเพื่อการเปรียบเทียบหรือเพื่อวัตถุประสงค์อื่นๆ
-
ArrayBuffer
ที่ปรับขนาดได้และSharedArrayBuffer
ที่เติบโตได้ : ให้ความยืดหยุ่นที่มากขึ้น ทำให้สามารถจัดสรรหน่วยความจำได้อย่างมีประสิทธิภาพมากขึ้น - ค่าสถานะ RegExp v พร้อมชุดสัญกรณ์และคุณสมบัติของสตริง: เพิ่มฟังก์ชันสำหรับนิพจน์ทั่วไป
- WebAssembly tail call: ให้วิธีการเพิ่มประสิทธิภาพการเรียกใช้ฟังก์ชันบางประเภท
การอัปเดตเหล่านี้แสดงถึงความมุ่งมั่นอย่างต่อเนื่องของชุมชนการพัฒนา Node.js ในการปรับปรุงประสิทธิภาพและฟังก์ชันการทำงาน
ซิงโครนัส import.meta.resolve()
ใน Node.js v20 มีการแนะนำ import.meta.resolve()
ซึ่งทำให้เขียนสคริปต์ที่ไม่ระบุตำแหน่งได้ง่ายขึ้น ฟังก์ชันนี้ส่งคืนแบบซิงโครนัส คล้ายกับพฤติกรรมของเบราว์เซอร์ ทำให้สามารถดำเนินการได้อย่างมีประสิทธิภาพมากขึ้น
ผู้ใช้สามารถกำหนด Resolid Hooks ของตัวโหลดเดอร์เป็นฟังก์ชัน async ได้ แต่ import.meta.resolve()
จะยังคงส่งกลับแบบซิงโครนัสสำหรับโค้ดแอปพลิเคชันแม้ว่าจะโหลด async resolution hooks ก็ตาม
ลักษณะการทำงานแบบซิงโครนัสของ import.meta.resolve()
ช่วยให้สามารถเรียกใช้โค้ดได้อย่างมีประสิทธิภาพมากขึ้น โดยเฉพาะอย่างยิ่งเมื่อต้องจัดการกับข้อมูลจำนวนมาก ในฐานะผู้เขียน คุณสามารถกำหนด resolution hooks เป็นฟังก์ชัน async หรือ sync ขึ้นอยู่กับความต้องการของคุณ โค้ดแอปพลิเคชันจะยังคงทำงานแบบซิงโครนัสไม่ว่าจะมีการโหลด hooks สำหรับการแก้ไขแบบ async หรือไม่
แอปพลิเคชันปฏิบัติการเดี่ยวแบบทดลอง (SEA)
Experimental Single Executable Applications (SEA) เป็นคุณลักษณะใหม่ที่เปิดตัวใน Node.js v20 ที่อนุญาตให้รวมแอปพลิเคชันของคุณเข้ากับ Node.js ไบนารี ทำให้ผู้ใช้สามารถแจกจ่ายและเรียกใช้เป็นไฟล์ปฏิบัติการเดียว
นี่เป็นคำขอจากชุมชนมาเป็นเวลานาน และทีมงานได้ปรับปรุงแนวทางดังกล่าวในปีที่ผ่านมา
ใน Node.js v20 การสร้างแอปที่เรียกใช้งานได้เพียงแอปเดียวจำเป็นต้องฉีด Blob ที่เตรียมโดย Node.js จากการกำหนดค่า JSON แทนที่จะฉีดไฟล์ Raw JS
blob เป็นไฟล์ที่มีข้อมูลไบนารี ในกรณีนี้ จัดทำโดย Node.js และมันถูกฉีดเข้าไปในไบนารี การเปลี่ยนแปลงนี้ทำขึ้นเพื่อเปิดใช้งานการฝังทรัพยากรที่มีอยู่ร่วมกันหลายรายการใน SEA ซึ่งเปิดกรณีการใช้งานใหม่
นี่คือตัวอย่างของไฟล์ sea-config.jso n:
{ "main": "myscript.js", "output": "sea-prep.blob" }
เมื่อดำเนินการด้วย node --experimental-sea-config sea-config.json
blob จะถูกเขียนไปยังไฟล์ sea-prep.blob ซึ่งสามารถแทรกลงในไบนารีได้
คุณลักษณะ SEA ช่วยให้นักพัฒนาแจกจ่ายแอปพลิเคชัน Node.js โดยไม่ต้องให้ผู้ใช้ติดตั้ง Node.js ฟังก์ชันนี้สร้างขึ้นโดย Darshan Sen ผู้ได้รับรางวัลผลงานยอดเยี่ยมจากรางวัล New Arrival ซึ่งเป็นส่วนหนึ่งของ JavaScriptLandia Awards ที่ OpenJS World
Microsoft ซึ่งเป็นสมาชิกของ OpenJS Foundation กำลังตรวจสอบฟีเจอร์นี้เพื่อลดการโจมตีแบบเวกเตอร์และเสริมประสิทธิภาพสถาปัตยกรรม Node.js เพื่อประสบการณ์ที่ดียิ่งขึ้น ในขณะที่ฟีเจอร์ SEA ยังอยู่ในช่วงทดลอง แต่ก็แสดงถึงการพัฒนาใหม่ที่น่าตื่นเต้นสำหรับชุมชน Node.js
ผลงาน
Node.js v20 มาพร้อมกับการปรับปรุงที่สำคัญสำหรับรันไทม์ โดยมุ่งเน้นประสิทธิภาพใหม่โดยทีมประสิทธิภาพ Node.js ที่ตั้งขึ้นใหม่ การปรับปรุงรวมถึงการเพิ่มประสิทธิภาพให้กับส่วนหลักของรันไทม์ เช่น URL, fetch()
และ EventTarget
หนึ่งในการปรับปรุงที่โดดเด่นคือการลดต้นทุนในการเริ่มต้น EventTarget
ซึ่งลดลงครึ่งหนึ่ง ส่งผลให้เข้าถึงระบบย่อยทั้งหมดได้เร็วขึ้น นอกจากนี้ยังใช้การเรียก V8 Fast API เพื่อเพิ่มประสิทธิภาพใน API เช่น URL.canParse()
และตัวจับเวลา
การเปลี่ยนแปลงเฉพาะอีกอย่างคือการรวม Ada เวอร์ชัน 2.0 ที่อัปเดต ซึ่งเป็นตัวแยกวิเคราะห์ URL ที่รวดเร็วและเป็นไปตามข้อกำหนดเฉพาะซึ่งเขียนด้วยภาษา C++
สรุป
ในบทความนี้ คุณได้เรียนรู้คุณสมบัติหลักบางอย่าง (ทั้งแบบทดลองและแบบเสถียร) และการปรับปรุงที่ Node.js v20 นำเสนอ เช่น การปรับปรุงเอ็นจิ้น V8 JavaScript ประสิทธิภาพ การทดสอบรันเนอร์และการแนะนำโมเดลสิทธิ์ทดลอง และแอปพลิเคชันการดำเนินการเดี่ยว .
สิ่งสำคัญคือต้องทราบว่า Node.js v14 จะสิ้นสุดอายุการใช้งานในเดือนเมษายน 2023 ดังนั้นจึงแนะนำให้เริ่มวางแผนอัปเกรดเป็น Node.js v18 (LTS) หรือ vNode.js 20 (ในเร็วๆ นี้จะเป็น LTS)
คุณต้องการให้เวอร์ชันล่าสุดของ Node.js หมุนหรือไม่ คุณสามารถทำได้โดยปรับใช้แอปพลิเคชัน Node.js บน Kinsta และรับ $20 แรกจากเรา เรารองรับ Node.js v20 แล้ว ซึ่งหมายความว่าคุณสามารถทดสอบฟีเจอร์และความสามารถใหม่ๆ ได้ตั้งแต่วันนี้
ตอนนี้ถึงตาคุณแล้ว! คุณลักษณะหรือการปรับปรุงใดที่คุณสนใจมากที่สุดใน Node.js v20 มีสาระสำคัญที่เราอาจมองข้ามไปหรือไม่? แจ้งให้เราทราบในความคิดเห็น.