JavaScript và StorageManager

JavaScript và StorageManager

Bài viết này giải thích về JavaScript và StorageManager.

Chúng tôi sẽ giải thích chi tiết các tính năng của StorageManager, và giới thiệu cách sử dụng từng bước với những ví dụ mã nguồn thực tế chạy được trong trình duyệt.

YouTube Video

javascript-storage-manager.html
  1<!DOCTYPE html>
  2<html lang="en">
  3<head>
  4  <meta charset="UTF-8">
  5  <title>JavaScript &amp; HTML</title>
  6  <style>
  7    * {
  8        box-sizing: border-box;
  9    }
 10
 11    body {
 12        margin: 0;
 13        padding: 1em;
 14        padding-bottom: 10em;
 15        font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
 16        background-color: #f7f9fc;
 17        color: #333;
 18        line-height: 1.6;
 19    }
 20
 21    .container {
 22        max-width: 800px;
 23        margin: 0 auto;
 24        padding: 1em;
 25        background-color: #ffffff;
 26        border: 1px solid #ccc;
 27        border-radius: 10px;
 28        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
 29    }
 30
 31    .container-flex {
 32        display: flex;
 33        flex-wrap: wrap;
 34        gap: 2em;
 35        max-width: 1000px;
 36        margin: 0 auto;
 37        padding: 1em;
 38        background-color: #ffffff;
 39        border: 1px solid #ccc;
 40        border-radius: 10px;
 41        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
 42    }
 43
 44    .left-column, .right-column {
 45        flex: 1 1 200px;
 46        min-width: 200px;
 47    }
 48
 49    h1, h2 {
 50        font-size: 1.2rem;
 51        color: #007bff;
 52        margin-top: 0.5em;
 53        margin-bottom: 0.5em;
 54        border-left: 5px solid #007bff;
 55        padding-left: 0.6em;
 56        background-color: #e9f2ff;
 57    }
 58
 59    button {
 60        display: block;
 61        margin: 1em auto;
 62        padding: 0.75em 1.5em;
 63        font-size: 1rem;
 64        background-color: #007bff;
 65        color: white;
 66        border: none;
 67        border-radius: 6px;
 68        cursor: pointer;
 69        transition: background-color 0.3s ease;
 70    }
 71
 72    button:hover {
 73        background-color: #0056b3;
 74    }
 75
 76    #output {
 77        margin-top: 1em;
 78        background-color: #1e1e1e;
 79        color: #0f0;
 80        padding: 1em;
 81        border-radius: 8px;
 82        min-height: 200px;
 83        font-family: Consolas, monospace;
 84        font-size: 0.95rem;
 85        overflow-y: auto;
 86        white-space: pre-wrap;
 87    }
 88
 89    .highlight {
 90        outline: 3px solid #ffc107; /* yellow border */
 91        background-color: #fff8e1;  /* soft yellow background */
 92        transition: background-color 0.3s ease, outline 0.3s ease;
 93    }
 94
 95    .active {
 96        background-color: #28a745; /* green background */
 97        color: #fff;
 98        box-shadow: 0 0 10px rgba(40, 167, 69, 0.5);
 99        transition: background-color 0.3s ease, box-shadow 0.3s ease;
100    }
101  </style>
102</head>
103<body>
104    <div class="container">
105        <h1>JavaScript Console</h1>
106        <button id="executeBtn">Execute</button>
107        <div id="output"></div>
108    </div>
109
110    <script>
111        // Override console.log to display messages in the #output element
112        (function () {
113            // Override console.log
114            const originalLog = console.log;
115            console.log = function (...args) {
116                originalLog.apply(console, args);
117                const message = document.createElement('div');
118                message.textContent = args
119                    .map(arg => (typeof arg === "object" && arg !== null ? JSON.stringify(arg) : String(arg)))
120                    .join(" ");
121                output.appendChild(message);
122            };
123
124            // Override console.error
125            const originalError = console.error;
126            console.error = function (...args) {
127                originalError.apply(console, args);
128                const message = document.createElement('div');
129                message.textContent = args
130                    .map(arg => (typeof arg === "object" && arg !== null ? JSON.stringify(arg) : String(arg)))
131                    .join(" ");
132                message.style.color = 'red'; // Color error messages red
133                output.appendChild(message);
134            };
135        })();
136
137        document.getElementById('executeBtn').addEventListener('click', () => {
138            // Prevent multiple loads
139            if (document.getElementById('externalScript')) return;
140
141            const script = document.createElement('script');
142            script.src = 'javascript-storage-manager.js';
143            script.id = 'externalScript';
144            //script.onload = () => console.log('javascript-storage-manager.js loaded and executed.');
145            //script.onerror = () => console.log('Failed to load javascript-storage-manager.js.');
146            document.body.appendChild(script);
147        });
148    </script>
149</body>
150</html>

JavaScript và StorageManager

Các tính năng lưu trữ web như localStorageIndexedDB trong trình duyệt rất quan trọng để lưu trạng thái và dữ liệu của ứng dụng cục bộ trên thiết bị của người dùng. Tuy nhiên, nếu không có đủ thông tin về quản lý dung lượng và tính bền vững của lưu trữ, việc mất dữ liệu ngoài ý muốn có thể xảy ra.

StorageManager là một API được các tác nhân người dùng (chủ yếu là trình duyệt) cung cấp, cho phép lấy và quản lý thông tin về việc sử dụngtính bền vững của lưu trữ.

StorageManager là gì?

StorageManager là một đối tượng có thể truy cập qua navigator.storage, cung cấp các tính năng chính sau:.

  • Lấy thông tin về dung lượng đã dùng và còn trống (navigator.storage.estimate())
  • Kiểm tra trạng thái bền vững của lưu trữ (navigator.storage.persisted())
  • Yêu cầu lưu trữ bền vững (navigator.storage.persist())

Điều này đặc biệt hữu ích nếu bạn muốn đảm bảo lưu trữ bền vững trong Service Workers hoặc PWAs (Progressive Web Apps).

Kiểm tra khả năng hỗ trợ

Trước tiên, hãy kiểm tra xem trình duyệt có hỗ trợ StorageManager không.

1if ('storage' in navigator && 'estimate' in navigator.storage) {
2    console.log("StorageManager is supported.");
3} else {
4    console.warn("StorageManager is not supported in this browser.");
5}
  • Bạn có thể xác định khả năng hỗ trợ bằng cách kiểm tra xem đối tượng navigator.storage có tồn tại và chứa phương thức estimate không.

Lấy thông tin sử dụng lưu trữ

Bằng cách sử dụng navigator.storage.estimate(), bạn có thể lấy được dung lượng lưu trữ ứng dụng đang sử dụng cũng như tổng hạn mức lưu trữ.

 1async function showStorageUsage() {
 2    if (!navigator.storage || !navigator.storage.estimate) {
 3        console.warn("StorageManager is not supported.");
 4        return;
 5    }
 6
 7    const { usage, quota } = await navigator.storage.estimate();
 8    console.log(`Used: ${(usage / 1024 / 1024).toFixed(2)} MB`);
 9    console.log(`Total: ${(quota / 1024 / 1024).toFixed(2)} MB`);
10    console.log(`Usage percentage: ${(usage / quota * 100).toFixed(2)}%`);
11}
12
13showStorageUsage();
  • usage là lượng sử dụng hiện tại tính theo byte, và quota là dung lượng tối đa có thể dùng. Bạn có thể theo dõi mức sử dụng lưu trữ để thông báo cho người dùng nếu ứng dụng gần đạt giới hạn, hoặc dùng cho các mục đích khác.

Kiểm tra tính bền vững của lưu trữ

Trong nhiều trình duyệt, lưu trữ được lưu dưới dạng 'tạm thời', nghĩa là có thể bị xóa tự động nếu dung lượng ổ đĩa không đủ. Bằng cách sử dụng phương thức persisted(), bạn có thể kiểm tra xem lưu trữ hiện tại có bền vững hay không.

1async function checkPersistence() {
2    const isPersisted = await navigator.storage.persisted();
3    console.log(`Persistent storage: ${isPersisted ? "Yes" : "No"}`);
4}
5
6checkPersistence();

Yêu cầu lưu trữ bền vững

Nếu chưa bền vững, bạn có thể yêu cầu tính bền vững từ trình duyệt bằng cách sử dụng persist(). Tuy nhiên, yêu cầu có thể bị từ chối tùy thuộc vào hành động rõ ràng của người dùng hoặc một số điều kiện nhất định.

1async function requestPersistence() {
2    const granted = await navigator.storage.persist();
3    console.log(`Persistence request ${granted ? "granted" : "denied"}`);
4}
5
6requestPersistence();

Trong nhiều trình duyệt, đáp ứng các điều kiện sau sẽ tăng khả năng được phê duyệt lưu trữ bền vững:.

  • Ứng dụng được cài đặt dưới dạng PWA
  • Người dùng thường xuyên sử dụng ứng dụng
  • Ứng dụng chạy trong môi trường HTTPS
  • Yêu cầu bền vững gắn liền với hành động rõ ràng của người dùng, như nhấp chuột

Ví dụ thực tiễn: Yêu cầu người dùng lưu trữ bền vững khi chưa được bật

 1async function ensurePersistence() {
 2    const isPersisted = await navigator.storage.persisted();
 3    if (isPersisted) {
 4        console.log("Already using persistent storage.");
 5        return;
 6    }
 7
 8    const granted = await navigator.storage.persist();
 9    if (granted) {
10        alert("Storage has been set to persistent.");
11    } else {
12        alert("Unable to set persistent storage. Your data may be deleted.");
13    }
14}
15
16document.querySelector("#persistButton").addEventListener("click", ensurePersistence);
  • Trong ví dụ này, yêu cầu lưu trữ bền vững được gửi khi người dùng nhấp vào nút. Việc sử dụng nút đảm bảo yêu cầu được gửi trong ngữ cảnh hành động của người dùng, tăng khả năng được chấp nhận.

Lưu ý và khả năng tương thích

  • navigator.storage chỉ khả dụng trong môi trường HTTPS.
  • Các trình duyệt lớn (Chrome, Edge, Firefox) đều hỗ trợ, nhưng một số tính năng bị giới hạn trên Safari.
  • quota phụ thuộc vào điều kiện lưu trữ của thiết bị, và có thể khác nhau giữa các thiết bị ngay trên cùng một trang web.

Tóm tắt

Bằng cách sử dụng StorageManager, các ứng dụng web có thể khai thác lưu trữ cục bộ của người dùng một cách an toàn và chiến lược hơn. Nó chủ yếu cung cấp các tính năng sau:.

  • Bạn có thể kiểm tra dung lượng lưu trữ bằng estimate().
  • Bạn có thể kiểm tra trạng thái bền vững bằng persisted().
  • Bạn có thể yêu cầu bền vững thông qua persist().

Khi phát triển PWA hoặc các ứng dụng ưu tiên offline, việc sử dụng StorageManager giúp bạn vừa nâng cao trải nghiệm người dùng, vừa tăng cường bảo vệ dữ liệu.

Bạn có thể làm theo bài viết trên bằng cách sử dụng Visual Studio Code trên kênh YouTube của chúng tôi. Vui lòng ghé thăm kênh YouTube.

YouTube Video