fetch()
APIを使用して、個のリソースでクライアントのブラウザキャッシュを乱さずにcache-bustingを実装できます。
変更ファイルへの静的なアクセスを許可するサーバー上のフォルダを決定したら(これは、1つのファイルへの静的アクセスを許可したパターンよりも好ましい)、fs.watch()
を使用してリアルタイム更新を実装できますそのような:
ノードapp.js
(with express 3/4):
const fs = require('fs')
const path = require('path')
const app = require('express')()
const server = require('http').Server(app)
const io = require('socket.io')(server)
server.listen(process.env.PORT || 8080)
app.use('/', express.static(path.resolve(__dirname, './watched-directory')))
//...
io.on('connection', (socket) => {
//...
});
fs.watch('watched-directory', {
//don't want watch process hanging if server is closed
persistent: false,
//supported on Windows OS/Mac OSX
recursive: true,
}, (eventType, filename) => {
if (eventType === 'change') {
io.emit('filechange', filename)
}
})
ブラウザindex.html
:
<script src="/socket.io/socket.io.js"></script>
<script>
let socket = io.connect()
socket.on('filechange', async (filename) => {
console.log(filename)
let response = await fetch(filename, { cache: 'no-store' })
let blob = await response.toBlob()
let url = URL.createObjectURL(blob)
//modified from your question
let image = new Image()
image.addEventListener('load',() => {
//your canvas rendering code here
})
image.src = url
})
</script>
ファイル名が変更されるのか、画像データだけが変更されますか? –
私は、クライアントがイメージをキャッシュして、新しいhttp要求を防止していると思います。 –
画像データだけが変更されます@PatrickRoberts – killertoge