๋ฌธ์
React์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑ ์์์ ์ฃผ์์ ๋ฌ ์ ์์ต๋๋ค.
/** Documentation that will appear on hover in other places where this is imported */
function MyComponent() { return null }
๊ทธ๋ฌ๋ Svelte์์๋ ์ด ์์ ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์ง ๋ชปํ์ต๋๋ค.
ํด๊ฒฐ์ฑ
VSCode ๋ฐ Vim/Neovim(coc.nvim ํฌํจ)๊ณผ ๊ฐ์ ํธ์ง๊ธฐ์ ์จ-์ค๋ฒ ๋ฌธ์์์ ์ฑํํ ์ฃผ์์ ์ด๋์ ๋ ์ ์๋์ง ์๊ณ ์ถ์ต๋๋ค.
์ค๋ช
์ ์ํด ์ฌ๊ธฐ์ MyComponent
์์ง๋ง import MyComponent
.
๋ด ๋
์คํธ๋ง Documentation that will appear on hover in other places where this is imported
์ ํดํ์ ํฌํจํ๊ณ ์ถ์ต๋๋ค.
๋๋ ์ด๊ฒ์ ์ํด ์ ์ ๋์ ์ฃผ์๋ฅผ ๋๋ฌ ๋ณด์๊ณ TypeScript๋ก ๋ก์ปฌ ์ค์ ์ ์๋ํ์ง๋ง ๊ทธ๊ฒ์ ํ ๋ฐฉ๋ฒ์ ์ฐพ์ ์ ์์ต๋๋ค. Svelte ๊ตฌ์ฑ ์์ ์ ๋ํ
ํธ์ง: ์ด๊ฒ์ด ์ปดํ์ผ๋ฌ์ ๋ ์ ์ถ๊ฐ๋๋์ง ์ฌ๋ถ์ ๋ํด ๋ ผ์ ์ค์ด๋ฏ๋ก https://github.com/sveltejs/svelte/issues/5102 ์์ ์ ์ฌํ ๋ฌธ์ ๋ฅผ ๋ง๋ค์์ต๋๋ค.
์ด๊ฒ์ ์คํฌ๋ฆฝํธ ํ๊ทธ๊ฐ ์๋ ๊ตฌ์ฑ ์์์๋ ์ ์ฉํ ์ ์์ผ๋ฏ๋ก HTML ์ฃผ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. svelte2tsx
๋ ํน์ ํ๊ทธ(์ @doc
)๋ก ์์ํ๋ HTML ์ฃผ์์ ์ฐพ๊ณ ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ ์์ ๋ด์ฉ์ jsdoc๋ก ๋ฃ์ต๋๋ค.
์๊ฒฌ? ๋ค๋ฅธ ์์ด๋์ด?
๋๋ ์ด๊ฒ์ ๊ตฌํํ๋ ๋ฐ ์ ๋ง๋ก ๊ด์ฌ์ด ์์ ๊ฒ์ ๋๋ค. ํ์ง๋ง ์ผ๋ถ ๊ฐ๋ฐ์๊ฐ ๋งค์ผ _๋งค์ฐ ์์ฃผ_ ์ฌ์ฉํ๋ ๊ธฐ๋ฅ์ด๊ธฐ ๋๋ฌธ์ ์ ์คํ๊ฒ ์ค๊ณํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์๊ฐ๋๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
/**
* <strong i="6">@file</strong> Here is my documentation for this component
*/
ํ์ผ์ ์์ ๋ถ๋ถ. ํ์ง๋ง HTML ์ฃผ์๋ง ์๋ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ง๋์?
๋ํ ๋ค๋ฅธ ํ๊ทธ์ ๋ ์ ์ฌํ๊ฒ ๋ง๋ค๋ ค๋ฉด <svelte:head>
์ ์ ์ฌํ <svelte:documentation>
ํ๊ทธ๊ฐ ์ข์ ์ ์์ง๋ง ์ปดํ์ผ๋ฌ์์ ๊ตฌํํด์ผ ํฉ๋๋ค.
์๋ง๋ <svelte:options documentation="blabla" />
?
๋ํ ์ปดํ์ผ๋ฌ์์ ์ฝ๊ฐ์ ์์ ๊ณผ ๊ธฐ๋ณธ ์ ์ฅ์์ ์น์ธ์ด ํ์ํฉ๋๋ค. ์ต์ ์ ์ปดํ์ผ๋ฌ์ ์ํด ํ์ธ๋์์ต๋๋ค.
๋๋ ๋ฉ์ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ ์ฌํ ๋ฌธ์ ๋ฅผ ๋ง๋ค์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ด๋ค ๊ฒฐ๋ก ์ ๋๋ฌํ ์ ์๋์ง ๋ด ์๋ค :+1:
https://github.com/sveltejs/language-tools/pull/282 ๊ฐ ๋ณํฉ๋๋ฉด ์ ๋ฐ์ด ์๋ฃ๋ฉ๋๋ค. LSP๋ ํธ๋ฒ์ ๋ฌธ์ ๋ฌธ์์ด์ ํ์ํ์ง ์์์ต๋๋ค.
์ด์ ๋ด๊ฐ ํด์ผ ํ ์ผ์ @doc
HTML ์ฃผ์์์ ๋
์คํธ๋ง์ ๊ฐ์ ธ์ svelte2tsx์ addComponentExport
์ ์ถ๊ฐํ๋ ๊ฒ์
๋๋ค.
@dummdidumm ํ์ฌ ์ด๋ฆ์ด ์ง์ ๋์ง ์์๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ์
export default class {
$$prop_def = __sveltets_partial(render().props)
$$slot_def = render().slots
}
๊ฐ ํ์ผ์ ๋ฃจํธ ๋ฒ์์ ๋ค์ด๊ฐ ์ ์๋ ๊ฒ์ render
๋ฐ ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ๋ฟ์ด๋ฏ๋ก Component
์ ๊ฐ์ ์ผ๋ฐ ์ด๋ฆ์ ์ง์ ํ๋ ๊ฒ์ ๋ฌดํดํฉ๋๋ค. ์๋๋ฉด ํ์ผ ์ด๋ฆ์์ ์ ํํ์๊ฒ ์ต๋๊น?
๋ค, ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค.
์ด ์ฝ๋ ์ค ํ๋๋ผ๋ ๊ฒฐ๊ตญ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐํ์์ ์ผ๋ถ๊ฐ ๋ฉ๋๊น? ์๋๋ฉด ๋๊ตฌ ์ง์์ ์ํ ๊ฒ์ ๋๊น?
๊ทธ๋ฅ ๋๊ตฌ.
๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ ์ ๋ณด: ๊ฐ์ ธ์ค๊ธฐ ์๋ ์์ฑ์ ์ด๋ค ์ํฅ์ ๋ฏธ์น๋์ง ํ์ธํด์ผ ํฉ๋๋ค.
๋ง์์. ๋๋ ๊ทธ๊ฒ์ด ํ์ฌ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํดํ์ง ๋ชปํฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ด TS ์ ์ฉ ํ๊ฒฝ์์ ์๋ฎฌ๋ ์ดํธํ๋ ค๊ณ ํ๋ฉด:
// Component.ts
export default class {}
๋ค๋ฅธ ํ์ผ์์๋ Component
์ ๋ํ ์๋ ์์ฑ์ด ํ์๋์ง ์์ง๋ง Svelte์์๋ ์ด๋ป๊ฒ๋ ์๋ํฉ๋๋ค. ์๋ง๋ LSP์์ ๊ด๋ จ ์ฝ๋๋ฅผ ์ฝ์ด์ผ ํ ๊ฒ์
๋๋ค.
์ด์จ๋ ๋์ ์ด๋ ๊ฒ ํ๋ฉด:
// Component.ts
export default class Component {}
๊ทธ๋ฐ ๋ค์ ๋ค๋ฅธ ํ์ผ์์ Component
๋ก ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ์ ๋ํ ์๋ ์์ฑ์ ์ป์ต๋๋ค. ๋ฐ๋ผ์ ์ง๊ธ์ ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ์ ์ด๋ฆ์ ํ์ผ๊ณผ ๋์ผํ๊ฒ ์ง์ ํ ๋ค์ ์ค์๊ฐ์ผ๋ก ํ
์คํธํ๋ ๊ฒ์ด ์์ ํฉ๋๋ค.
์๊ฒ ์ต๋๋ค. ๊ทธ๋์ ๋ ๊ฐ์ง ์ต์ ์ ์๋ํ์ง๋ง LSP๋ฅผ ์ฌ์ฉํ๋ฉด ๊ตฌ์ฑ ์์ ๊ฐ์ ธ์ค๊ธฐ์ ์๋ ์์ฑ์ ์๋ํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
export default class {
// etc
}
๋ด๊ฐ ์๋ํ ๊ฒ๋ค:
export default class Name
์ค์ ๋ฐ๋ก ์ด๋ฆ์ ์ถ๊ฐํฉ๋๋ค.~ ๋ ๋ค ์๋ํ์ง ์์ต๋๋ค. ์ด์ ์์ฑ ๊ณต๊ธ์(https://github.com/sveltejs/language-tools/blob/master/packages/language-server/src/plugins/typescript/features/CompletionProvider.ts)๋ฅผ ์ดํด๋ณด๊ณ ์์ต๋๋ค. ๋ฒ์ธ์ TS ์ ์ฉ ํ๊ฒฝ์์ ํด๋์ค ์ด๋ฆ์ ๊ธฐ๋ฐ์ผ๋ก ๋ช ๋ช ๋ ํด๋์ค์ ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ์๋ฃํ๊ธฐ ๋๋ฌธ์ ๋๋ค.~
์ ๋ฐ์ดํธ: ํด๋์ค๋ฅผ ์ ์ธํ ๋ค์ ๋ด๋ณด๋ด๊ธฐ ์ด๋ฆ์ด ํ์ผ ์ด๋ฆ๊ณผ ๋์ผํ ํ ๋ค๋ฅธ ์ค์์ ๊ธฐ๋ณธ์ผ๋ก ๋ด๋ณด๋ด๋ฉด ๋ฉ๋๋ค. ์ ๋ ์ด ์ต์ ์ ์ ํํ๊ฒ ์ต๋๋ค.
์, ์์ ๊ตฌ์ฑ ์์์ ๋ํ ๊ฐ์ ธ์ค๊ธฐ ์๋ฃ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ ธ์ค๊ธฐ ์ ์์ ๊ตฌ์ฑํ๋ ๋ช ๊ฐ์ง ์ถ๊ฐ ์ฝ๋๊ฐ ์์ต๋๋ค. svelte2tsx์ ํ์ผ ์ด๋ฆ๊ณผ ๋์ผํ ๋ช ๋ช ๋ ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ๊ฐ ์๋ ๊ฒฝ์ฐ ํด๋น ์ฝ๋๋ฅผ ๋ฒ๋ฆด ์ ์์ต๋๋ค.
https://github.com/sveltejs/language-tools/pull/285 ๋ฅผ ํตํด ์์ ๋์์ต๋๋ค.