Baseline 2023
Newly available
å®å ¨ä¸ä¸æ: æ¤é¡¹åè½ä» å¨ä¸äºæ¯æçæµè§å¨çå®å ¨ä¸ä¸æï¼HTTPSï¼ä¸å¯ç¨ã
夿³¨ï¼ æ¤ç¹æ§å¨ Web Worker ä¸å¯ç¨ã
æºç§ææä»¶ç³»ç»ï¼OPFSï¼æ¯ä½ä¸ºæä»¶ç³»ç» API çä¸é¨åæä¾çä¸ä¸ªåå¨ç«¯ç¹ã宿¯é¡µé¢æå±çæºä¸ç¨çï¼å¹¶ä¸ä¸åå¸¸è§æä»¶ç³»ç»é£æ ·å¯¹ç¨æ·å¯è§ã宿ä¾äºå¯¹ä¸ç§ç¹æ®ç±»åæä»¶ç访é®è½åï¼è¿ç§æä»¶ç»è¿é«åº¦æ§è½ä¼åï¼å¹¶æä¾å¯¹å ¶å 容çåå°åå ¥è®¿é®ç¹æ§ã
ä½¿ç¨æä»¶ç³»ç»è®¿é® API å¤çæä»¶æ©å±èªæä»¶ç³»ç» API çæä»¶ç³»ç»è®¿é® API 使ç¨éæ©å¨æä¾äºå¯¹æä»¶ç访é®è½åãä¾å¦ï¼
Window.showOpenFilePicker()
å
è®¸ç¨æ·éæ©ä¸ä¸ªæä»¶ç¨äºè®¿é®ï¼æä»¶å°ä½ä¸ºç»æä»¥ä¸ä¸ª FileSystemFileHandle
对象çå½¢å¼è¢«è¿åãFileSystemFileHandle.getFile()
ä»¥è®¿é®æä»¶çå
容ï¼ä½¿ç¨ FileSystemFileHandle.createWritable()
æ FileSystemWritableFileStream.write()
æ¥ä¿®æ¹å
容ãFileSystemHandle.requestPermission({mode: 'readwrite'})
æ¥è¯·æ±ç¨æ·çæé以ä¿åæ´æ¹ãè¿ä¸ªæ¹æ³å¯è¡ï¼ä½æ¯æä¸äºéå¶ãè¿äºæ´æ¹æ¯å¯¹ç¨æ·å¯è§çæä»¶ç³»ç»è¿è¡çï¼æä»¥ä¼æå¾å¤éå½çå®å ¨æ§æ£æ¥ï¼æ¯æ¹è¯´ Chrome çå®å ¨æµè§ï¼æ¥é²æ¢æ¶æå 容被åå ¥å°æä»¶ç³»ç»ãè¿äºåå ¥ä¸æ¯åå°çï¼ä¼å åå ¥å°ä¸ä¸ªä¸´æ¶æä»¶ãé¤ééè¿äºææçå®å ¨æ§æ£æ¥ï¼å¦ååæä»¶ä¸ä¼è¢«ä¿®æ¹ã
å æ¤ï¼è¿äºæä½ä¼ç¸å½ç¼æ ¢ãå¨ä½ è¿è¡å°è§æ¨¡çææ¬æ´æ°æ¶æ²¡é£ä¹ææ¾ï¼ä½æ¯å½è¿è¡å SQLite æ°æ®åºæ´æ¹è¿æ ·çæ´æ¾èãæ´å¤§è§æ¨¡çæä»¶æ´æ°æ¶å°±ä¼éå°æ§è½é®é¢ã
OPFS æ¯æä¹è§£å³è¿äºé®é¢çï¼OPFS æä¾äºé¡µé¢æå±æºç§æçãå¯¹ç¨æ·ä¸å¯è§çãåºå±çéåèæä»¶è®¿é®è½åãå æ¤å®ä¸éè¦ç»è¿ä¸è°ç¨æä»¶ç³»ç»è®¿é® API æéçä¸ç³»åç¸åçå®å ¨æ§æ£æ¥åææï¼è䏿¯æä»¶ç³»ç»è®¿é® API æ´å¿«ãå®è¿æä¸å¥åæ¥è°ç¨æ¹æ³å¯ç¨ï¼å ¶ä»çæä»¶ç³»ç» API è°ç¨æ¯å¼æ¥çï¼ï¼ä½åªè½å¨ web worker ä¸è¿è¡ï¼è¿æ ·å°±ä¸ä¼é»å¡ä¸»çº¿ç¨ã
æ¦æ¬ OPFS åç¨æ·å¯è§æä»¶ç³»ç»çä¸åï¼
navigator.storage.estimate()
æ¥è·å¾ OPFS æç¨çåå¨ç©ºé´ç容éãæ³è¦è®¿é® OPFSï¼ä½ é¦å
è¦è°ç¨ navigator.storage.getDirectory()
æ¹æ³ãè¿åä¸ä¸ªä»£è¡¨ OPFS æ ¹ç®å½ç FileSystemDirectoryHandle
对象çå¼ç¨ã
å¨ä¸»çº¿ç¨ä¸è®¿é® OPFS æ¶ï¼ä½ è¦ä½¿ç¨åºäº Promise
ç弿¥ APIãä½ å¯ä»¥è°ç¨ä»£è¡¨ OPFS æ ¹ç®å½ï¼ä»¥åå
¶ä¸è¢«å建çåç®å½ï¼ç FileSystemDirectoryHandle
对象ä¸ç FileSystemDirectoryHandle.getFileHandle()
å FileSystemDirectoryHandle.getDirectoryHandle()
æ¹æ³æ¥åå«è®¿é®æä»¶ï¼FileSystemFileHandle
ï¼åç®å½ï¼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.removeEntry()
ï¼åå®ä¼ å
¥ä½ æ³è¦å é¤ç项çåç§°ï¼
directoryHandle.removeEntry("my first nested file");
ä½ ä¹å¯ä»¥å¨ä»£è¡¨ä½ æ³è¦å é¤ç项ç®ç FileSystemFileHandle
æ FileSystemDirectoryHandle
ä¸è°ç¨ FileSystemHandle.remove()
æ¥è¿è¡å é¤ãè¦å é¤ä¸ä¸ªæä»¶å¤¹å宿æçåæä»¶å¤¹ï¼éè¦ä¼ é { 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()) {
}
å¨ web worker ä¸æä½ OPFS
Web Worker ä¸ä¼é»å¡ä¸»çº¿ç¨ï¼è¿æå³çä½ å¯ä»¥å¨å ¶ä¸ä¸æä¸ä½¿ç¨åæ¥æä»¶è®¿é® APIã忥ç API å å ¶ä¸éè¦å¤ç promiseï¼æä»¥æ´å¿«ã
ä½ å¯ä»¥éè¿å¨å¸¸è§ç FileSystemFileHandle
ä¸è°ç¨ FileSystemFileHandle.createSyncAccessHandle()
æ¥åæ¥å°å¤çæä»¶ï¼
夿³¨ï¼ è½ç¶ createSyncAccessHandle()
çå称带æâSyncï¼åæ¥ï¼âåç¼ï¼ä½æ¯è¿ä¸ªæ¹æ³æ¬èº«æ¯å¼æ¥çã
const opfsRoot = await navigator.storage.getDirectory();
const fileHandle = await opfsRoot.getFileHandle("my-high-speed-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, { at: 0 });
// æå° `"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