1. function workLoop(deadline) {
    2. while(nextUnitOfWork && deadline.timeRemaining() > 1) {
    3. // 这个while循环会在任务执行完或者时间到了的时候结束
    4. nextUnitOfWork = performUnitOfWork(nextUnitOfWork);
    5. }
    6. // 如果任务还没完,但是时间到了,我们需要继续注册requestIdleCallback
    7. requestIdleCallback(workLoop);
    8. }
    9. // performUnitOfWork用来执行任务,参数是我们的当前fiber任务,返回值是下一个任务
    10. function performUnitOfWork(fiber) {
    11. }
    12. requestIdleCallback(workLoop);
    1. // performUnitOfWork用来执行任务,参数是我们的当前fiber任务,返回值是下一个任务
    2. function performUnitOfWork(fiber) {
    3. // 根节点的dom就是container,如果没有这个属性,说明当前fiber不是根节点
    4. if(!fiber.dom) {
    5. fiber.dom = createDom(fiber); // 创建一个DOM挂载上去
    6. }
    7. // 如果有父节点,将当前节点挂载到父节点上
    8. if(fiber.return) {
    9. fiber.return.dom.appendChild(fiber.dom);
    10. }
    11. // 将我们前面的vDom结构转换为fiber结构
    12. const elements = fiber.children;
    13. let prevSibling = null;
    14. if(elements && elements.length) {
    15. for(let i = 0; i < elements.length; i++) {
    16. const element = elements[i];
    17. const newFiber = {
    18. type: element.type,
    19. props: element.props,
    20. return: fiber,
    21. dom: null
    22. }
    23. // 父级的child指向第一个子元素
    24. if(i === 0) {
    25. fiber.child = newFiber;
    26. } else {
    27. // 每个子元素拥有指向下一个子元素的指针
    28. prevSibling.sibling = newFiber;
    29. }
    30. prevSibling = newFiber;
    31. }
    32. }
    33. // 这个函数的返回值是下一个任务,这其实是一个深度优先遍历
    34. // 先找子元素,没有子元素了就找兄弟元素
    35. // 兄弟元素也没有了就返回父元素
    36. // 然后再找这个父元素的兄弟元素
    37. // 最后到根节点结束
    38. // 这个遍历的顺序其实就是从上到下,从左到右
    39. if(fiber.child) {
    40. return fiber.child;
    41. }
    42. let nextFiber = fiber;
    43. while(nextFiber) {
    44. if(nextFiber.sibling) {
    45. return nextFiber.sibling;
    46. }
    47. nextFiber = nextFiber.return;
    48. }
    49. }

    https://www.cnblogs.com/dennisj/p/13183332.html