文件 实时更改与大文件夹
实时更改与大文件夹
两个人打开同一个文件夹,片刻之内就能看到对方的更改:新建的文件夹,重命名、移动或移入回收站的文件。上千个文件的文件夹,滚动起来与十个文件一样流畅。
本页内容
实时
页面监听 GET /events,这是一个 server-sent events 流,用 fetch 读取,因此会带上你的 headers。每次更改只按每个人可见的范围告知:发生更改且其可列出的文件夹,以及其可读取的条目。不会发送名称;页面照常请求要显示的内容。
<FileDrive>、mountDrive 以及 DriveProvider 下的每个 hook 会在更改后四分之一秒重新请求,同时到达的多次更改只请求一次。断开后会重新连接,每次间隔稍长。live={false} 可关闭此功能。
自定义界面
const stop = client.watch((event) => {
// { by: 'bea', at: '…', folders: ['<id>'], entries: ['<id>'] }
if (event.folders.includes(current)) reload();
});多个进程
本进程的更改会立即告知。同一存储上其他进程的更改通过存储的修订号发现(SQLite 和 Postgres 都有),有人监听时每两秒检查一次(live: { poll })。没有修订号的存储只告知本进程的更改。
在代理之后
- 每 25 秒发送一行空内容,避免代理因长时间无数据而关闭连接。请让请求可以持续更久:nginx 中设置
proxy_read_timeout 1h。 - 响应带有
x-accel-buffering: no和cache-control: no-transform,以免 nginx 和压缩缓冲它。 - 在几秒后就会结束请求的平台上(serverless 函数),页面断开后会重新连接,期间的更改在下次连接时看到。也可以用
live: false关闭。
大文件夹
从 200 个条目起,列表和网格只在页面中放入可见部分及其周围几行,其余部分的高度在上下保留,因此滚动条的长度与全部内容一致。行高在显示时测量,网格的列数随宽度变化。
键盘仍可遍历全部条目:方向键、Home 或 End 会先把目标滚动到可见位置,因为屏幕阅读器需要被告知当前项。每一项都说明自己在全部中的位置(aria-posinset、aria-setsize)。Ctrl+A 会选中全部,而不只是页面中的那些;图片地址只为显示的条目请求。