Skip to content

Architecture Overview

github-actions[bot] edited this page Jun 17, 2026 · 1 revision

Architecture Overview

Rikka ้‡‡็”จๆธ…ๆ™ฐ็š„ไธ‰ๅฑ‚ๆžถๆž„๏ผšๅ“ๅบ”ๅผๅฑ‚ โ†’ DOM ๅฑ‚ โ†’ ่‡ชๅฎšไน‰ๅ…ƒ็ด ๅฑ‚๏ผŒๆฏไธ€ๅฑ‚ๅฏ็‹ฌ็ซ‹ไฝฟ็”จ๏ผŒไธŠๅฑ‚ๆž„ๅปบไบŽไธ‹ๅฑ‚ไน‹ไธŠใ€‚

ๆ•ดไฝ“ๆžถๆž„ๅ›พ

  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
  โ”‚              Application / Components              โ”‚
  โ”‚        (examples/*, rikka-homepage, user code)     โ”‚
  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                โ”‚                  โ”‚
  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
  โ”‚ rikka-live-playground  โ”‚  โ”‚  rikka-elements        โ”‚
  โ”‚  (ๅŸบไบŽ rikka-elements  โ”‚  โ”‚  defineElement,         โ”‚
  โ”‚    ๆž„ๅปบ็š„้ซ˜็บง็ป„ไปถ)     โ”‚  โ”‚   ๅฑžๆ€ง/ไบ‹ไปถ/ๆ–นๆณ•/ๆจกๆฟ   โ”‚
  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                โ”‚                   โ”‚
  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
  โ”‚                    rikka-dom                         โ”‚
  โ”‚  h(), tag helpers, ReactiveRange, For/Show/Switch,  โ”‚
  โ”‚           css(), inlineStyle, ๆจกๆฟ่งฃๆž               โ”‚
  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                โ”‚
  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
  โ”‚                  rikka-signal                        โ”‚
  โ”‚     signal(v), computed(fn), effect(fn), untracked   โ”‚
  โ”‚     ๅŸบไบŽ signal-polyfill (TC39 Signals ๆๆกˆ)         โ”‚
  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                โ”‚
  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
  โ”‚          Native Web Platform / signal-polyfill       โ”‚
  โ”‚  Custom Elements v1 ยท Shadow DOM ยท CSS ๅตŒๅฅ— ยท        โ”‚
  โ”‚  ES Modules ยท HTMLTemplateElement ยท WeakRef         โ”‚
  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ๅ…ณ้”ฎๆžถๆž„ๅŽŸๅˆ™

1. ้€ๅฑ‚ๆž„ๅปบ๏ผŒๆฏๅฑ‚็‹ฌ็ซ‹ๅฏ็”จ

  • ๅช้œ€่ฆๅ“ๅบ”ๅผ โ†’ ็”จ rikka-signal
  • ้œ€่ฆๅฃฐๆ˜Žๅผ DOM ๅˆ›ๅปบ โ†’ ็”จ rikka-dom
  • ้œ€่ฆๅฏๅค็”จ Web Component โ†’ ็”จ rikka-elements

2. ้›ถ่ฟ่กŒๆ—ถไพ่ต–

  • ๆ ธๅฟƒๅŒ… @takanashi/rikka-signalใ€@takanashi/rikka-domใ€@takanashi/rikka-elements ้™คไบ† signal-polyfill ๆฒกๆœ‰่ฟ่กŒๆ—ถไพ่ต–
  • ไบง็‰ฉ้€š่ฟ‡ rslib ๆž„ๅปบ๏ผŒๅฏ Tree-shake๏ผŒๅ•ๅŒ… gzipped ็บฆ 1-6KB

3. Tag ๅ‡ฝๆ•ฐ่ฟ”ๅ›ž็œŸๅฎž DOM

h(tag, attrs, children) ๅ’Œๆ‰€ๆœ‰้ข„็”Ÿๆˆ็š„ div / button / ... ๅ‡ฝๆ•ฐ้ƒฝ่ฟ”ๅ›ž็œŸๅฎž็š„ HTMLElement๏ผŒๆฒกๆœ‰่™šๆ‹Ÿ DOM ๅฑ‚๏ผŒๆฒกๆœ‰ diff ็ฎ—ๆณ•ใ€‚

4. Signal ้ฉฑๅŠจ็ป†็ฒ’ๅบฆๆ›ดๆ–ฐ

  • ๅ“ๅบ”ๅผ่ฎข้˜…ๅœจ effect / ReactiveRange ๅ†…้ƒจๅปบ็ซ‹
  • ๆฏๆฌก .set() ่งฆๅ‘่ฎข้˜…่Š‚็‚น็š„ๅฑ€้ƒจๆ›ดๆ–ฐ๏ผŒ่€Œไธๆ˜ฏๆ•ดๆฃตๆ ‘้‡ๆธฒๆŸ“
  • ไฝฟ็”จ WeakMap + FinalizationRegistry ๅš่‡ชๅŠจๆธ…็†๏ผŒ้ฟๅ…ๅ†…ๅญ˜ๆณ„ๆผ

5. Web Component ๅ‹ๅฅฝ่€Œ้žๆก†ๆžถ้”ๅฎš

defineElement() ไบง็”Ÿ็š„ๆ˜ฏๆ ‡ๅ‡† HTMLElement ๅญ็ฑป๏ผŒๅฏๅœจ React / Vue / Angular / Svelte ไธญ็›ดๆŽฅไฝฟ็”จ๏ผŒไนŸๅฏ่ฃธ HTML ไฝฟ็”จใ€‚

ๆจกๅ—ไพ่ต–ๅ…ณ็ณป

@takanashi/rikka-signal       # ๆ— ๅ†…้ƒจไพ่ต– (ไป… peer: signal-polyfill)
        โ–ฒ
        โ”‚  ๅฏผๅ…ฅ
        โ”‚
@takanashi/rikka-dom          # ไพ่ต– rikka-signal
        โ–ฒ
        โ”‚  ๅฏผๅ…ฅ
        โ”‚
@takanashi/rikka-elements     # ไพ่ต– rikka-dom + rikka-signal
        โ–ฒ
        โ”‚  ๅฏผๅ…ฅ
        โ”‚
@takanashi/rikka-live-playground  # ไพ่ต– rikka-elements

ๅ“ๅบ”ๅผๆ‰ง่กŒๆจกๅž‹

 signal.set(newValue)
        โ”‚
        โ–ผ
 Signal.State ็š„็‰ˆๆœฌๅท ++
        โ”‚
        โ–ผ
 signal-polyfill ้€š็Ÿฅๆ‰€ๆœ‰่ฎข้˜…่€…
        โ”‚
        โ–ผ
 effect(fn) ๆณจๅ†Œ็š„ Watcher ่งฆๅ‘
  (queueMicrotask ไธญๅผ‚ๆญฅๆ‰ง่กŒ)
        โ”‚
        โ–ผ
 fn() ๆ‰ง่กŒๆ—ถ่ฏปๅ–ไฟกๅท โ†’ ้‡ๆ–ฐๅปบ็ซ‹ไพ่ต– โ†’ ๅฑ€้ƒจ DOM ๆ›ดๆ–ฐ
        โ”‚
        โ–ผ
 Signal.Computed ๅปถ่ฟŸๆฑ‚ๅ€ผ๏ผˆๆŒ‰้œ€๏ผ‰

ๅ…ณ้”ฎๅฎž็Žฐๆ–‡ไปถ๏ผš

  • utils/rikka-signal/src/index.ts โ€” signal/computed/untracked
  • utils/rikka-signal/src/effect.ts โ€” ๅธฆๆธ…็†็š„ effect ๅฎž็Žฐ

DOM ๆ›ดๆ–ฐๆจกๅž‹

rikka-dom ้€š่ฟ‡ ReactiveRange ๆ ‡่ฎฐไธ€็ป„ๅฏๆ›ฟๆข่Š‚็‚น๏ผŒ้…ๅˆ effect ็›‘ๅฌไฟกๅทๅ˜ๅŒ–ๅนถๅชๅฏน่Œƒๅ›ดๅ†…็š„ DOM ่ฟ›่กŒๆœ€ๅฐไฟฎๆ”น๏ผš

  1. applyChild(parent, child) ๅฐ† child ๆŒ‚่ฝฝๅˆฐ็ˆถๅ…ƒ็ด 
  2. ๅฝ“ child ๆ˜ฏ Signal ๆˆ– computed๏ผŒไผš่‡ชๅŠจๅˆ›ๅปบ ReactiveRange ๅŒ…่ฃ…
  3. ไฟกๅทๅ˜ๅŒ–ๆ—ถ range.reconcile(newNodes) ๅšๆœ€ๅฐๅทฎๅผ‚ diff
  4. ๅ…ƒ็ด ้”€ๆฏๆ—ถ WeakRef + FinalizationRegistry ่‡ชๅŠจๆธ…็† effect ่ฎข้˜…

ๅ…ณ้”ฎๆ–‡ไปถ๏ผš

  • utils/rikka-dom/src/h.ts โ€” ReactiveRange / applyChild / h() / createElement
  • utils/rikka-dom/src/tags.ts โ€” ้ข„็”Ÿๆˆ็š„ HTML/SVG/MathML tag helpers
  • utils/rikka-dom/src/control-flow.ts โ€” For / Show / When / Switch / Match
  • utils/rikka-dom/src/template.ts โ€” HTML ๆจกๆฟๅญ—็ฌฆไธฒ่งฃๆžใ€css()ใ€inlineStyle
  • utils/rikka-dom/src/attributes.ts โ€” ็ฑปๅž‹ๅฑžๆ€งๆ˜ ๅฐ„

่‡ชๅฎšไน‰ๅ…ƒ็ด ๆจกๅž‹

defineElement(tagName, config) ๅฎŒๆˆ๏ผš

  1. ไธบ attributes ็”Ÿๆˆ getter/setter๏ผŒๅ…ถไธญ setter โ‰ก signal.set() + setAttribute()
  2. ไธบๆฏไธชๅฑžๆ€ง็”Ÿๆˆ this.$attrName ็š„ signal ่ฎฟ้—ฎๅ™จ๏ผˆไพ› render ๅ“ๅบ”ๅผไฝฟ็”จ๏ผ‰
  3. ไธบ events ็”Ÿๆˆ dispatchEventName(detail) ๅˆ†ๅ‘ๅ™จ
  4. ๅฐ† methods ็›ดๆŽฅๆŒ‚ๅˆฐๅŽŸๅž‹
  5. connectedCallback ไธญ attach Shadow DOMใ€ๅบ”็”จ stylesใ€่ฐƒ็”จ render() ๆˆ–ๅ…‹้š† template
  6. disconnectedCallback ๆธ…็† effect / ไบ‹ไปถ็›‘ๅฌๅ™จ

ๅ…ณ้”ฎๆ–‡ไปถ๏ผš

  • utils/rikka-elements/src/defineElement.ts โ€” ๆ ธๅฟƒ
  • utils/rikka-elements/src/utils.ts โ€” PascalCase / camelCase ๅทฅๅ…ท

้กน็›ฎๅทฅไฝœๆตๆžถๆž„

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚   pnpm install   โ”‚โ”€โ”€โ–ถโ”‚  pnpm build       โ”‚โ”€โ”€โ–ถโ”‚  pnpm test:all    โ”‚
โ”‚ (catalog deps)   โ”‚   โ”‚ (rslib ๆž„ๅปบ ESM)  โ”‚   โ”‚(lint+type+unit+e2e)โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                                         โ”‚
                                                  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”
                                                  โ”‚ Changeset    โ”‚
                                                  โ”‚ version bump โ”‚
                                                  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                                         โ”‚
                                                  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”
                                                  โ”‚ npm publish  โ”‚
                                                  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ไธ‹ไธ€ๆญฅ

  • rikka-signal API โ€” ๅ“ๅบ”ๅผๅŽŸ่ฏญ่ฏฆ่งฃ
  • rikka-dom API โ€” DOM ๅˆ›ๅปบไธŽๅ“ๅบ”ๅผๆธฒๆŸ“
  • rikka-elements API โ€” ่‡ชๅฎšไน‰ๅ…ƒ็ด ๅฎšไน‰

Clone this wiki locally