0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

Caching trong Node.js với TypeScript: Sử dụng globalThis

Đăng vào 5 tháng trước

• 4 phút đọc

Caching trong Node.js với TypeScript: Sử dụng globalThis và declare global

Trong môi trường Node.js, đặc biệt là khi làm việc với TypeScript, đôi khi bạn sẽ gặp những tình huống cần một cơ chế caching đơn giản — một cái gì đó nhẹ nhàng để lưu trữ một biến mà tồn tại trong suốt thời gian máy chủ đang chạy.

Một trong những cách hiệu quả và đơn giản nhất để đạt được điều này là sử dụng globalThisdeclare global.

Vấn đề tôi gặp phải

Trong một trong những dự án của tôi, tôi đang quản lý việc đặt chỗ cho các hội thảo. Mỗi bản ghi đặt chỗ bao gồm vehicle_id, mà trỏ đến một phương tiện được lưu trữ trong hệ thống khác.

Chúng tôi có một hệ thống bên thứ ba cần lấy dữ liệu đặt chỗ cùng với chi tiết phương tiện trong cùng một cuộc gọi API.

Để hỗ trợ điều này, tôi đã tạo một hook trong Directus chạy trước mỗi lần truy xuất đặt chỗ. Hook này có trách nhiệm:

  • Phát hiện xem vehicle_id có tồn tại hay không.
  • Lấy dữ liệu phương tiện đầy đủ từ hệ thống bên ngoài.
  • Gắn đối tượng phương tiện vào kết quả đặt chỗ.

Thách thức thực sự: Tránh gọi API trùng lặp

Tôi không muốn lấy dữ liệu phương tiện nhiều lần, đặc biệt là vì dữ liệu phương tiện không thay đổi thường xuyên. Điều đó sẽ lãng phí thời gian và tài nguyên mạng.

Vì vậy, tôi cần một lớp caching đơn giản để lưu trữ dữ liệu phương tiện sau lần lấy đầu tiên và tái sử dụng cho các yêu cầu tương lai — miễn là máy chủ vẫn đang chạy.

globalThis là gì?

Trong JavaScript (và TypeScript), globalThis là một đối tượng cho phép bạn truy cập vào phạm vi toàn cục, bất kể môi trường nào (Node.js, trình duyệt, v.v.).

Điều đó có nghĩa là bất kỳ biến nào bạn gán cho globalThis sẽ có thể truy cập từ bất kỳ đâu trong mã của bạn và sẽ tồn tại trong suốt thời gian quá trình máy chủ đang chạy.

Ví dụ:

javascript Copy
globalThis.myAppName = "DriveMotive";
console.log(globalThis.myAppName); // Kết quả: DriveMotive

Sử dụng globalThis với TypeScript

Trong một dự án TypeScript, nếu bạn cố gắng viết:

javascript Copy
globalThis.__vehicleCache = new Map();

Bạn sẽ nhận được một lỗi TypeScript:

❌ Thuộc tính __vehicleCache không tồn tại trên kiểu 'typeof globalThis'.

Điều này là do TypeScript là an toàn về kiểu dữ liệu và không biết về thuộc tính này trừ khi bạn nói rõ điều đó.

Cách khai báo một biến toàn cục trong TypeScript

Bước 1: Cho TypeScript biết đây là một module

Ở đầu tệp (thường là types.d.ts), thêm:

typescript Copy
export {}; // Điều này biến tệp thành một module

Bước 2: Khai báo biến toàn cục

typescript Copy
declare global {
  var __vehicleCache: Map<any, any> | undefined;
}

Điều này cho TypeScript biết:

"Chào, có một biến toàn cục được gọi là __vehicleCache, và nó có thể là một Map hoặc là undefined."

Bước 3: Khởi tạo Cache

Trong logic thực tế của bạn, bạn cần khởi tạo cache nếu nó chưa được tạo:

typescript Copy
const vehicleCache = (globalThis.__vehicleCache ??= new Map());

Dòng lệnh này thực hiện ba việc:

  • Kiểm tra xem __vehicleCache đã tồn tại trong globalThis chưa.
  • Nếu có, gán nó cho vehicleCache.
  • Nếu không, tạo một Map() mới và gán nó.

Thực hành tốt nhất

  • Sử dụng caching một cách thông minh: Chỉ cache những dữ liệu không thay đổi thường xuyên để tiết kiệm tài nguyên.
  • Xóa cache không cần thiết: Đảm bảo rằng bạn có cơ chế xóa cache khi dữ liệu không còn hợp lệ nữa.

Những cạm bẫy thường gặp

  • Quá tải bộ nhớ: Nếu không kiểm soát kích thước cache, bạn có thể gặp phải vấn đề với bộ nhớ.
  • Dữ liệu cũ: Nếu không cập nhật cache kịp thời, bạn có thể trả về dữ liệu không chính xác cho người dùng.

Mẹo hiệu suất

  • Sử dụng Map thay cho Object: Map có hiệu suất tốt hơn cho việc truy cập và lưu trữ dữ liệu lớn.
  • Giới hạn kích thước cache: Duy trì một kích thước tối đa cho cache để tránh sử dụng quá nhiều bộ nhớ.

Giải quyết sự cố

  • Lỗi không tìm thấy thuộc tính: Đảm bảo bạn đã khai báo biến toàn cục trước khi sử dụng.
  • Lỗi loại dữ liệu: Kiểm tra kỹ kiểu dữ liệu khi truy xuất và lưu trữ dữ liệu trong cache.

Kết luận

Hy vọng bài viết này đã giúp bạn hiểu rõ hơn về cách sử dụng globalThisdeclare global trong TypeScript để xây dựng một cơ chế caching hiệu quả và đơn giản. Nếu bạn có bất kỳ câu hỏi nào hoặc muốn thảo luận thêm về chủ đề này, hãy để lại ý kiến của bạn dưới bài viết nhé!

Câu hỏi thường gặp (FAQ)

1. globalThis có khác gì với windowglobal?

globalThis là một cách tiếp cận chung cho mọi môi trường JavaScript, trong khi window chỉ có trong trình duyệt, và global là dành riêng cho Node.js.

2. Caching có ảnh hưởng đến hiệu suất như thế nào?

Caching giúp giảm thời gian truy xuất dữ liệu bằng cách lưu trữ dữ liệu đã truy xuất, giảm thiểu số lần gọi API và tiết kiệm băng thông.

3. Có cách nào khác để thực hiện caching không?

Có, bạn có thể sử dụng các thư viện như Redis hoặc Memcached để thực hiện caching phức tạp hơn trong ứng dụng của bạn.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào