wepy 2.0:watch 时文件编译的缓存问题

shstlldc  于 2022-10-20  发布在  其他
关注(0)|答案(1)|浏览(192)

在跟踪 #2254 问题时想看下为啥引入的 less 文件变化时没有重新编译,发现有如下问题:

第一个是,wxs 被解析时会改变 wpy 文件的缓存 hash。

我看到源码中 @wepy/cli/core/plugins/parser/wxs.js 这个文件里有这样写:

这样会导致 @wepy/cli/core/plugins/parser/wpy.js 中关于文件 hash 一致的判断失效,所以 #2254 中描述的——“当 wpy 文件里有 wxs 时,改变被引入的 less 文件会重新编译;当没有 wxs 时,则改变 less 没有效果”这一现象会出现。但这里有问题的就是 wxs 的解析改变了文件缓存的 hash,那么这些有 wxs 的文件缓存就全部无效了,每次都会重新编译。

第二个是,看到在 @wepy/cli/core/compile.js 文件的 watch() 方法中,有关于清除编译缓存 hash 的代码:

看变量的命名判断,貌似是根据被改变文件找到涉及文件,并清除涉及文件的 hash 使之能重新编译。但从调试的情况来看, this.involved 这个 map 里的 value 值都是 1 ,并不会执行到清除 hash 的代码?

按我的理解,像 less 这种有可能会被多个 wpy 文件引用,所以引用关系 involved 需要是一个数组来记住,等待 less 发生变化时清除这些 wpy 文件的缓存 hash。因为不知道作者的设计思路所以也不好瞎猜,希望作者能说明一下设计思路或者给一些文档,这样大家也好 PR 哈。@Gcaufy

vdgimpew

vdgimpew1#

  1. 这里应该是bug, filehash 应该是文件这一级的。wxs这里设置filehash是不对的
  2. 在设计这个编译缓存的时候只考虑到了,组件,js,等等情况,实际上在这些情况下 只清楚 invokedFile 的缓存是对的,不需要清 wpy的。 因为在编译 wpy 文件时,缓存只是让当前文件少编译一次,直接用上次编译结果,但对于js类型的引用来说,依旧会去深遍历每个引用,遍历到这个invokedFile 时发现他是无缓存的,然后就会重新编译他。所以这是预期的结果。 但对于less一类引用,我是考虑漏掉了的。因为他的编译过程是发生在compile 里。
    对于2这个问题你可以做个简单的测试验证一下就知道了。。。。

最后,非常感谢你的耐心研究,也期待你的PR。 有问题可以在群里直接跟我讨论。

相关问题