Baseline 2023
Newly available
å®å ¨ãªã³ã³ããã¹ãç¨: ãã®æ©è½ã¯ä¸é¨ã¾ãã¯ãã¹ã¦ã®å¯¾å¿ãã¦ãããã©ã¦ã¶ã¼ã«ããã¦ãå®å ¨ãªã³ã³ããã¹ã (HTTPS) ã§ã®ã¿å©ç¨ã§ãã¾ãã
ãªãªã¸ã³ãã©ã¤ãã¼ããã¡ã¤ã«ã·ã¹ãã (OPFS) ã¯ããã¡ã¤ã«ã·ã¹ãã API ã®ä¸é¨ã¨ãã¦æä¾ãããã¹ãã¬ã¼ã¸ã¨ã³ããã¤ã³ãã§ããããã¯ãããã©ã¼ãã³ã¹ã®ããã«é«åº¦ã«æé©åããããã®å 容ã¸ã®ãã®å ´ã§ã®æ¸ãè¾¼ã¿ã¢ã¯ã»ã¹ãæä¾ããç¹å¥ãªç¨®é¡ã®ãã¡ã¤ã«ã¸ã®ã¢ã¯ã»ã¹ãæä¾ãã¾ãã
ãã¡ã¤ã«ã·ã¹ãã ã¢ã¯ã»ã¹ API ã使ç¨ãããã¡ã¤ã«ã§ã®ä½æ¥ãã¡ã¤ã«ã·ã¹ãã ã¢ã¯ã»ã¹ API ã¯ããã¡ã¤ã«ã·ã¹ãã API ãæ¡å¼µãããã®ã§ãã¯ãããã«ã¼ã¡ã½ããã使ã£ããã¡ã¤ã«ã¸ã®ã¢ã¯ã»ã¹ãæä¾ãã¾ããä¾ãã°ã
Window.showOpenFilePicker()
ã§ã¯ãã¦ã¼ã¶ã¼ãã¢ã¯ã»ã¹ãããã¡ã¤ã«ã鏿ãããã¨ãã§ãããã®çµæã FileSystemFileHandle
ãªãã¸ã§ã¯ããè¿ããã¾ããFileSystemFileHandle.getFile()
ãå¼ã³åºãã¦ãã¡ã¤ã«ã®å
容ã«ã¢ã¯ã»ã¹ãã FileSystemFileHandle.createWritable()
/ FileSystemWritableFileStream.write()
ã使ç¨ãã¦å
容ã夿´ãã¾ããFileSystemHandle.requestPermission({mode:'readwrite'})
ã¯ã夿´ãä¿åãã許å¯ãã¦ã¼ã¶ã¼ã«ãªã¯ã¨ã¹ãããããã«ä½¿ç¨ããã¾ããããã¯æ©è½ãã¾ãããããã¤ãã®å¶éãããã¾ãããããã®å¤æ´ã¯ã¦ã¼ã¶ã¼ããè¦ãããã¡ã¤ã«ã·ã¹ãã ã«å¯¾ãã¦è¡ããããããæªæã®ããã³ã³ãã³ãããã¡ã¤ã«ã·ã¹ãã ã«æ¸ãè¾¼ã¾ããªãããã«ãå¤ãã®ã»ãã¥ãªãã£ãã§ãã¯ãè¡ããã¦ãã¾ãï¼ä¾ãã°ã Chrome ã®ã»ã¼ããã©ã¦ã¸ã³ã°ï¼ããããã®æ¸ãè¾¼ã¿ã¯ãã®å ´ã§è¡ãããã®ã§ã¯ãªãã䏿ãã¡ã¤ã«ã使ç¨ãã¾ãããã¹ã¦ã®ã»ãã¥ãªãã£ãã§ãã¯ã«åæ ¼ããªãéããå ã®ãã¡ã¤ã«ã¯å¤æ´ããã¾ããã
ãã®çµæããããã®æä½ã¯ããªãé ããªãã¾ããå°ããªããã¹ããæ´æ°ããã¨ãã«ã¯ããã»ã©æ°ã«ãªãã¾ãããã SQLite ãã¼ã¿ãã¼ã¹ã®å¤æ´ãªã©ãããéè¦ã§å¤§è¦æ¨¡ãªãã¡ã¤ã«ãæ´æ°ããã¨ãã«ã¯ããã©ã¼ãã³ã¹ãä½ä¸ãã¾ãã
OPFS ã¯ãã®ãããªåé¡ãã©ã®ããã«è§£æ±ºããã®ãOPFSã¯ä½ã¬ãã«ã®ãã¤ãåä½ã®ãã¡ã¤ã«ã¢ã¯ã»ã¹ãæä¾ãããã¼ã¸ã®ãªãªã¸ã³ã«ã¯éå ¬éã§ã¦ã¼ã¶ã¼ã«ã¯è¦ãã¾ããããã®ãããä¸é£ã®ã»ãã¥ãªãã£ãã§ãã¯ã 権éä»ä¸ãå¿ è¦ã¨ããããã¡ã¤ã«ã·ã¹ãã ã¢ã¯ã»ã¹ API ãå¼ã³åºããããé«éã§ããã¾ããã¡ã¤ã³ã¹ã¬ããããããã¯ããªãããã«ã¦ã§ãã¯ã¼ã«ã¼ã®ä¸ã ãã§å®è¡ã§ããä¸é£ã®åæå¼ã³åºããå©ç¨ã§ãã¾ãï¼ä»ã®ãã¡ã¤ã«ã·ã¹ãã API å¼ã³åºãã¯éåæã§ãï¼ã
OPFS ãã¦ã¼ã¶ã¼ããè¦ãããã¡ã¤ã«ã·ã¹ãã ã¨ç°ãªãç¹ãã¾ã¨ããã¨ã次ã®ããã«ãªãã¾ãã
navigator.storage.estimate()
ã§ç¥ããã¨ãã§ãã¾ããæåã® OPFS ã«ã¢ã¯ã»ã¹ããã«ã¯ã navigator.storage.getDirectory()
ã¡ã½ãããå¼ã³åºãã¾ããããã¯ã OPFS ã®ã«ã¼ãã表ã FileSystemDirectoryHandle
ãªãã¸ã§ã¯ãã¸ã®åç
§ãè¿ãã¾ãã
ã¡ã¤ã³ã¹ã¬ãããã OPFS ã«ã¢ã¯ã»ã¹ããå ´åã¯ãéåæã® Promise
ãã¼ã¹ã® API ã使ç¨ãã¾ãããã¡ã¤ã«ï¼FileSystemFileHandle
ï¼ã¨ãã£ã¬ã¯ããªã¼ï¼FileSystemDirectoryHandle
ï¼ã®ãã³ãã«ã«ã¢ã¯ã»ã¹ããã«ã¯ã FileSystemDirectoryHandle.getFileHandle()
㨠FileSystemDirectoryHandle.getDirectoryHandle()
ãããããã OPFS ã«ã¼ãï¼ããã³ä½æãããåãã£ã¬ã¯ããªã¼ï¼ã表ã FileSystemDirectoryHandle
ãªãã¸ã§ã¯ãä¸ã§å¼ã³åºãã¾ãã
ã¡ã¢: ä¸è¨ã®ã¡ã½ããã« { create: true }
ãæ¸¡ãã¨ããã¡ã¤ã«ããã©ã«ãã¼å
ãåå¨ããªãå ´åã«ä½æããã¾ãã
// ãã¡ã¤ã«ã¨ãã©ã«ãã¼å
ã®é層ã使
const fileHandle = await opfsRoot.getFileHandle("my first file", {
create: true,
});
const directoryHandle = await opfsRoot.getDirectoryHandle("my first folder", {
create: true,
});
const nestedFileHandle = await directoryHandle.getFileHandle(
"my first nested file",
{ create: true },
);
const nestedDirectoryHandle = await directoryHandle.getDirectoryHandle(
"my first nested folder",
{ create: true },
);
// æ¢åã®ãã¡ã¤ã«åããã©ã«ãã¼å
ã«ã¢ã¯ã»ã¹
const existingFileHandle = await opfsRoot.getFileHandle("my first file");
const existingDirectoryHandle =
await opfsRoot.getDirectoryHandle("my first folder");
ãã¡ã¤ã«ã®èªã¿åã
FileSystemDirectoryHandle.getFileHandle()
ãå¼ã³åºã㨠FileSystemFileHandle
ãªãã¸ã§ã¯ããè¿ãã¾ããFileSystemFileHandle.getFile()
ãå¼ã³åºã㨠File
ãªãã¸ã§ã¯ããè¿ãã¾ãããã㯠Blob
ã®ç¹åããåãªã®ã§ãä»ã® Blob
ã¨åãããã«æä½ã§ãã¾ããä¾ãã°ã Blob.text()
ã§ç´æ¥ããã¹ãã³ã³ãã³ãã«ã¢ã¯ã»ã¹ãããã¨ãã§ãã¾ããFileSystemDirectoryHandle.getFileHandle()
ãå¼ã³åºã㨠FileSystemFileHandle
ãªãã¸ã§ã¯ããè¿ãã¾ããFileSystemFileHandle.createWritable()
ãå¼ã³åºã㨠FileSystemWritableFileStream
ãªãã¸ã§ã¯ããè¿ãã¾ãããã㯠WritableStream
ã®ç¹åããåã§ããFileSystemWritableFilestream.write()
ãå¼ã³åºãã¦å
å®¹ãæ¸ãè¾¼ã¿ã¾ããWritableStream.close()
ã使ç¨ãã¦ã¹ããªã¼ã ãéãã¾ãã親ãã£ã¬ã¯ããªã¼ã§ FileSystemDirectoryHandle.removeEntry()
ãå¼ã³åºãã¦ãåé¤ãããé
ç®ã®ååãæ¸¡ãã¾ãã
directoryHandle.removeEntry("my first nested file");
ã¾ãã FileSystemHandle.remove()
ã FileSystemFileHandle
ã¾ã㯠FileSystemDirectoryHandle
ã§å¼ã³åºããã¨ãã§ãã¾ãããã¹ã¦ã®ãµããã©ã«ãã¼ãå«ãã¦ãã©ã«ãã¼å
ãåé¤ããã«ã¯ã { recursive: true }
ãªãã·ã§ã³ã渡ãã¦ãã ããã
await fileHandle.remove();
await directoryHandle.remove({ recursive: true });
以ä¸ã¯ã OPFS å ¨ä½ãã¯ãªã¢ããç°¡åãªæ¹æ³ã§ãï¼
await (await navigator.storage.getDirectory()).remove({ recursive: true });
ãã©ã«ãã¼ã®å
容ã®ä¸è¦§åºå
FileSystemDirectoryHandle
ã¯éåæã¤ãã¬ã¼ã¿ã¼ã§ãããã®ããã for awaitâ¦of
ã«ã¼ãããentries()
, values()
, keys()
ãªã©ã®æ¨æºã¡ã½ããã§å復å¦çãããã¨ãã§ãã¾ãã
ä¾ãã°æ¬¡ã®ããã«ãã¾ãã
for await (let [name, handle] of directoryHandle) {
}
for await (let [name, handle] of directoryHandle.entries()) {
}
for await (let handle of directoryHandle.values()) {
}
for await (let name of directoryHandle.keys()) {
}
ã¦ã§ãã¯ã¼ã«ã¼ã«ããã OPFS ã®æä½
ã¦ã§ã ã¯ã¼ã«ã¼ã¯ã¡ã¤ã³ã¹ã¬ããããããã¯ããªãã®ã§ããã®ã³ã³ããã¹ãã§åæãã¡ã¤ã« ã¢ã¯ã»ã¹ API ã使ç¨ãããã¨ãã§ãã¾ããåæ API ã¯ãããã¹ãæ±ãå¿ è¦ããªããããããé«éã§ãã
åæçã«ãã¡ã¤ã«ã«ã¢ã¯ã»ã¹ããã«ã¯ã FileSystemFileHandle.createSyncAccessHandle()
ãé常㮠FileSystemFileHandle
ã«å¯¾ãã¦å¼ã³åºãã¾ãã
ã¡ã¢: ååã« "Sync" ã¨ããã«ãããããããcreateSyncAccessHandle()
ã¡ã½ããèªä½ã¯éåæã§ãã
const opfsRoot = await navigator.storage.getDirectory();
const fileHandle = await opfsRoot.getFileHandle("my highspeed file.txt", {
create: true,
});
const syncAccessHandle = await fileHandle.createSyncAccessHandle();
è¿ããã FileSystemSyncAccessHandle
ã§å©ç¨ã§ããåæã¡ã½ãããããã¤ãããã¾ãã
getSize()
: ãã¡ã¤ã«ã®ãµã¤ãºããã¤ãæ°ã§è¿ãã¾ããwrite()
: ãããã¡ã¼ã®å
容ãæå®ããããªãã»ãããæå®ãã¦ãã¡ã¤ã«ã«æ¸ãè¾¼ã¿ãæ¸ãè¾¼ãã ãã¤ãæ°ãè¿ãã¾ããè¿ãããæ¸ãè¾¼ã¿ãã¤ãæ°ã調ã¹ããã¨ã§ãå¼ã³åºãå´ã¯ã¨ã©ã¼ãé¨åçãªæ¸ãè¾¼ã¿ãæ¤åºãã¦å¦çãããã¨ãã§ãã¾ããread()
: ãªãã·ã§ã³ã§æå®ããããªãã»ããã§ããã¡ã¤ã«ã®å
容ããããã¡ã¼ã«èªã¿è¾¼ã¿ã¾ããtruncate()
: æå®ããããµã¤ãºã«ãã¡ã¤ã«ããªãµã¤ãºãã¾ããflush()
: write()
ã«ãã£ã¦è¡ããããã¹ã¦ã®å¤æ´ããã¡ã¤ã«ã®å
å®¹ã«æ ¼ç´ããã¦ãããã¨ãä¿è¨¼ãã¾ããclose()
: ã¢ã¯ã»ã¹ãã³ãã«ãéãã¾ãããã®ä¾ã§ã¯ãä¸è¨ã®ã¡ã½ããããã¹ã¦ä½¿ç¨ãã¦ãã¾ãã
const opfsRoot = await navigator.storage.getDirectory();
const fileHandle = await opfsRoot.getFileHandle("fast", { create: true });
const accessHandle = await fileHandle.createSyncAccessHandle();
const textEncoder = new TextEncoder();
const textDecoder = new TextDecoder();
// ãã¡ã¤ã«ã®ãµã¤ãºã®ããã®å¤æ°ã®åæå
let size;
// ãã¡ã¤ã«ã®ç¾å¨ã®ãµã¤ãºãåæå¤ã¯ `0`ã
size = accessHandle.getSize();
// ãã¡ã¤ã«ã«æ¸ãè¾¼ãããã«ã³ã³ãã³ããã¨ã³ã³ã¼ã
const content = textEncoder.encode("Some text");
// ãã¡ã¤ã«ã®å
é ã«ã³ã³ãã³ããæ¸ãè¾¼ã
accessHandle.write(content, { at: size });
// 夿´ããã©ãã·ã¥ãã
accessHandle.flush();
// ãã¡ã¤ã«ã®ç¾å¨ã®ãµã¤ãºãããã§ `9`ï¼"Some text" ã®é·ãï¼
size = accessHandle.getSize();
// ãã¡ã¤ã«ã«æ¸ãè¾¼ãããã«ãããã«ã³ã³ãã³ããã¨ã³ã³ã¼ã
const moreContent = textEncoder.encode("More content");
// ãã¡ã¤ã«ã®æå¾ã«ã³ã³ãã³ããæ¸ãè¾¼ã
accessHandle.write(moreContent, { at: size });
// 夿´ããã©ãã·ã¥ãã
accessHandle.flush();
// ããã§ç¾å¨ã®ãã¡ã¤ã«ãµã¤ãºã¯ `21`ï¼"Some textMore content" ã®é·ãï¼ã¨ãªã
size = accessHandle.getSize();
// ãã¡ã¤ã«ã®é·ãã®ãã¼ã¿ãã¥ã¼ãæºå
const dataView = new DataView(new ArrayBuffer(size));
// ãã¡ã¤ã«å
¨ä½ããã¼ã¿ãã¥ã¼ã«èªã¿è¾¼ã
accessHandle.read(dataView);
// `"Some textMore content"` ã¨ãã°åºå
console.log(textDecoder.decode(dataView));
// ãªãã»ãã 9 ããå§ãããã¼ã¿ãã¥ã¼ã«èªã¿è¾¼ãã
accessHandle.read(dataView, { at: 9 });
// `"More content"` ã¨ãã°åºå
console.log(textDecoder.decode(dataView));
// ãã¡ã¤ã«ã 4 ãã¤ãã§åãæ¨ã¦ãã
accessHandle.truncate(4);
é¢é£æ
å ±
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4