ubugeeei / chibivue

chibivue is minimal Vue.js v3 core implementations (Reactivity System, Virtual DOM, Component, Compiler (Template, SFC)). An online book for building your own Vue.js.
https://ubugeeei.github.io/chibivue/
360 stars 37 forks source link

fix: šŸ“Œ Fixed sample code in Minimum SFC. #280

Closed madogiwa0124 closed 5 months ago

madogiwa0124 commented 5 months ago

Description

In the step for adding option to generate, it seemed necessary to add option to the arguments of genNode and genElement as well.

https://github.com/Ubugeeei/chibivue/blob/v0.0.8/book/impls/10_minimum_example/070_sfc_compiler3/packages/compiler-core/codegen.ts

Therefore, genNode and genElement with added arguments were also added to the sample code.

äø€ę™‚ēš„ćŖåƾåæœćŖć®ć§ć‚ć¾ć‚ŠåŽ³ę ¼ć§ćÆćŖć„ć®ć§ć™ćŒć€ę¦‚ć­å‹•ä½œć™ć‚‹ć‚ˆć†ć«ćŖ悋ćØę€ć„ć¾ć™ć€‚

export const generate = (
  {
    children,
  }: {
    children: TemplateChildNode[]
  },
  option: Required<CompilerOptions>,
): string => {
  // isBrowser 恌 false ć®å “åˆćÆ with ę–‡ć‚’å«ć¾ćŖć„ć‚³ćƒ¼ćƒ‰ć‚’ē”Ÿęˆć™ć‚‹
  return `${option.isBrowser ? 'return ' : ''}function render(_ctx) {
    ${option.isBrowser ? 'with (_ctx) {' : ''}
      const { h } = ChibiVue;
      return ${genNode(children[0], option)};
    ${option.isBrowser ? '}' : ''}
}`
}

// .
// .
// .

const genProp = (
  prop: AttributeNode | DirectiveNode,
  option: Required<CompilerOptions>,
): string => {
  switch (prop.type) {
    case NodeTypes.ATTRIBUTE:
      return `${prop.name}: "${prop.value?.content}"`
    case NodeTypes.DIRECTIVE: {
      switch (prop.name) {
        case 'on':
          return `${toHandlerKey(prop.arg)}: ${
            option.isBrowser ? '' : '_ctx.' // -------------------- 恓恓
          }${prop.exp}`
        default:
          // TODO: other directives
          throw new Error(`unexpected directive name. got "${prop.name}"`)
      }
    }
    default:
      throw new Error(`unexpected prop type.`)
  }
}

// .
// .
// .

const genInterpolation = (
  node: InterpolationNode,
  option: Required<CompilerOptions>,
): string => {
  return `${option.isBrowser ? '' : '_ctx.'}${node.content}` // ------------ 恓恓
}

https://ubugeeei.github.io/chibivue/10-minimum-example/090-minimum-sfc.html#template-%E9%83%A8%E5%88%86%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%8F%E3%82%9A%E3%82%A4%E3%83%AB

Test

I have confirmed that the check action was successful.

https://github.com/madogiwa0124/chibivue/actions/runs/8917212290/job/24489904378