Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
deepfunc opened this issue Aug 1, 2019 · 1 comment
Open

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

deepfunc opened this issue Aug 1, 2019 · 1 comment

Comments

@deepfunc
Copy link
Collaborator

deepfunc commented Aug 1, 2019

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

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

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

image

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

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

image

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

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

@Gcaufy
Copy link
Collaborator

Gcaufy commented Aug 1, 2019

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

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

Gcaufy added a commit that referenced this issue Aug 2, 2019
BREAKING CHANGE: compile cache

re #2279
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants