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

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
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

Successfully merging this pull request may close these issues.

2 participants