Prefácio
ChatGPT tem se tornado muito popular recentemente. Hoje vou deixar ChatGPT me ajudar a ler o código fonte do Vue3.
Todos sabemos que o componente Vue3 tem uma setup
função. Então, o que ele faz internamente?Siga o ChatGPT hoje para descobrir.
Combate real
setup
Onde está a função? Não sabemos o nome de sua função de implementação, então perguntamos ao ChatGPT:
ChatGPT me diz que setup
a função está no packages/runtime-core/src/component.ts
arquivo. Como todos sabemos, runtime-core
é o código central do tempo de execução do Vue3. Vamos entrar e dar uma olhada.
Pelo que dizia, encontramos setupComponent
a createComponentInstance
função e, mas não setupRenderEffect
a função, o ChatGPT só conhece o conhecimento antes de 2021. O código Vue3 passou por muitas mudanças, mas não importa, isso não afeta muito.
ChatGPT me diz que setupComponent
a função é createComponentInstance
executada na função. createComponentInstance
Veja o nome para criar uma instância do componente. Veja o código detalhado.
Copie diretamente para ChatGPT:
Lemos o código conforme explicação do ChatGPT e descobrimos que createComponentInstance
apenas uma instância do componente foi criada e retornada. Não é executado na função como disse acima setupComponent
, ChatGPT estúpido.
Então descubra setupComponent
onde ele é chamado.
Você pode packages/runtime-core/
pesquisar o nome da função e encontrá-lo rapidamente. em uma função packages/runtime-core/src/renderer.ts
em um arquivo mountComponent
.
mountComponent
É um método de montagem de componentes.Há um monte de lógica de renderização personalizada na frente dele, que não será discutida neste artigo.
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
A função é chamada primeiro createComponentInstance
, retorna uma instância do componente e passa a instância como parâmetro setupComponent
. A propósito, também encontramos uma função que o ChatGPT perdeu aqui setupRenderEffect
, que é usada para lidar com alguns efeitos colaterais da renderização.
Voltando à setupComponent
função, o comentário de Evan nos diz que ela lida com adereços e 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
}
Alimente o código para ChatGPT:
setupComponent
Na função, após processar adereços e slots, ela é chamada com base no fato de ser um componente com estado setupStatefulComponent
.
Alimente tudo diretamente setupStatefulComponent
para ChatGPT:
Muito longo, provavelmente significa:
- Um cache de proxy accessCache foi criado. Não sei por que ele é usado. Você pode perguntar ao ChatGPT.
- Crie um objeto proxy de instância pública (proxy)
- Configuração do componente de execução()
As operações subsequentes devem chamar handleSetupResult
e finishComponentSetup
retornar a função de renderização. Vamos começar com a lógica de renderização.
resumo
Para resumir setup
toda a história:
createComponentInstance
Chamada para criar instância de componente a partir da montagem do componente- Passe a instância do componente para
setupComponent
setupComponent
Inicialize internamente adereços e slotssetupStatefulComponent
componente executivosetup
- Conclua o processo de configuração
- Função de renderização de retorno
- ...
Resumir
O ChatGPT é muito poderoso, mas também muito estúpido, afinal não está conectado à Internet e só possui dados anteriores a 2021. Pode ser usado para nos ajudar a ler códigos-fonte obscuros, mas só pode servir como uma função auxiliar e requer nosso próprio pensamento.
PS: Existem tantos códigos-fonte do vue que não consigo mais alimentá-los. Se você estiver interessado, experimente você mesmo.
Recentemente , fiquei acordado até tarde para preparar um resumo muito abrangente das instruções eficientes do ChatGPT [versão completa] . Se precisar, você pode obtê-lo gratuitamente por mensagem privada!