首頁  >  文章  >  web前端  >  怎麼讓ChatGPT解讀Vue3源碼

怎麼讓ChatGPT解讀Vue3源碼

PHPz
PHPz轉載
2023-05-10 17:52:131256瀏覽

實戰

setup

setup 函數在什麼位置呢,我們不知道他的實作函數名稱,所以問一下ChatGPT:

怎麼讓ChatGPT解讀Vue3源碼

#ChatGPT 告訴我,setup 函數在packages/runtime-core/src/component.ts 檔案中。眾所周知,runtime-core是 Vue3 的執行階段核心程式碼。我們進去看一眼。

按照它所說的,我們找到了setupComponentcreateComponentInstance 函數,並沒有找到setupRenderEffect 函數,ChatGPT 的只知道2021 年先前的知識,Vue3 程式碼經過了很多變動,不過沒關係,這不影響太多。

ChatGPT 告訴我,setupComponent 函數是在createComponentInstance函數中執行的,createComponentInstance看名字是建立元件實例,看看詳細程式碼。

直接複製給ChatGPT:

怎麼讓ChatGPT解讀Vue3源碼

我們根據ChatGPT 的解釋來閱讀程式碼,發現createComponentInstance只是創建了元件的實例並返回。並沒有像它上面說的在函數中執行了 setupComponent,笨笨的 ChatGPT。

那就自己找一下setupComponent是在哪裡被呼叫的。

可以packages/runtime-core/搜一下函數名,很快就找到了。在packages/runtime-core/src/renderer.ts檔案中的mountComponent函數中。

mountComponent 是掛載元件的方法,前面還有一堆自訂渲染器的邏輯,不在此篇展開。

  const mountComponent: MountComponentFn = (...args) => {
    const instance: ComponentInternalInstance =
      compatMountInstance ||
      (initialVNode.component = createComponentInstance(
        initialVNode,
        parentComponent,
        parentSuspense
      ))
    // ... 省略代码
    // resolve props and slots for setup context
    if (!(__COMPAT__ && compatMountInstance)) {
        // ...这里调用了setupComponent,传入了实例,还写了注释,感人
      setupComponent(instance)
    }
    // setupRenderEffect 居然也在这
    setupRenderEffect(
      instance,
      initialVNode,
      container,
      anchor,
      parentSuspense,
      isSVG,
      optimized
    )
  }

mountComponent函數先呼叫了createComponentInstance, 傳回個元件實例,又把實例當作參數傳給了 setupComponent。順便我們也在這裡發現了 ChatGPT 搞丟的setupRenderEffect函數,它是用來處理一些渲染副作用的。

回到 setupComponent函數,Evan 的註解告訴我們它是處理 props 和 slots 的。

export function setupComponent(
  instance: ComponentInternalInstance,
  isSSR = false
) {
  isInSSRComponentSetup = isSSR
  const { props, children } = instance.vnode
  const isStateful = isStatefulComponent(instance)
  initProps(instance, props, isStateful, isSSR)
  initSlots(instance, children)
  const setupResult = isStateful
    ? setupStatefulComponent(instance, isSSR)
    : undefined
  isInSSRComponentSetup = false
  return setupResult
}

把程式碼餵給ChatGPT:

怎麼讓ChatGPT解讀Vue3源碼

setupComponent 函數中,處理完props 和slots 後,根據是否是有狀態元件呼叫了setupStatefulComponent

直接整個setupStatefulComponent餵給ChatGPT:

怎麼讓ChatGPT解讀Vue3源碼

太長了,大概意思:

  • #建立了代理快取accessCache,幹嘛用的咱也不知道,可以問ChatGPT

  • 建立公用實例代理物件(proxy)

  • 執行元件的setup()

後續操作是呼叫handleSetupResultfinishComponentSetup 傳回渲染函數。開始走渲染邏輯了。

以上是怎麼讓ChatGPT解讀Vue3源碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除