× Giới thiệu Lịch khai giảng Tin tức Sản phẩm học viên

Có gì mới trong Node.js v20

06/05/2023 01:17

Trong bài viết này, bạn đã tìm hiểu một số tính năng chính (thử nghiệm và ổn định) cũng như các cải tiến mà Node.js v20 mang lại, chẳng hạn như các cải tiến đối với công cụ JavaScript V8, hiệu suất, trình chạy thử nghiệm và giới thiệu mô hình cấp phép thử nghiệm cũng như các ứng dụng thực thi đơn lẻ .

Node.js v20 hiện đã có sẵn! Vào ngày 18 tháng 4 năm 2023, nó đã được công khai và hiện mọi người có thể sử dụng. Với bản phát hành này, Node.js sẽ an toàn hơn nhiều và hoạt động tốt hơn.

Điều quan trọng cần biết — vì đây là bản phát hành số chẵn, dự kiến ​​sẽ trở thành phiên bản hỗ trợ dài hạn (LTS) vào tháng 10 năm 2023 và sẽ được hỗ trợ cho đến tháng 4 năm 2026. Tuy nhiên, nhóm Node.js đang tích cực tìm kiếm cộng đồng phản hồi để xác định và khắc phục bất kỳ sự cố nào trước khi nó được thăng cấp lên LTS.

Bản phát hành mới này của Node.js mang đến các bản cập nhật và tính năng thú vị mà các nhà phát triển  chắc chắn sẽ đánh giá cao, chẳng hạn như Mô hình cấp phép thử nghiệm, đồng bộ import.meta.resolve, trình chạy thử nghiệm ổn định, cập nhật công cụ JavaScript V8 lên phiên bản 11.3, mang lại các cải tiến về hiệu suất và sửa lỗi, v.v. .

Trong bài viết này, bạn sẽ khám phá những thay đổi được giới thiệu trong Node.js v20, cung cấp cái nhìn chuyên sâu về các tính năng và khả năng mới của nó.

Bắt đầu với Node.js v20

Việc cài đặt Node.js v20 cũng khá giống với các phiên bản Node.js khác . Tất cả những gì bạn cần làm là:

  1. Tải xuống gói cài đặt từ trang web chính thức của Node.js.
  2. Khi bạn đã tải xuống trình cài đặt, hãy chạy nó và làm theo hướng dẫn để hoàn tất quá trình cài đặt. Quá trình này khá đơn giản và bạn chỉ cần đồng ý với thỏa thuận cấp phép và nhấp vào nút “Tiếp theo”.
  3. Khởi động lại Hệ thống/Máy của bạn sau khi quá trình cài đặt hoàn tất để đảm bảo rằng tất cả các thay đổi đều có hiệu lực.
  4. Xác minh cài đặt Node.js của bạn bằng cách chạy lệnh sau:
node -v
Xác minh cài đặt Node.js v20

Nếu bạn thấy số phiên bản (v20.0.0), điều đó có nghĩa là Node.js đã được cài đặt đúng cách và bạn đã sẵn sàng bắt đầu làm việc với Node.js v20.

Có gì mới trong Node.js v20?

Hãy khám phá 5 bản cập nhật lớn được giới thiệu với bản phát hành Node.js này. Những tính năng này bao gồm:

Mô hình cấp phép thử nghiệm

Việc giới thiệu Mô hình cấp phép thử nghiệm trong Node.js v20 là một bổ sung quan trọng giúp các nhà phát triển kiểm soát nhiều hơn đối với quyền truy cập vào các tài nguyên cụ thể trong quá trình thực thi.

Tính năng mới này có lợi khi việc sử dụng tài nguyên và bảo mật là quan trọng, chẳng hạn như trong môi trường sản xuất.

Mô hình quyền đi kèm với một số khả năng, bao gồm hạn chế quyền truy cập vào hệ thống tệp, child_ process, worker_threads và addons gốc.

Các nhà phát triển có thể sử dụng các cờ như --allow-fs-read--allow-fs-writevà --allow-child-processđể chỉ định tài nguyên nào có thể truy cập được. Để kích hoạt các cờ này, nhà phát triển cần sử dụng --experimental-permissioncờ kết hợp với các quyền cần thiết.

Dưới đây là một ví dụ về cách sử dụng Mô hình quyền để cho phép đọc và ghi quyền truy cập vào toàn bộ hệ thống tệp:

$ node --experimental-permission --allow-fs-read=* --allow-fs-write=* index.js

