มีอะไรใหม่ใน Node.js v20 (Test Runner, Permission Model, SEA, V8 JS Engine 11.3)

เผยแพร่แล้ว: 2023-04-28

Node.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 เวอร์ชันอื่นๆ สิ่งที่คุณต้องทำคือ:

  1. ดาวน์โหลดแพ็คเกจตัวติดตั้งจากเว็บไซต์ทางการของ Node.js
  2. เมื่อคุณดาวน์โหลดตัวติดตั้งแล้ว ให้เรียกใช้และทำตามคำแนะนำเพื่อสิ้นสุดกระบวนการติดตั้ง กระบวนการนี้ค่อนข้างตรงไปตรงมา และคุณเพียงแค่ต้องยอมรับข้อตกลงใบอนุญาตและคลิกปุ่ม "ถัดไป"
  3. รีสตาร์ทระบบ/เครื่องของคุณหลังจากกระบวนการติดตั้งเสร็จสิ้นเพื่อให้แน่ใจว่าการเปลี่ยนแปลงทั้งหมดจะมีผล
  4. ตรวจสอบการติดตั้ง Node.js ของคุณโดยเรียกใช้คำสั่งต่อไปนี้:
 node -v
ตรวจสอบการติดตั้ง Node.js v20
การติดตั้ง Node.js v20

หากคุณเห็นหมายเลขเวอร์ชัน (v20.0.0) แสดงว่าติดตั้ง Node.js อย่างถูกต้อง และคุณพร้อมที่จะเริ่มทำงานกับ Node.js v20 แล้ว

Node.js v20 มาแล้ว! ดู Permission Model, synchronous import.meta.resolve, ทดสอบความเสถียร, และคุณสมบัติและการอัปเดตที่น่าตื่นเต้นอื่นๆ ที่นี่ ️ คลิกเพื่อทวีต

มีอะไรใหม่ใน 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 นำเสนอการทดสอบรันเนอร์แบบเนทีฟที่เสถียร ได้เวลาทดสอบโค้ดของคุณอย่างมีประสิทธิภาพมากขึ้นแล้ว! ลองดูสิ ️ คลิกเพื่อทวีต

สรุป

ในบทความนี้ คุณได้เรียนรู้คุณสมบัติหลักบางอย่าง (ทั้งแบบทดลองและแบบเสถียร) และการปรับปรุงที่ 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 มีสาระสำคัญที่เราอาจมองข้ามไปหรือไม่? แจ้งให้เราทราบในความคิดเห็น.