Sử dụng SQLite để xử lý hiệu quả mọi nhu cầu lưu trữ của bạn trên web.
SQLite là một hệ thống quản lý cơ sở dữ liệu quan hệ nhúng, gọn nhẹ, mã nguồn mở và phổ biến. Nhiều nhà phát triển sử dụng công cụ này để lưu trữ dữ liệu theo cách có cấu trúc và dễ sử dụng. Do kích thước nhỏ và yêu cầu thấp về bộ nhớ, SQLite thường được tận dụng làm công cụ cơ sở dữ liệu trong thiết bị di động, ứng dụng dành cho máy tính và trình duyệt web.
Một trong những tính năng chính của SQLite là đây là một cơ sở dữ liệu không có máy chủ, tức là không yêu cầu một quy trình máy chủ riêng biệt để hoạt động. Thay vào đó, cơ sở dữ liệu được lưu trữ trong một tệp duy nhất trên thiết bị của người dùng, giúp bạn dễ dàng tích hợp vào các ứng dụng.
SQLite dựa trên Web Assembly
Có một số phiên bản SQLite không chính thức dựa trên Web Assembly (Wasm), cho phép sử dụng phiên bản này trong trình duyệt web, ví dụ: sql.js. Dự án con sqlite3 WASM/JS là nỗ lực đầu tiên được liên kết chính thức với dự án SQLite, giúp các bản dựng Wasm của thư viện trở thành thành viên chính thức trong nhóm các sản phẩm được hỗ trợ của SQLite. Các mục tiêu cụ thể của dự án này bao gồm:
- Liên kết một API sqlite3 cấp thấp gần với API C nhất có thể về cách sử dụng.
- Một API hướng đối tượng ở cấp cao hơn, tương tự như sql.js và các phương thức triển khai theo kiểu Node.js, giao tiếp trực tiếp với API cấp thấp. Bạn phải sử dụng API này từ cùng một luồng với API cấp thấp.
- Một API dựa trên Worker giao tiếp với các API trước đó thông qua thông báo Worker. Thao tác này được dùng trong luồng chính, với các API cấp thấp hơn được cài đặt trong một luồng Worker và giao tiếp với các API đó thông qua thông báo Worker.
- Một biến thể dựa trên Promise của Worker API, hoàn toàn ẩn các khía cạnh giao tiếp giữa các luồng khỏi người dùng.
- Hỗ trợ bộ nhớ liên tục phía máy khách bằng cách sử dụng các API JavaScript hiện có, bao gồm cả Hệ thống tệp riêng tư gốc (OPFS).
Sử dụng SQLite Wasm với phần phụ trợ duy trì Origin Private File System
Cài đặt thư viện từ npm
Cài đặt gói @sqlite.org/sqlite-wasm từ npm bằng lệnh sau:
npm install @sqlite.org/sqlite-wasm
Origin Private File System
Origin Private File System (OPFS, một phần của File System Access API) được tăng cường bằng một giao diện đặc biệt giúp truy cập vào dữ liệu với hiệu suất rất cao. Bề mặt mới này khác với các bề mặt hiện có ở chỗ cung cấp quyền ghi tại chỗ và độc quyền đối với nội dung của một tệp. Thay đổi này, cùng với khả năng đọc nhất quán các nội dung sửa đổi chưa được xoá và sự sẵn có của một biến thể đồng bộ trên các worker chuyên dụng, giúp cải thiện đáng kể hiệu suất và mở ra các trường hợp sử dụng mới.
Như bạn có thể hình dung, điểm cuối cùng trong các mục tiêu của dự án (Hỗ trợ bộ nhớ liên tục phía máy khách bằng cách sử dụng các API JavaScript hiện có) đi kèm với các yêu cầu nghiêm ngặt về hiệu suất liên quan đến việc duy trì dữ liệu vào tệp cơ sở dữ liệu.
Đây là nơi Hệ thống tệp riêng tư gốc và cụ thể hơn là phương thức createSyncAccessHandle()
của các đối tượng FileSystemFileHandle
phát huy tác dụng. Phương thức này trả về một Promise phân giải thành một đối tượng FileSystemSyncAccessHandle
. Bạn có thể dùng đối tượng này để đọc và ghi vào một tệp theo cách đồng bộ. Bản chất đồng bộ của phương thức này mang lại lợi thế về hiệu suất, nhưng do đó, phương thức này chỉ có thể dùng bên trong Web Worker chuyên dụng cho các tệp trong Origin Private File System để luồng chính không bị chặn.
Thiết lập tiêu đề bắt buộc
Trong số các tệp khác, tệp lưu trữ SQLite Wasm đã tải xuống chứa các tệp sqlite3.js
và sqlite3.wasm
. Đây là các tệp tạo nên bản dựng sqlite3 WASM/JS. Thư mục jswasm
chứa các thành phần sqlite3 cốt lõi và thư mục cấp cao nhất chứa các ứng dụng minh hoạ và kiểm thử. Trình duyệt sẽ không phân phát tệp Wasm từ URL file://
, vì vậy, mọi ứng dụng bạn tạo bằng cách này đều yêu cầu một máy chủ web và máy chủ đó phải có các tiêu đề sau trong phản hồi khi phân phát tệp:
Cross-Origin-Opener-Policy
được đặt thành chỉ thịsame-origin
, chỉ thị này chỉ tách biệt bối cảnh duyệt web với các tài liệu có cùng nguồn gốc. Các tài liệu trên nhiều nguồn gốc không được tải trong cùng một bối cảnh duyệt web.Cross-Origin-Embedder-Policy
được đặt thành chỉ thịrequire-corp
, do đó, một tài liệu chỉ có thể tải tài nguyên từ cùng một nguồn gốc hoặc tài nguyên được đánh dấu rõ ràng là có thể tải từ một nguồn gốc khác.
Lý do cho các tiêu đề này là SQLite Wasm phụ thuộc vào SharedArrayBuffer
và việc thiết lập các tiêu đề này là một phần trong yêu cầu bảo mật của nó.
Nếu kiểm tra lưu lượng truy cập bằng Công cụ cho nhà phát triển, bạn sẽ thấy thông tin sau:
Speedtest
Nhóm SQLite đã chạy một số điểm chuẩn trên việc triển khai WebAssembly so với Web SQL không được dùng nữa. Các điểm chuẩn này cho thấy SQLite Wasm thường có tốc độ tương đương với Web SQL. Đôi khi tốc độ này chậm hơn một chút, đôi khi nhanh hơn một chút. Xem tất cả thông tin chi tiết trên trang kết quả.
Mã mẫu bắt đầu
Như đã đề cập trước đó, SQLite Wasm có phần phụ trợ duy trì Origin Private File System cần chạy trong ngữ cảnh Worker. Tin vui là thư viện này sẽ tự động xử lý tất cả những việc này cho bạn và bạn có thể sử dụng ngay từ luồng chính.
import { sqlite3Worker1Promiser } from '@sqlite.org/sqlite-wasm';
(async () => {
try {
console.log('Loading and initializing SQLite3 module...');
const promiser = await new Promise((resolve) => {
const _promiser = sqlite3Worker1Promiser({
onready: () => {
resolve(_promiser);
},
});
});
console.log('Done initializing. Running demo...');
let response;
response = await promiser('config-get', {});
console.log('Running SQLite3 version', response.result.version.libVersion);
response = await promiser('open', {
filename: 'file:worker-promiser.sqlite3?vfs=opfs',
});
const { dbId } = response;
console.log(
'OPFS is available, created persisted database at',
response.result.filename.replace(/^file:(.*?)\?vfs=opfs$/, '$1'),
);
await promiser('exec', { dbId, sql: 'CREATE TABLE IF NOT EXISTS t(a,b)' });
console.log('Creating a table...');
console.log('Insert some data using exec()...');
for (let i = 20; i <= 25; ++i) {
await promiser('exec', {
dbId,
sql: 'INSERT INTO t(a,b) VALUES (?,?)',
bind: [i, i * 2],
});
}
console.log('Query data with exec()');
await promiser('exec', {
dbId,
sql: 'SELECT a FROM t ORDER BY a LIMIT 3',
callback: (result) => {
if (!result.row) {
return;
}
console.log(result.row);
},
});
await promiser('close', { dbId });
} catch (err) {
if (!(err instanceof Error)) {
err = new Error(err.result.message);
}
console.error(err.name, err.message);
}
})();
Bản minh hoạ
Xem đoạn mã trên hoạt động trong bản minh hoạ. Nhớ xem mã nguồn trên GitHub. Lưu ý rằng phiên bản được nhúng bên dưới không sử dụng phần phụ trợ OPFS, nhưng khi bạn mở bản minh hoạ trong một thẻ riêng biệt, phiên bản này sẽ sử dụng.
Gỡ lỗi Origin Private File System
Để gỡ lỗi đầu ra của Hệ thống tệp riêng tư theo nguồn gốc của SQLite Wasm, hãy sử dụng tiện ích OPFS Explorer của Chrome.
Sau khi cài đặt tiện ích này, hãy mở Công cụ cho nhà phát triển của Chrome, chọn thẻ OPFS Explorer (Trình khám phá OPFS). Sau đó, bạn có thể kiểm tra những gì SQLite Wasm ghi vào Origin Private File System (Hệ thống tệp riêng tư của nguồn gốc).
Nếu chọn bất kỳ tệp nào trong cửa sổ OPFS Explorer trong Công cụ cho nhà phát triển, bạn có thể lưu tệp đó vào ổ đĩa cục bộ. Sau đó, bạn có thể sử dụng một ứng dụng như SQLite Viewer để kiểm tra cơ sở dữ liệu, nhờ đó, bạn có thể yên tâm rằng SQLite Wasm thực sự hoạt động như đã hứa.
Tìm sự trợ giúp và đưa ra ý kiến phản hồi
SQLite Wasm do cộng đồng SQLite phát triển và duy trì. Tìm sự trợ giúp và đưa ra ý kiến phản hồi bằng cách tìm kiếm và đăng bài trên diễn đàn hỗ trợ. Bạn có thể xem tài liệu đầy đủ trên trang web của SQLite.