Các nhà phát triển cũng có thể sử dụng Mô hình quyền để chỉ định quyền truy cập vào các thư mục và tệp cụ thể. Chẳng hạn, lệnh sau cho phép ghi quyền truy cập vào thư mục /tmp/  :

$ node --experimental-permission --allow-fs-write=/tmp/ --allow-fs-read=/home/index.js index.js

Một lợi ích đáng kể của Mô hình quyền là khả năng thực hiện kiểm soát chi tiết hơn đối với quyền truy cập của hệ thống tệp. Chẳng hạn, nhà phát triển có thể chỉ định đường dẫn và mẫu ký tự đại diện để cho phép truy cập vào các thư mục hoặc tệp cụ thể.

$ node --experimental-permission --allow-fs-read=/home/user/* index.js

Lệnh trên cấp quyền truy cập đọc vào tất cả các thư mục bên trong thư mục /home/user/  .

Thuộc tính quyền của đối tượng quy trình cũng có thể được sử dụng để kiểm tra xem một quyền cụ thể đã được cấp khi chạy hay chưa. Ví dụ: nếu bạn muốn kiểm tra xem quy trình Node.js của mình có quyền truy cập đọc vào một thư mục cụ thể hay không, /home/user/documents , bạn có thể sử dụng đoạn mã sau:

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');
}

Bằng cách sử dụng Mô hình quyền, bạn có quyền kiểm soát chi tiết hơn đối với quyền truy cập hệ thống tệp của quy trình Node.js, điều này có thể dẫn đến bảo mật tốt hơn và sử dụng tài nguyên hiệu quả hơn.

Tester

Node.js v20 bao gồm một phiên bản ổn định của mô-đun test_runner cho phép các nhà phát triển xây dựng và chạy các bộ thử nghiệm JavaScript  một cách nhanh chóng và dễ dàng mà không cần cài đặt các phần phụ thuộc bổ sung.

Trình chạy thử nghiệm ổn định hiện bao gồm một số khối xây dựng, chẳng hạn như describeittestvà móc, để tạo và cấu trúc các tệp thử nghiệm, cùng với mô phỏng, chế độ xem và khả năng chạy song song nhiều tệp thử nghiệm bằng cách sử dụng lệnh node --test.

Đây là một ví dụ về cách sử dụng trình chạy thử nghiệm:

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");
});

Trình chạy thử nghiệm cung cấp trình báo cáo thử nghiệm tùy chỉnh và có thể định cấu hình thông qua --test-reportercờ, phạm vi kiểm tra thử nghiệm thông qua --experimental-test-coveragecờ và khả năng mô phỏng.

Mặc dù không nhằm mục đích thay thế các khung kiểm tra đầy đủ tính năng như Jest  hoặc Mocha , trình chạy thử nghiệm ổn định cung cấp một cách đơn giản và nhanh chóng để tạo các bộ kiểm tra. Tính năng này đã được cải tiến đáng kể kể từ khi được giới thiệu trong Node.js v19, và nhờ thử nghiệm cũng như phản hồi của người dùng cuối, tính năng này hiện đã được đánh dấu là ổn định trong Node.js v20.

Công cụ JavaScript V8 Đã cập nhật lên 11.3

Công cụ JavaScript V8 , hỗ trợ Node.js, đã được cập nhật lên phiên bản 11.3 trong Node.js v20. Điều này mang lại hiệu suất được cải thiện và giới thiệu các tính năng ngôn ngữ mới. Một số tính năng mới trong bản cập nhật này bao gồm:

  • String.prototype.isWellFormedvà toWellFormed: Các phương thức này đặc biệt hữu ích để đảm bảo định dạng chuỗi phù hợp. Điều này giúp đảm bảo rằng đầu vào chuỗi của người dùng ở định dạng UTF-16 chính xác, giảm lỗi trong thời đại biểu tượng cảm xúc.
  • Các phương thức thay đổi Array và TypedArray bằng bản sao: Điều này có thể hữu ích để tạo các bản sao đã sửa đổi của mảng mà không ảnh hưởng đến dữ liệu gốc, điều này đặc biệt phù hợp trong trường hợp bạn cần lưu giữ dữ liệu gốc để so sánh hoặc các mục đích khác.
  • Có thể thay đổi kích thước ArrayBuffervà có thể phát triển SharedArrayBuffer: cung cấp tính linh hoạt cao hơn, cho phép phân bổ bộ nhớ hiệu quả hơn.
  • Cờ RegExp v với tập ký hiệu và thuộc tính của chuỗi: thêm chức năng cho biểu thức chính quy.
  • Gọi đuôi WebAssembly: cung cấp cách tối ưu hóa một số kiểu gọi hàm nhất định.

Các bản cập nhật này thể hiện cam kết liên tục của cộng đồng phát triển Node.js nhằm cải thiện hiệu suất và chức năng.

Đồng bộ import.meta.resolve()

Trong Node.js v20, import.meta.resolve()đã được giới thiệu, giúp viết các tập lệnh không nhạy cảm với vị trí dễ dàng hơn. Chức năng này trả về một cách đồng bộ, tương tự như hành vi của trình duyệt, cho phép thực thi hiệu quả hơn.

Các hook phân giải trình tải người dùng vẫn có thể được định nghĩa là một hàm không đồng bộ, nhưng import.meta.resolve()sẽ vẫn trả về đồng bộ cho mã ứng dụng ngay cả khi các hook phân giải không đồng bộ được tải.

Hành vi đồng bộ của import.meta.resolve()cho phép thực thi mã hiệu quả hơn, đặc biệt là khi xử lý lượng dữ liệu lớn. Với tư cách là tác giả, bạn có thể xác định các móc giải quyết là các chức năng không đồng bộ hoặc đồng bộ hóa, tùy theo sở thích của bạn. Mã ứng dụng sẽ vẫn thực thi đồng bộ bất kể có tải móc giải quyết không đồng bộ hay không.

 

Các ứng dụng thực thi đơn thử nghiệm (SEA)

Các ứng dụng có thể thực thi đơn lẻ thử nghiệm (SEA) là một tính năng mới được giới thiệu trong Node.js v20 cho phép đóng gói ứng dụng của bạn với tệp nhị phân Node.js, cho phép người dùng cuối phân phối và chạy ứng dụng đó dưới dạng một tệp thực thi duy nhất.

Đây là yêu cầu từ lâu của cộng đồng và nhóm đã cải tiến phương pháp này trong năm qua.

Trong Node.js v20, việc xây dựng một ứng dụng thực thi duy nhất yêu cầu đưa vào một blob do Node.js chuẩn bị từ cấu hình JSON thay vì đưa vào tệp JS thô.

Một đốm màu là một tệp chứa dữ liệu nhị phân, trong trường hợp này, do Node.js chuẩn bị và nó được đưa vào tệp nhị phân. Thay đổi này được thực hiện để cho phép nhúng nhiều tài nguyên cùng tồn tại vào SEA, mở ra các trường hợp sử dụng mới.

Đây là một ví dụ về tệp sea-config.jso n:

{ 
      "main": "myscript.js", 
      "output": "sea-prep.blob" 
}

Khi được thực thi bằng lệnh node --experimental-sea-config sea-config.json, blob được ghi vào tệp sea-prep.blob  , tệp này sau đó có thể được đưa vào tệp nhị phân.

Tính năng SEA cho phép các nhà phát triển phân phối các ứng dụng Node.js  mà không yêu cầu người dùng cài đặt Node.js. Chức năng được tạo bởi Darshan Sen , người đã giành được giải thưởng Đóng góp xuất sắc từ giải thưởng Hàng mới trong khuôn khổ Giải thưởng JavaScriptLandia tại OpenJS World.

Microsoft, một thành viên của OpenJS Foundation, đang nghiên cứu tính năng này như một cách để giảm các cuộc tấn công véc tơ và hỗ trợ kiến ​​trúc Node.js để có trải nghiệm tốt hơn. Mặc dù tính năng SEA vẫn đang trong giai đoạn thử nghiệm nhưng nó thể hiện một bước phát triển mới thú vị cho cộng đồng Node.js.

 

Hiệu suất

Node.js v20 đi kèm với những cải tiến đáng kể đối với thời gian chạy của nó, với sự tập trung đổi mới vào hiệu suất của nhóm hiệu suất Node.js mới thành lập. Các cải tiến bao gồm tối ưu hóa cho các phần cốt lõi của thời gian chạy, chẳng hạn như URL, fetch()và EventTarget.

Một trong những cải tiến đáng chú ý là việc giảm chi phí khởi tạo EventTargetđã được cắt giảm một nửa, dẫn đến khả năng truy cập nhanh hơn vào tất cả các hệ thống con sử dụng nó. Ngoài ra, các lệnh gọi API V8 Fast đã được sử dụng để nâng cao hiệu suất trong các API như URL.canParse()và bộ hẹn giờ.

Một thay đổi cụ thể khác là bao gồm phiên bản cập nhật 2.0 của Ada, trình phân tích cú pháp URL nhanh và tuân thủ thông số kỹ thuật được viết bằng C++.