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

currentInstance 为 null #13

Closed
07akioni opened this issue Mar 23, 2019 · 7 comments
Closed

currentInstance 为 null #13

07akioni opened this issue Mar 23, 2019 · 7 comments

Comments

@07akioni
Copy link

import { h, render } from './fre/src/index'

function App() {
  return (
    h('div', {}, '123')
  )
}

render(App(), document.getElementById('root'))
reconciler.js:45 Uncaught TypeError: Cannot read property 'effects' of null
    at performWork (reconciler.js:45)

大概跟了下代码,currentInstance 只在 updateHOOKComponent 里面被设定,但是代码走不到那个函数

@yisar
Copy link
Collaborator

yisar commented Mar 23, 2019

啊……这个 effects 的 bug 我修了啊 emmm
currentInstance 是 null 的原因是 requestIdleCallback 的调度问题,这个暂时还没办法

正在研究新的调度方案,进度缓慢

@07akioni
Copy link
Author

还没把 Fiber 大概搞明白,所以具体逻辑还没搞得很清楚。但我看如果不调用 updateHOOKComponent 的话 currentInstance 就应该一直是 null 吧?这和 requestIdleCallback 关系在哪里呢?

@yisar
Copy link
Collaborator

yisar commented Mar 24, 2019

这和 requestIdleCallback 关系在哪里呢?

因为默认是先调用的 rIC,然后又没有一个好的优先级调度,所以只有在更新的时候才能拿到被更新的 fiber

真正的调度是,默认先执行高优先级的任务,rAF,然后有剩余时间,再执行 rIC

currentInstance 如果是 null,那应该到下一帧的任务里取

现在的 fre 全都是低优先级,没有优先级的调度,其实也失去了异步的意义

待我研究个新的调度器

@07akioni
Copy link
Author

我不太理解的点是代码什么时候会运行到到给 currentInstance 赋值,感觉如果没有 typeHOOK 的元素的话,应该 currentInstance 永远是 null 吧。

function beginWork(wipFiber) {
  // 首次运行的时候 wipFiber.type === ROOT
  if (wipFiber.type == HOOK) {
    // 不会进入这里
    // 但是只有进入这个函数才会更新 currentInstance
    updateHOOKComponent(wipFiber)
  } else {
    // 进入这里
    // 这里面会用到 currentInstance,但是不会被初始化,于是就报错了
    updateHostComponent(wipFiber)
  }
}
function updateHOOKComponent(wipFiber) {
  let instance = wipFiber.base
  ...
  currentInstance = instance
  ...
}

@yisar
Copy link
Collaborator

yisar commented Mar 24, 2019

没错,只有更新 hook 的时候才会更新 currentInstance
host 是普通元素,不需要更新 currentInstance,也用不到 currentInstance
currentInstance 实在 setter 的时候用来绑定 this 的

至于那个报错,我之前修复了,可能没提交代码或者提交了又回滚了……

不要急,这几天会研究新的调度,可以过阵子再来看源码

@07akioni
Copy link
Author

好 坐等更新

@yisar
Copy link
Collaborator

yisar commented Apr 20, 2019

重构完了,关掉

@yisar yisar closed this as completed Apr 20, 2019
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