Replies: 1 comment
-
协商缓存 - 当浏览器对某个资源的请求没有命中强缓存,就会发一个请求到服务器,验证协商缓存是否命中,如果协商缓存命中,请求响应返回的 http 状态为 |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
2021.02.28
最近这段时间写了一个基于
vite
的wasm-pack
(Rust -> Wasm
) 插件,遇到一个比较有意思的问题。需求
实现一个
rsw 插件
,当 vite 服务启动后,插件会自动调用wasm-pack
的 cli,进行 build,生成 wasm 的 npm 包,当 rust 包目录下的文件变更时,能够进行重新进行 build (热更新)。问题
实现需求其实很简单,但是如果只是这样实现插件,虽然能用,但是体验不好。每次启动服务都会先执行 cli 的 build (耗时有点长),vite 的快速启动开发环境的体验全无。其实不分析也知道,cli 的 build 并非每次启动都需要执行。如果已经 build 过,则不需要再次执行。
于是,就有了第一版简单粗暴的实现方案,直接看目录中有没有 build 的文件存在,如果文件存在,则直接跳过执行,否则,执行 build。短短几行代码似乎就解决了问题。
但是很快就打脸了,有一种情况是未考虑到的,就是在停止服务后修改文件,当启动服务后,因为之前 build 的文件一直都存在,所以并不会执行 build,只有在启动服务后,修改文件,才会触发热更新。
解决这个问题,我一直在想如何去缓存文件信息,做比较,如果两次文件内容都无变化,则文件未被修改过,但是又想到,如果文件特别多,
存储读取
又会产生新的问题,感觉问题被复杂化了,但是却没什么头绪。和朋友讨论这个插件,朋友的一句话点醒了我。不需要存储读取文件,因为文件内容是不需要关心的,我们其实更关心的问题是文件是否被修改,而文件是否修改,可以通过查看文件修改时间。因为 build 是后于源码修改的,所以源码的修改时间一定小于 build 目录下的文件时间。如果源码修改时间大于了 build 目录下的文件时间。则表示文件修改了,但未执行 build。
这也就有了下面这段代码
总结
人很容易在固有思维下钻牛角尖,走到最后才发现自己虽然很努力,但似乎方向不太对。和朋友聊天,或者让自己放松一下,可能会有不一样的收获。
相关链接
Beta Was this translation helpful? Give feedback.
All reactions