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

RFC:watch 支持触发父节点的变更 #1081

Closed
sorrycc opened this issue Apr 23, 2024 · 1 comment · Fixed by #1151
Closed

RFC:watch 支持触发父节点的变更 #1081

sorrycc opened this issue Apr 23, 2024 · 1 comment · Fixed by #1151
Assignees
Labels

Comments

@sorrycc
Copy link
Member

sorrycc commented Apr 23, 2024

问题

两个场景,

1、css modules

import styles from './foo.css' 时。会先替换 ./foo.css 为 ./foo.css?asmodule,此时会编译为 js,返回两部分,1)import ./foo.css?modules,2)export css module 的 js map。./foo.css?modules 才是 modules 过的 css 内容。

a.js > foo.css?asmodule > foo.css?modules

然后 update 时的逻辑是这样,

1)update 进来的 paths 肯定是不带 query 的,因为是 watch 过来的,只有路径
2)先要判断是 Add 还是 Modify,如果改了 foo.css,在 foo.css 存在在文件系统的情况下,如果 foo.css?asmodule 存在于 module graph 里,则会标记为 Modify 而不是 Add(标记时额外判断了 ?asmodule 是否在 module graph 里,因为 foo.css 本身是不存在于 module graph 里的)
3)真正要做变更 build 的文件会判断是否存在于 module graph 里,由于 foo.css 不存在于 module graph 里,需要额外判断下 foo.css?asmodule,如果在,就把 foo.css?asmodule 添加为要处理的文件
4)build_by_modify 时,查询整个 module_graph,找到带 ?modules query 的模块,比如 foo.css?modules,如果 modified 包含 foo.css?asmodule,那需要把 foo.css?modules 也加到 modified 里

这是现在的逻辑。(感觉有很多改进空间)

2、dumi

参考 #1015

a.md 内嵌 b.md,比如 ,此时 a.md 的内容会直接包含 b.md 的内容,但需要实现的是,当 b.md 变更时,需要触发 a.md 的变更。dumi 在实现时,可以在 a.md 里加入 b.md 以在 module graph 里建立 a.md 和 b.md 的依赖关系,把 b.md 也纳入到 module graph 里。

a.md > b.md

解法

discussed with @PeachScript

1、新增一个常量数组,const WATCH_PARENTS = ["modules", "watch=parent"],带 WATCH_PARENTS query 的模块,在监听到变更时,会触发 parent 模块的变更
2、在 update.rs 里,当进来一个文件变更,比如 aaa.xxx,会检测 aaa.xxx?modules 和 aaa.xxx?watch=parent 是否存在于 module graph,如果存在,把目标模块及其父模块添加到要处理的队列里

为啥一个 watch=parent 不够,还需要 modules ?

因为 css 的场景,?modules query 必不可少,如果用 watch=parent,那就是 ?modules&watch=parent。此时在 watch 后的 update 里,不做硬编码无法基于文件添加 query 变成 ?modules&watch=parent 然后去 module graph 里查是否存在。

@stormslowly
Copy link
Member

ref #1011 解这个就能解硬编码的问题。 未来可以扩展更多的 query 也不影响

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

Successfully merging a pull request may close this issue.

2 participants