Hướng dẫn how can javascript store data locally? - javascript có thể lưu trữ dữ liệu cục bộ như thế nào?
Modern web browsers support a number of ways for web sites to store data on the user's computer — with the
user's permission — then retrieve it when necessary. This lets you persist data for long-term storage, save sites or documents for offline use, retain user-specific settings for your site, and more. This article explains the very basics of how these work. Elsewhere in the MDN learning area we talked about the difference between static sites and
dynamic sites. Most major modern web sites are dynamic — they store data on the server using some kind of database (server-side storage), then run server-side code to retrieve needed data, insert it into static page templates, and serve the resulting HTML to the client to
be displayed by the user's browser. Client-side storage works on similar principles, but has different uses. It consists of JavaScript APIs that allow you to store data on the client (i.e. on the user's machine) and then retrieve it when needed. This has many distinct uses, such as: Often client-side and server-side storage are used together. For example, you could download a batch of music files (perhaps used by a web game or music player application), store them
inside a client-side database, and play them as needed. The user would only have to download the music files once — on subsequent visits they would be retrieved from the database instead. Note: There are limits to the amount of data you can store using client-side storage APIs (possibly both per individual API and cumulatively); the exact limit varies depending on the browser and possibly based on user settings. See
Browser storage limits and eviction criteria for more information. The concept of client-side storage has been around for a long time. Since the early days of the web, sites have used cookies to store information to personalize user experience on websites. They're the earliest form of client-side storage commonly used on the web. These days, there are easier mechanisms available for storing client-side data, therefore we won't be teaching you
how to use cookies in this article. However, this does not mean cookies are completely useless on the modern-day web — they are still used commonly to store data related to user personalization and state, e.g. session IDs and access tokens. For more information on cookies see our Using HTTP cookies article. The "easier" features we mentioned above are as follows: You'll learn more about these APIs below. The
Use of Cache and Service Workers is an advanced topic, and we won't be covering it in great detail in this article, although we will show an example in the Offline asset storage section below. Storing simple data — web storageThe Web Storage API is very easy to use — you store simple name/value pairs of data (limited to strings, numbers, etc.) and retrieve these values when needed. Basic syntaxLet's show you how:
Dữ liệu vẫn tồn tại!Một tính năng chính của lưu trữ web là dữ liệu vẫn tồn tại giữa các tải trang (và ngay cả khi trình duyệt bị tắt, trong trường hợp 9). Hãy xem xét điều này trong hành động.
Lưu trữ riêng cho từng miềnCó một kho lưu trữ dữ liệu riêng cho mỗi miền (mỗi địa chỉ web riêng biệt được tải trong trình duyệt). Bạn sẽ thấy rằng nếu bạn tải hai trang web (giả sử Google.com và Amazon.com) và thử lưu trữ một mục trên một trang web, nó sẽ không có sẵn cho trang web khác. Điều này có ý nghĩa - bạn có thể tưởng tượng các vấn đề bảo mật sẽ phát sinh nếu các trang web có thể nhìn thấy dữ liệu của nhau! Một ví dụ liên quan hơnHãy áp dụng kiến thức mới được tìm thấy này bằng cách viết một ví dụ làm việc để cung cấp cho bạn ý tưởng về cách sử dụng lưu trữ web. Ví dụ của chúng tôi sẽ cho phép bạn nhập tên, sau đó trang sẽ cập nhật để cung cấp cho bạn một lời chào được cá nhân hóa. Trạng thái này cũng sẽ tồn tại trên các trang tải lại trang/trình duyệt, vì tên được lưu trữ trong lưu trữ web. Bạn có thể tìm thấy ví dụ HTML tại Personal-Leting.html-Điều này chứa một trang web có tiêu đề, nội dung và chân trang và biểu mẫu để nhập tên của bạn.
Hãy xây dựng ví dụ, để bạn có thể hiểu cách thức hoạt động của nó.
Ví dụ của bạn đã hoàn thành - hoàn thành tốt! Tất cả những gì còn lại bây giờ là lưu mã của bạn và kiểm tra trang HTML của bạn trong trình duyệt. Bạn có thể thấy phiên bản đã hoàn thành của chúng tôi chạy trực tiếp ở đây. Lưu ý: Trong dòng 9 of the source for our finished version, the 4 attribute specifies that the contents of the 5 element will not execute until the page has finished
loading.Lưu trữ dữ liệu phức tạp - IndexedDBAPI IndexEdDB (đôi khi viết tắt IDB) là một hệ thống cơ sở dữ liệu hoàn chỉnh có sẵn trong trình duyệt trong đó bạn có thể lưu trữ dữ liệu liên quan phức tạp, các loại không giới hạn ở các giá trị đơn giản như chuỗi hoặc số. Bạn có thể lưu trữ video, hình ảnh và khá nhiều thứ khác trong một thể hiện lập chỉ mục. API lập chỉ mục cho phép bạn tạo cơ sở dữ liệu, sau đó tạo các lưu trữ đối tượng trong cơ sở dữ liệu đó. Các cửa hàng đối tượng giống như các bảng trong cơ sở dữ liệu quan hệ và mỗi cửa hàng đối tượng có thể chứa một số đối tượng. Để tìm hiểu thêm về API đã lập chỉ mục, hãy xem bằng cách sử dụng IndexedDB. Tuy nhiên, điều này có chi phí: IndexEdDB phức tạp hơn nhiều so với API lưu trữ web. Trong phần này, chúng tôi thực sự chỉ làm trầy xước bề mặt của những gì nó có khả năng, nhưng chúng tôi sẽ cho bạn đủ để bắt đầu. Làm việc thông qua một ví dụ lưu trữ ghi chúỞ đây, chúng tôi sẽ chạy cho bạn một ví dụ cho phép bạn lưu trữ ghi chú trong trình duyệt của bạn và xem và xóa chúng bất cứ khi nào bạn muốn, giúp bạn tự xây dựng nó và giải thích các phần cơ bản nhất của IDB khi chúng tôi đi cùng. Ứng dụng trông giống như thế này:
Mỗi ghi chú có một tiêu đề và một số văn bản cơ thể, mỗi chữ cái có thể chỉnh sửa riêng lẻ. Mã JavaScript chúng tôi sẽ trải qua dưới đây có các nhận xét chi tiết để giúp bạn hiểu những gì đang diễn ra. Bắt đầu
Cơ sở dữ liệu được thiết lập ban đầuBây giờ chúng ta hãy xem xét những gì chúng ta phải làm ở nơi đầu tiên, để thực sự thiết lập một cơ sở dữ liệu.
Vì vậy, với lược đồ cơ sở dữ liệu này được thiết lập, khi chúng tôi bắt đầu thêm các bản ghi vào cơ sở dữ liệu, mỗi bản đồ sẽ được biểu diễn dưới dạng một đối tượng dọc theo các dòng sau: 4Thêm dữ liệu vào cơ sở dữ liệuBây giờ chúng ta hãy xem cách chúng ta có thể thêm bản ghi vào cơ sở dữ liệu. Điều này sẽ được thực hiện bằng cách sử dụng biểu mẫu trên trang của chúng tôi. Bên dưới trình xử lý sự kiện trước đây của bạn, hãy thêm dòng sau, thiết lập trình xử lý sự kiện 3 chạy chức năng gọi là 4 khi biểu mẫu được gửi (khi gửi 2 được nhấn dẫn đến gửi biểu mẫu thành công): 5Bây giờ chúng ta hãy xác định chức năng 4. Thêm điều này bên dưới dòng trước của bạn: 6
Điều này khá phức tạp; Phá vỡ nó, chúng tôi:
Hiển thị dữ liệuChúng tôi đã tham khảo 3 hai lần trong mã của chúng tôi, vì vậy chúng tôi có thể xác định tốt hơn. Thêm điều này vào mã của bạn, bên dưới định nghĩa chức năng trước đó: 7Một lần nữa, hãy phá vỡ điều này:
Xóa một ghi chúNhư đã nêu ở trên, khi nhấn nút xóa của một ghi chú, ghi chú sẽ bị xóa. Điều này đạt được bằng hàm 20, trông như vậy: 8
À chính nó đấy! Ví dụ của bạn bây giờ sẽ hoạt động. Nếu bạn gặp rắc rối với nó, hãy kiểm tra nó so với ví dụ trực tiếp của chúng tôi (xem mã nguồn). Lưu trữ dữ liệu phức tạp qua IndexedDBNhư chúng tôi đã đề cập ở trên, IndexEdDB có thể được sử dụng để lưu trữ nhiều hơn chỉ là các chuỗi văn bản. Bạn có thể lưu trữ bất cứ thứ gì bạn muốn, bao gồm các đối tượng phức tạp như video hoặc hình ảnh. Và việc đạt được không khó hơn nhiều so với bất kỳ loại dữ liệu nào khác. Để chứng minh cách thực hiện, chúng tôi đã viết một ví dụ khác có tên là IndexedDB Video Store (xem nó cũng đang chạy trực tiếp ở đây). Khi bạn lần đầu tiên chạy ví dụ, nó sẽ tải xuống tất cả các video từ mạng, lưu trữ chúng trong cơ sở dữ liệu IndexedDB và sau đó hiển thị các video trong UI bên trong các phần tử 38. Lần thứ hai bạn chạy nó, nó tìm thấy các video trong cơ sở dữ liệu và nhận chúng từ đó trước khi hiển thị chúng-điều này làm cho tải tiếp theo nhanh hơn và ít đói băng thông hơn.Hãy đi qua những phần thú vị nhất của ví dụ. Chúng tôi sẽ không nhìn vào tất cả-rất nhiều trong số đó tương tự như ví dụ trước đó và mã được đưa ra tốt.
Lưu trữ tài sản ngoại tuyếnVí dụ trên đã cho thấy cách tạo một ứng dụng sẽ lưu trữ các tài sản lớn trong cơ sở dữ liệu IndexedDB, tránh cần phải tải chúng nhiều lần. Đây đã là một cải tiến tuyệt vời cho trải nghiệm người dùng, nhưng vẫn còn một điều còn thiếu - các tệp HTML, CSS và JavaScript chính vẫn cần được tải xuống mỗi khi trang web được truy cập, nghĩa là nó sẽ không hoạt động khi có không có kết nối mạng.
Đây là nơi nhân viên dịch vụ và API bộ đệm liên quan chặt chẽ đến. Nhân viên dịch vụ là một tệp JavaScript được đăng ký theo một nguồn gốc cụ thể (trang web hoặc một phần của trang web tại một tên miền nhất định) khi nó được truy cập bởi trình duyệt. Khi được đăng ký, nó có thể kiểm soát các trang có sẵn ở nguồn gốc đó. Nó thực hiện điều này bằng cách ngồi giữa một trang được tải và mạng và các yêu cầu chặn mạng nhắm vào nguồn gốc đó. Khi nó chặn một yêu cầu, nó có thể làm bất cứ điều gì bạn muốn đối với nó (xem sử dụng ý tưởng trường hợp), nhưng ví dụ cổ điển là lưu các phản hồi mạng ngoại tuyến và sau đó cung cấp những người đó để đáp ứng yêu cầu thay vì các phản hồi từ mạng. Trên thực tế, nó cho phép bạn làm cho một trang web hoạt động hoàn toàn ngoại tuyến. API bộ đệm là một cơ chế lưu trữ phía máy khách khác, với một chút khác biệt-nó được thiết kế để lưu các phản hồi HTTP và do đó hoạt động rất tốt với nhân viên dịch vụ. Một ví dụ về nhân viên dịch vụChúng ta hãy xem một ví dụ, để cung cấp cho bạn một chút ý tưởng về điều này có thể trông như thế nào. Chúng tôi đã tạo một phiên bản khác của ví dụ Store Store mà chúng tôi đã thấy trong phần trước - các chức năng này giống hệt nhau, ngoại trừ việc nó cũng lưu HTML, CSS và JavaScript trong API bộ đệm thông qua nhân viên dịch vụ, cho phép ví dụ chạy ngoại tuyến! Xem IndexedDB Store Store với nhân viên dịch vụ đang chạy trực tiếp và cũng xem mã nguồn. Đăng ký nhân viên dịch vụĐiều đầu tiên cần lưu ý là có thêm một chút mã được đặt trong tệp JavaScript chính (xem index.js). Đầu tiên, chúng tôi thực hiện kiểm tra phát hiện tính năng để xem liệu thành viên 62 có sẵn trong đối tượng 63 không. Nếu điều này trả về đúng, thì chúng ta biết rằng ít nhất những điều cơ bản của nhân viên dịch vụ được hỗ trợ. Bên trong đây, chúng tôi sử dụng phương thức 64 để đăng ký một nhân viên dịch vụ có trong tệp 65 so với nguồn gốc mà nó nằm ở, để nó có thể kiểm soát các trang trong cùng thư mục với nó hoặc thư mục con. Khi lời hứa của nó đáp ứng, nhân viên dịch vụ được coi là đã đăng ký. 4Lưu ý: Đường dẫn đã cho đến tệp 65 file is relative to the site origin, not the JavaScript file that contains the code. The service worker is at 67. The origin is 68, and therefore the given path has to be 69. If you wanted to host this example on your own server, you'd have to change this accordingly. This is rather confusing, but it has to work this
way for security reasons.Cài đặt nhân viên dịch vụLần tiếp theo, bất kỳ trang nào trong sự kiểm soát của nhân viên dịch vụ được truy cập (ví dụ: khi ví dụ được tải lại), nhân viên dịch vụ được cài đặt so với trang đó, có nghĩa là nó sẽ bắt đầu kiểm soát nó. Khi điều này xảy ra, một sự kiện 70 được bắn vào nhân viên dịch vụ; Bạn có thể viết mã bên trong chính nhân viên dịch vụ sẽ trả lời cài đặt.Chúng ta hãy xem một ví dụ, trong tệp SW.JS (nhân viên dịch vụ). Bạn sẽ thấy rằng trình nghe cài đặt được đăng ký so với 71. Từ khóa 71 này là một cách để tham khảo phạm vi toàn cầu của nhân viên dịch vụ từ bên trong tệp nhân viên dịch vụ.Bên trong trình xử lý 70, chúng tôi sử dụng phương thức 74, có sẵn trên đối tượng sự kiện, để báo hiệu rằng trình duyệt không nên hoàn thành việc cài đặt nhân viên dịch vụ cho đến khi lời hứa bên trong nó hoàn thành thành công.Đây là nơi chúng tôi thấy API Cache hoạt động. Chúng tôi sử dụng phương thức 75 để mở một đối tượng bộ đệm mới trong đó các phản hồi có thể được lưu trữ (tương tự như lưu trữ đối tượng IndexedDB). Lời hứa này đáp ứng với một đối tượng 7 đại diện cho bộ đệm 77. Sau đó, chúng tôi sử dụng phương thức 78 để tìm nạp một loạt tài sản và thêm phản hồi của họ vào bộ đệm. 5Đó là bây giờ, cài đặt đã hoàn thành. Trả lời các yêu cầu tiếp theoVới nhân viên dịch vụ đã đăng ký và cài đặt so với trang HTML của chúng tôi và tất cả các tài sản có liên quan được thêm vào bộ đệm của chúng tôi, chúng tôi gần như đã sẵn sàng để đi. Chỉ có một điều nữa để làm: Viết một số mã để trả lời các yêu cầu mạng tiếp theo. Đây là những gì mã thứ hai của mã trong 65 làm. Chúng tôi thêm một người nghe khác vào phạm vi toàn cầu của nhân viên dịch vụ, điều hành chức năng xử lý khi sự kiện 80 được nâng lên. Điều này xảy ra bất cứ khi nào trình duyệt đưa ra yêu cầu cho một tài sản trong thư mục mà nhân viên dịch vụ được đăng ký chống lại.Bên trong trình xử lý, trước tiên chúng tôi đăng nhập URL của tài sản được yêu cầu. Sau đó, chúng tôi cung cấp một phản hồi tùy chỉnh cho yêu cầu, sử dụng phương thức 81.Bên trong khối này, chúng tôi sử dụng 82 để kiểm tra xem có thể tìm thấy yêu cầu phù hợp hay không (nghĩa là khớp URL) có thể được tìm thấy trong bất kỳ bộ đệm nào không. Lời hứa này đáp ứng với phản hồi phù hợp nếu tìm thấy một trận đấu hoặc 26 nếu không.Nếu một trận đấu được tìm thấy, chúng tôi trả lại nó dưới dạng phản hồi tùy chỉnh. Nếu không, chúng tôi sẽ tìm kiếm () phản hồi từ mạng và thay vào đó trả về. 6Và đó là nó cho nhân viên dịch vụ của chúng tôi. Có toàn bộ tải nhiều hơn bạn có thể làm với họ - để biết thêm chi tiết hơn, hãy xem Sách nấu ăn nhân viên dịch vụ. Rất cám ơn Paul Kinlan vì bài viết của anh ấy thêm một nhân viên dịch vụ và ngoại tuyến vào ứng dụng web của bạn, đã truyền cảm hứng cho ví dụ này. Kiểm tra ví dụ ngoại tuyếnĐể kiểm tra ví dụ nhân viên dịch vụ của chúng tôi, bạn sẽ cần tải nó một vài lần để đảm bảo nó được cài đặt. Một khi điều này được thực hiện, bạn có thể:
Nếu bạn làm mới trang ví dụ của mình một lần nữa, bạn vẫn sẽ thấy nó tải tốt. Mọi thứ đều được lưu trữ ngoại tuyến - tài sản trang trong bộ đệm và các video trong cơ sở dữ liệu IndexedDB. Bản tóm tắtĐó là nó bây giờ. Chúng tôi hy vọng bạn đã thấy các công nghệ lưu trữ phía máy khách của chúng tôi hữu ích. Xem thêmTrong mô -đun nàyLàm thế nào có thể viết lưu trữ cục bộ trong JavaScript?Syntax.. Lưu dữ liệu vào lưu trữ cục bộ.LocalStorage.setItem (khóa, giá trị) ;. Đọc dữ liệu từ lưu trữ cục bộ.Đặt lastName = localStorage.getItem (khóa) ;. Xóa dữ liệu khỏi lưu trữ cục bộ.LocalStorage.RemoveItem (khóa) ;. Xóa tất cả (Xóa lưu trữ cục bộ) LocalStorage.clear () ;. Làm thế nào chúng ta có thể lưu trữ dữ liệu trong JavaScript mà không cần cơ sở dữ liệu?Tôi sẽ sử dụng một số mã từ mẫu Hello-Sqlite của Glitch, bạn có thể chơi xung quanh và phối lại mà không có tài khoản ... // Xin chào-Sqlite .. Đặt fs = yêu cầu ('fs') ;. Đặt dbfile = './.data/sqlite.db';// Tệp cơ sở dữ liệu của chúng tôi .. hãy tồn tại = fs..... Đặt sqlite3 = yêu cầu ('sqlite3')..... Đặt db = sqlite3 new .. |