Skip to content
New issue

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

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

Already on GitHub? # to your account

feat(createFile): support async content #299

Merged
merged 2 commits into from
Jun 9, 2022
Merged

feat(createFile): support async content #299

merged 2 commits into from
Jun 9, 2022

Conversation

Repraance
Copy link
Contributor

@Repraance Repraance commented Jun 9, 2022

首先是关于effect机制。
在shuvi中,@vue/reactivity 无法追踪异步effect,或者说是nextTick里发生的effect。
一般来说,effect会首先被执行一次,并收集依赖。
我们发现,effectFunction在访问reactive的变量时,如果发生在nextTick中,那么该变量将无法被正常追踪。

这个问题会导致,如果content是异步函数,并且引用了context(projectManager/fileManager设置的context),当reactive context 变更时,
无法触发effect。
这个issue简要说明了这个问题
vuejs/core#2093

vue/core源码的测试用例也可以证实这个问题

it('should observe basic properties', async () => {
    let dummy: any
    const counter = reactive({ num: 0 })
    effect(async () => {
      await Promise.resolve()
      await sleep(1000)
      dummy = counter.num
    })

    await sleep(1200)

    expect(dummy).toBe(0)

    counter.num = 7
    await sleep(1200)

    expect(dummy).toBe(7)
  })

需要注意的是,官方文档里watchEffect里异步函数的例子是给reactive变量赋值,而非访问(其实相当于react的useEffect)。

当前,createFile具有三种签名

1 参数是一个对象,其字段分别为name,content函数(没有参数),dependencies
2 参数是一个对象,其字段分别为name,content函数(参数为context),dependencies
3 参数是一个函数,这个函数接受一个context参数,并返回1中的对象

由于前面说的,如果createFile需要引用context,那么其content函数必须是同步函数才能工作。
因此,对于本次异步化改造,只改造了1的情况。

其中3的情况目前其实已经不存在了。最初,filePresets仅由service负责,于是有一个比较庞大的context来存放文件信息。
当时,对于custom app/runtime/server.js来说,dependencies是存放在context中的,而context只能从content函数中拿到,为此,只好设计了3这种签名以满足需求。

Copy link
Contributor

@liximomo liximomo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

/lgtm

@liximomo liximomo merged commit b0de9e6 into shuvijs:dev Jun 9, 2022
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants