μ΄ μ€λ λλ svelte νμΌμ© μΈμ΄ μλ²λ₯Ό ꡬννλ λ°©λ²μ λν μ κ·Ό λ°©μμ κ°μλ₯Ό μν κ²μ λλ€. μ νΈνλ μ루μ μ λν λ Όμλ μ¬κΈ°μμ ν μ μμ΅λλ€.
νμ¬ κ΅¬λ¬Έ κ°μ‘° λ° μΌλΆ κΈ°λ³Έ μλ μμ±μ svelte νμΌμ λν΄ μλν©λλ€.
κ·Έλ¬λ νλΆν μΈν
리μΌμ€κ° μ 곡λμ§ μκ³ μμ
곡κ°μ λͺ¨λ typescript νμΌμ λν΄ μμ§ λͺ»νλ©° svelte κ΅¬μ± μμμ λν μ ν μ 보λ μμ΅λλ€.
νΉμν svelte κ΅¬λ¬Έμ΄ κ°μ‘° νμλμ§λ§ intellisenseκ° μλνμ§ μλ html λΆλΆλ λ§μ°¬κ°μ§μ
λλ€. κΈ°λ³Έμ μΌλ‘ νΉλ³ν ꡬ문μ μμ§ λͺ»νλ vscode-html-languageserviceκ° μ¬μ©λ©λλ€.
νμ¬ μΈμ΄ μλ²λ νμΌμ ꡬ문 λΆμνκ³ "μ΄ img νκ·Έμ alt μμ±μ΄ μμ"κ³Ό κ°μ μ§λ¨μ μ»κΈ° μν΄ svelte μ»΄νμΌλ¬λ₯Ό μ¬μ©ν©λλ€.
λ³΄λ€ μ¬μΈ΅μ μΈ λΆμ: λκΈ
λ©΄μ± μ‘°ν: μ λ κΈ°μ‘΄ μ루μ μ μμ±μκ° μλμ§λ§ μ½λλ₯Ό μ΄ν΄λ³΄μμ΅λλ€. μΌλΆ μ λ³΄κ° μλͺ»λμκ±°λ μΆ©λΆν μμΈνμ§ μκ±°λ μ루μ μ΄ λλ½λ κ²½μ° μΈμ λ μ§ μ견μ 보λ΄μ£Όμλ©΄ μμ νκ² μ΅λλ€.
htmlparser2 λ₯Ό μ¬μ©νμ¬
espree λ₯Ό μ¬μ©νμ¬
κ²°κ³Όλ₯Ό JSON νμμΌλ‘ μ 곡ν©λλ€.
https://github.com/ArdenIvanov/svelte-intellisense λ μ΄λ₯Ό μ¬μ©νμ¬ svelte νμΌμ ꡬ문 λΆμν©λλ€. κ²°κ³Όλ₯Ό μ¬μ©νμ¬ λͺ κ°μ§ μΆκ° λμμ 첨λΆν©λλ€.
μ΄κ²μ μλ°μ€ν¬λ¦½νΈ νμλ₯Ό μ¬μ©νκΈ° λλ¬Έμ typescriptμμλ μλνμ§ μμ΅λλ€.
svelteμ μ»΄νμΌλ¬λ₯Ό μ¬μ©νμ¬ svelte κ΅¬μ± μμμ HTMLx λΆλΆμ ꡬ문 λΆμν©λλ€. κ·Έλ° λ€μ HTMLxμ μλ³Έ μ€ν¬λ¦½νΈ λΆλΆμ μ체 μμ± λ³νκΈ°λ₯Ό μ¬μ©νμ¬ tsx νμΌλ‘ λ³νν©λλ€.
https://github.com/simlrh/svelte-language-server/blob/feature/extend-ts-support/src/plugins/ts-svelte/service.ts(svelte-language-server μ ν¬ν¬)λ₯Ό μ¬μ©νμ¬ svelte-filesμ shadow-tsx-filesλ₯Ό λ§λλλ€. κ·Έλ° λ€μ typescriptμ μΈμ΄ μλΉμ€λ₯Ό μ¬μ©νμ§λ§ μμ²μ νλ‘μν©λλ€. μλ νμΌ κ²½λ‘λ₯Ό μμ±λ tsx νμΌμ νμΌ κ²½λ‘λ‘ λ°κΏλλ€. λ°λΌμ typescript μΈμ΄ μλ²λ μμ±λ tsx νμΌμ νμΈν©λλ€. κ²°κ³Όλ μ¬λ°λ₯Έ λ¬Έμ μμΉλ₯Ό μ»κΈ° μν΄ λ€μ λ³νλ©λλ€.
https://github.com/halfnelson/svelte-type-checker-vscode λ svelte2tsx-libraryλ₯Ό μ¬μ©νλ λ λ€λ₯Έ μΈμ΄ μλ²μ λλ€.
ꡬνμμ μ견 μμ κ°μ Έμ¨ μ€λͺ :
μ»΄νμΌλ¬:
Svelte μ€ν¬λ¦½νΈ λ΄λΆμμ λ΄λ³΄λΈ λ³μμ ν¨μλ₯Ό μ¬μ©νκ³ λ°νμ SvelteComponentλ₯Ό νμ₯νλ ν΄λμ€λ₯Ό ν¬ν¨νλ μ μΈ νμΌλ‘ μμ±ν©λλ€.
μ ν κ²μ¬κΈ°:
μ΄ μ€λ λμ λκΈμ μ°Έμ‘°νμΈμ.
κ·Έλμ κ·Έλ€ μ€ λꡬλ Svelte νμλ₯Ό μ¬μ©νμ§ μμ΅λκΉ?
svelte2tsxλ μ€νμΌ/μ€ν¬λ¦½νΈ νκ·Έλ₯Ό μ κ±°ν λ€μ svelte μ»΄νμΌλ¬λ₯Ό μ¬μ©νμ¬ htmlx λΆλΆμ ꡬ문 λΆμν©λλ€.
svelte-tsλ svelte μ»΄νμΌλ¬λ₯Ό λ λ²μ§Έ λ¨κ³λ‘ μ¬μ©ν©λλ€.
νμ¬ μΈμ΄ μλ²λ ꡬ문 λΆμμ μν΄ svelte μ»΄νμΌλ¬λ₯Ό μ¬μ©νμ§ μμ΅λλ€.
μ΄κΈ° κ²μλ¬Όμ μ
λ°μ΄νΈνκ² μ΅λλ€.
μ΄κ²μ 곡μ ν΄μΌνλμ§ νμ€νμ§ μμμ§λ§ μΌλΆλ μ μ© ν μ μμ΅λλ€. μλ (2019λ 7μ/8μ) λλ κ·Έμ λ°°μ°κΈ° μν΄ λ²λ¦¬λ μΌμ νκ³ μλ€λ κ²μ μκ³ , νμ μ²΄νΉ Svelteλ₯Ό κ°μ§κ³ λκΈ° μμνμ΅λλ€. κ·Έκ²μ μ 체 μ루μ μ μ μ μλ μ(μλ§λ 30%)μ μ§μνλ©° λͺ κ°μ§ μ ν μ¬νμ΄ μμ΅λλ€(λμ€μ μμΈν μ€λͺ ). νμ λ§λ€λ₯Έ 골λͺ©μ΄λΌκ³ μκ°νκΈ° λλ¬Έμ ν μ€νΈλ μΈλΆ λ¬Έμκ° μμ΅λλ€.
Svelte μ»΄νμΌμ μ ν κ²μ¬κ° μλ TS μ μ²λ¦¬κΈ°λ₯Ό μ¬μ©νμ¬ μ€λλ κ³Ό κ°μ΄ μ§νλ©λλ€. μ€ν¬λ¦½νΈ νκ·ΈλΏλ§ μλλΌ HTMLx λ§ν¬μ μ μ νμ΄ νμν κ²½μ° μ΄λ₯Ό μ²λ¦¬νκΈ° μν μ μ²λ¦¬κΈ°κ° νμν©λλ€. κ·Έλ μ§ μμΌλ©΄ Svelteμμ TSλ₯Ό λ΄λΆμ μΌλ‘ μ²λ¦¬ν΄μΌ ν©λλ€.
typecheckerλμμ ν΄μ μ μ²λ¦¬ νμ΄ν μ€ν¬λ¦½νΈ μ½λλ₯Ό μ¬μ©νλ λ³λμ λΉλ λ¨κ³μ
λλ€ script
λΈλ‘μμ λ§ν¬ μ
AST svelte.compile
μν΄ κ°μ 벨ν
νμ΄ν μ€ν¬λ¦½νΈ νμΌμ λ§λ€ λͺ©μ μΌλ‘ μ ν κ²μ¬λ§μ. (μ¬κΈ°μ Rollup νλ¬κ·ΈμΈ μ΄ κ°μ νμΌμ μμ± ν λ€μ typechecksνλ κ³³μ
λλ€. ) @halfnelson μ μ λ΅κ³Ό μ μ¬νμ§λ§ TSXκ° μλ μΌλ° TSλ₯Ό μμ±νλ€λ μ μμ λ€λ₯΄λ―λ‘ λ§ν¬μ
μμ HTML νκ·Έ λ° typecheckλ₯Ό μλνμ§ μμ΅λλ€. μμ±, 콧μμΌ νκ·Έ λ° Svelte κ΅¬μ± μμ λ΄λΆμ νλͺ©λ§. Svelte κ΅¬μ± μμλ₯Ό propsμ ν¨κ» new
λ°λ μμ±μλ‘ λ³νν©λλ€. Svelteμ κ΅¬μ± μμλ₯Ό λ§μ΄ μ§μνλ κ³Όμ μμ μ΄λ μ λ μ§ννμ§λ§ μλν κ²λ³΄λ€ λ λ§μ μμ
μ΄ μ§νλκ³ μμΌλ©° λ λμκ° μ§μ§ν μμ§λμ΄λ§μ΄ μ§νλμ΄μΌ νλ€λ μ¬μ€μ κΉ¨λ¬μμ΅λλ€.
TypeScript μ»΄νμΌλ¬ APIλ λ©λͺ¨λ¦¬μ νλ‘κ·Έλ¨ μ κ²μ¬ νλ λ° μ¬μ©λ©λλ€. Svelteμ λ¬λ¦¬ μΈκ³κ΄μ κ°λ³ νμΌμ΄ μλλΌ μ 체 νλ‘κ·Έλ¨μ λλ€. κ·Έ λΉμμλ ν₯ν μ΅μ νλ‘ μ¦λΆ μ»΄νμΌ λ° μμ μ μ€λ λλ₯Ό μΆκ°νλ κ²μ΄ κ°λ¨ν κ² κ°μμ΅λλ€.
κ°μ Svelte TS νμΌμ μλ³Έ Svelte μμ€μ TypeScript μ§λ¨μ λ€μ 맀ν νλ λ° μ¬μ©λλ μμ±λ©λλ€ . μ ν μ€λ₯κ° Svelte μμ€λ₯Ό κ°λ¦¬ν€λ κ²μ 보λ κ²μ κ½€ λ©μ‘μ§λ§ λλ μ λ°μ μΌλ‘ λ΄ μ κ·Ό λ°©μμ νμ μ΄ μμμ΅λλ€.
λ΄κ° μμλΌ μ μμλ ν κ°μ§ λ¬Έμ λ μΌλΆ κ²½μ°μ μΆ©λΆν ꡬ체μ μ΄μ§ μμ μ§λ¨κ³Ό κ΄λ ¨λ κ²μ΄μμ΅λλ€. IIRCμ μλ μ ν κ²μ¬ Svelte κ΅¬μ± μμ μμ±μ μνμ΄μμ΅λλ€. VSCodeλ μ΄λ»κ² λ κ°λ³ μν μ€λ₯λ₯Ό κ°λ¦¬ν¬ κ²μ΄μ§λ§ λ΄κ° λ°κ³ μλ TS μ§λ¨μ λ¬Έμ μμ±μ΄ μλ μμ±μλ§ κ°λ¦¬μΌ°μ΅λλ€.
μ½λλ₯Ό μ΄ν΄λ³΄λ©΄ λΆλΆμ΄ μλ§μ΄κ³ μΌλΆ μ£Όμμ΄ κ΅¬μμΌ μ μλ€λ μ μ μ μνμμμ€. λλ μλ magic-string
λ₯Ό μ¬μ©νκ³ μ΄λ μμ μμ source-map
. κ·Έλ¦¬κ³ κ·Έκ²μ μ²μλΆν° μ΄λͺ
μ μΈ λ
Έλ ₯μ΄μλ€λ κ²μ κΈ°μ΅νμμμ€! μ΄ λͺ¨λ κ²μ master
μλλΌ ν΄λΉ repoμ ts
λΆκΈ°μ μμ΅λλ€.
μμμ μΈκΈν 4κ°μ νμΌμ λ€μκ³Ό κ°μ΅λλ€.
νμ¬ svelte μΈμ΄ μλ²μ μμ€ μ½λλ₯Ό νν€μ³€μ΅λλ€. νμ΄νμ€ν¬λ¦½νΈ λΆλΆμ λν μ μκ°μ λ€μκ³Ό κ°μ΅λλ€.
μΈμ΄ μλ²λ λ€μκ³Ό κ°μ΄ κ΄λ²μνκ² μλν©λλ€.
DocumentManager
λ μ΄λ¦¬λ λͺ¨λ λ¬Έμλ₯Ό μ²λ¦¬ν©λλ€.TypescriptPlugin
λ DocumentManager
μ λ±λ‘νμ¬ μΈμ΄ μλ² μ΄λ²€νΈ("doHover" λ±)μμ νΈμΆλ©λλ€. μ§μ λ±λ‘νμ§ μμ΅λλ€. wrapFragmentPlugin
λνλμ΄ TypescriptPlugin
κ° script
νκ·Έ λ΄λΆμ λ΄μ©λ§ κ°μ Έμ€λλ‘ ν©λλ€. μμΉ λ§€ν(λ§μ°μ€/ν
μ€νΈ 컀μ)μ wrapFragmentPlugin
μμ μνλμ΄ μ λ³΄κ° μ¬λ°λ₯Έ μμΉμ νμλλλ‘ ν©λλ€.TypescriptPlugin
λ typescript μΈμ΄ μλΉμ€ λνΌ service
λ₯Ό μ¬μ©ν©λλ€. κΈ°λ³Έμ μΌλ‘ λͺ¨λ μ΄λ²€νΈλ₯Ό μ΄ μΈμ΄ μλ²μ μμνλ©° μΌλΆ 맀νμ λ©μλ λ°ν μ νμ λ°λ¦
λλ€.service
λ TypescriptPlugin
μ createDocument
λ©μλμ ν¨κ» μμ
μ μνν λ¬Έμλ₯Ό κ°μ Έμ΅λλ€. service
λ νμ¬ κΈ°λ³Έμ μΌλ‘ DocumentsManager
λ¬Έμμ λν λ리μμΌ λΏμΈ μμ μ λ¬Έμ 맡μ μ μ§ν©λλ€. service
κ° TypescriptPlugin
μμ νΈμΆλ λλ§λ€ service
service
λ λ¬Έμ 맡μ μ£Όμ΄μ§ λ¬Έμλ‘ μ
λ°μ΄νΈν©λλ€(λ©ν ν). createDocument
λ μΈμ΄ μλΉμ€κ° μμ§ λ¬Έμ 맡μ μΌλΆκ° μλ λ¬Έμλ₯Ό μ΄λ©΄ νΈμΆλμ§λ§, μ΄κ²μ typescript μΈμ΄ μλΉμ€κ° λ€λ₯Έ svelte λͺ¨λμ μ°Ύμ§ μκΈ° λλ¬Έμ λ°μνμ§ μμ΅λλ€(λ€μ μΉμ
μ°Έμ‘°)..ts
/ .js
νμΌμ κ²½μ° μλνμ§λ§ .svelte
νμΌμ κ²½μ° μλνμ§ μμ΅λλ€. μ΄μ : typescript μΈμ΄ μλΉμ€λ .svelte
λμ μμ§ λͺ»νλ―λ‘ μΌλ° typescript νμΌμ΄λΌκ³ κ°μ νκ³ ../Component.svelte.ts
μ κ°μ νμΌμ κ²μνλ κ²μ μλͺ»λ κ²μ
λλ€. μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄, μ°λ¦¬λ λ°©λ²μ ꡬνν΄μΌ resolveModuleNames
μμ LanguageServiceHost
λͺ¨λ λΌμ°ν
.svelte.ts
μ νμΌ μ‘°ν .svelte
. κ·Έλ¬λ©΄ μΈμ΄ μλΉμ€κ° λͺ¨λ svelte νμΌμ νμν©λλ€. μ°Έκ³ : μ΄λ₯Ό ꡬννλ €λ©΄ λ€μ λ²κ·Έλ μμ ν΄μΌ ν©λλ€. μ΄μ typescript μΈμ΄ μλΉμ€κ° λͺ¨λ νμΌμ κ²μνλ―λ‘ createDocument
μμ TypescriptPlugin
createDocument
λ₯Ό νΈμΆν©λλ€. κ·Έλ¬λ μ΄κ²μ νμ¬ script νκ·Έ μμ λ΄μ©λΏλ§ μλλΌ μ 체 λ¬Έμλ₯Ό λ°νν©λλ€. μ΄κ²μ openDocument
λννμ§ μλ wrapFragmentPlugin
λ΄λΆμ λ²κ·Έμ
λλ€.TypescriptPlugin
(λ° λ€λ₯Έ μ¬λλ€)μ΄ λ¬Έμλ₯Ό κ°μ Έμ€λ λ°©λ²μ λ€μ μμ
ν΄μΌ νλμ§ νμ€νμ§ μμ΅λλ€. μ€ν¬λ¦½νΈ νκ·Έ μΆμΆκ³Ό μ μ²λ¦¬κ° λͺ¨λ ν λ¨κ³λ‘ μλ£λμ΄μΌ ν©λλ€. . μ΄κ²μ wrapFragmentPlugin
λ³κ²½νκ±°λ μμ ν λ체νλ κ²μ μλ―Έν©λλ€. μ¬μμ
μ λν λ λ€λ₯Έ μ£Όμ₯μ "μ¬μ©νμ§ μλ κΈ°λ₯"κ³Ό κ°μ κ²μ μ¬λ°λ₯΄κ² κ²°μ νκΈ° μν΄ html λΆλΆμ κ³ λ €ν΄μΌ νλ―λ‘ μ€ν¬λ¦½νΈ νκ·Έκ° μΆ©λΆνμ§ μλ€λ κ²μ
λλ€.μκ°?
resolveModuleNames
μμ TypeScript ν ꡬμ±μμ΄ Veturλ₯Ό μν΄ ν λ°©λ²κ³Ό Svelteμ λν΄ μν ν μ μ¬ν λ²μ μ΄ μμ΅λλ€. μ¬κΈ° μλ ν¨κ³Όκ° μμμ§λ§ Veturλ₯Ό 볡μ¬νλ κ²μ΄ λ λμ λμ μ λ΅μ μΈκΈνλ μ£Όμμ΄ ν¬ν¨λμ΄ μμ΅λλ€.
@dummdidumm κΈ°μ μ± μμ μν μ νκ³ μ΄λ¬ν λ¬Έμ λ₯Ό νΉμ λ¬Έμ λ‘ λΆλ₯ν΄λ λ κΉμ? λλ κΈ°κΊΌμ΄ κ°λ° μκ°μ μμ λ΄μ¬ν κ²μ΄μ§λ§, λλ μ΄κ²μ΄ μλμ μΌλ‘ λ§λ€λ κ²μ μκ² λμκ³ μκ³ μ μλ λ¬Έμ μμ λ μ μλν κ²μ λλ€. μνν΄μΌ νλ ν° μν€ν μ² λ³κ²½μ΄ μλ ν(μλμ?)
κΈ°λ³Έμ μΌλ‘ λ§μ λ¬Έμ λ₯Ό 곡κ°νκ³ μ¬λλ€μ΄ μ΄λ₯Ό μ£Όμ₯νκ³ μ΄μ λν λΉκ³΅μ κΈ°μ 리λλ‘ κ΄λ¦¬νκ² νμμμ€. ν΄μ£Όκ² λ€κ³ νλλ° μμ§ν μμ§ κ³ ν΅μ λͺ»λκΌμ΄μ νν
λν https://github.com/sveltejs/svelte/issues/4518μ νμνλ λ€λ₯Έ μ¬λλ€μ μν΄ ortaμ μλ LSP κ²μλ¬Όμ λ§ν¬ν©λλ€.
λ¬Όλ‘ μ΄ μΌμ λκ³ μΆμ§λ§ μ§κΈμ μΈμ΄ μλ²μ λν΄ λ§€μ° ν₯λΆνκ³ μ½λλ₯Ό νν€μΉκ³ λͺ κ°μ§ μ μμ νλ 무μμ μΉκ΅¬μ λλ€. π λν μ½λμ μ΅μν΄μ§λ €λ©΄ μκ°μ΄ λ νμν©λλ€. μν€ν μ² λ° μΌλ°μ μΌλ‘ lsp. νμ§λ§ λλ λΆλͺ ν μμΌλ‘ λμκ° μν₯μ΄ μμ΅λλ€. @orta λΉμ μ΄ μ΄ repoμ κ΄λ¦¬μμ΄κΈ° λλ¬Έμ μ΄μ λν΄ μ΄λ»κ² μκ°νμλκΉ?
π μ, μ°λ¦¬ λ λ€ κ·Έλ₯ κ΄μ¬μ κ°κ³ μλ 무μμ μ¬λλ€μ λλ€. μ λ "μ΄κ²μ΄ λ λμμΌ νλ€"λ κ°λ €μμ μ λ°ν μ μλ λ λ ΅ν μ½λλ² μ΄μ€μ‘°μ°¨ κ°μ§κ³ μμ§ μμ΅λλ€. κ·Έλμ, λλ μ΄λ€ μμ§μμ΄λΌλ λ³΄κ² λμ΄ λ§€μ° κΈ°μ©λλ€ - @dummdidumm - λ°μ΄ λμκ°λμ§ νμΈνλλ‘ λ Έλ ₯νκ² μ΅λλ€.
ν° νμΈ! κ³μν΄μ μΌλΆ PRμ ν΅ν΄ μ½λμ μΌλΆλ₯Ό μ¬κ΅¬μ±νκ³ μ€λΉνμ¬ κ°λ³ νλͺ©μ λν μμ μ λ³λ ¬νν μ μμ΅λλ€.
μ΄μ©λ©΄ μ°λ¦¬λ @ryanatkn , svelete-ts μ μ κ·Ό λ°©μ λ° eslint-plugin-svelte3 μ κ°λ³ μ κ·Ό λ°©μμ κ²°ν©ν μ μμ΅λλ€.
injected = true
κ²°κ³Ό λ³μλ₯Ό μΈμ€ν΄μ€ ts μμ€ λλ ts ASTμ μ£Όμ
ν λ€μ μμ€ λ§΅κ³Ό ν¨κ» μ¬μ©νμ¬ μ ν νμΈ λ° μλ μμ±μ μ 곡ν μ μμ΅λλ€.μ€ν¬λ¦½νΈμλ λͺ¨λ <script context="module">
, μΈμ€ν΄μ€ λ° μ½§μμΌ(ν
νλ¦Ώ)μ μΈ λΆλΆμ΄ μμ μ μμ΅λλ€. μ§κΈμ 콧μμΌ λΆλΆμ λͺ¨λ template.jsμ λ€νν μ μμ΅λλ€. κ·Έλ¬λ μ₯κΈ°μ μΌλ‘ ryanatknμ μ κ·Ό λ°©μκ³Ό κ°μ΄ ν
νλ¦Ώμ tsx λλ μΌλ° tμ λ°μν μ μμ΅λλ€.
module = true
μΈ λͺ¨λ λ³μλ template.js λ° μΈμ€ν΄μ€μ μ£Όμ
λμ§λ§ κ·Έ λ°λλ μλλλ€.
μ΄λ° μμΌλ‘ μ°λ¦¬λ typescript ASTμμ λ°μ λ³μ $: a = 1
λλ $-prefixed storeλ₯Ό μ°Ύλ λ°©λ²μ λ€μ ꡬνν νμκ° μμ΅λλ€. svelte μ»΄νμΌλ¬μ μν΄ μ£Όμ
λ μ΄λ¬ν λ³μλ μ΅μμ λ¬Έμμ νμλλ©° μ΅μ ESλ‘ λ³νν©λλ€. λ°λΌμ λλΆλΆ typescriptλ‘ μ΄λ¦μ λ°κΎΈμ§ μμμΌ ν©λλ€.
λ°μ λ³μ $: a
λν΄ λ€μκ³Ό κ°μ΄ μμ±ν μ μμ΅λλ€.
$: a = 1
```t
νμ: λ²νΈ
$: a = 1
```ts
$: a = someFunction(b) as Type
λ³ννκΈ° μ μ λ³νν νμκ° μλ μ ν¨ν tsμ λλ€.
κ·Έλ¦¬κ³ $-prefixed store svelte/store get κ³Ό κ°μ μΌλ° ν¨μλ₯Ό μμ±νμ¬ μ μ₯μ μ νμ μΆμΆν μ μμ΅λλ€.
/** injected */
let $store = getType(store)
- svelte μ μ²λ¦¬ λ₯Ό μ¬μ©νμ¬ μ€ν¬λ¦½νΈλ₯Ό jsλ‘ μ μ²λ¦¬νμμμ€.
μ¬κΈ°μ μ°λ¦¬λ κ°λ₯ν ν μ μ λ³νμ μννκΈ° μν΄ μ΅μ λλ λ€μ λ²μ μ ESλ‘ λ³νν μ μμ΅λλ€.- svelteκ° μ μ²λ¦¬λ μμ€λ₯Ό μ»΄νμΌ νλλ‘ ν©λλ€.
- κ·Έλ° λ€μ
injected = true
κ²°κ³Ό λ³μλ₯Ό μΈμ€ν΄μ€ ts μμ€ λλ ts ASTμ μ£Όμ ν λ€μ μμ€ λ§΅κ³Ό ν¨κ» μ¬μ©νμ¬ μ ν νμΈ λ° μλ μμ±μ μ 곡ν μ μμ΅λλ€.
λλ svelte-tsκ° κ·Έλ° μΌμ νλ€κ³ μκ°ν©λλ€. μ’μ μκ°μΈ κ² κ°μ΅λλ€. injected = true
: μ΄ μμ±μ΄ μ νν μ΄λ€ μ½λμ μμ΅λκΉ?
μ€ν¬λ¦½νΈλ λͺ¨λ
<script context="module">
, μΈμ€ν΄μ€ λ° μ½§μμΌ(ν νλ¦Ώ)μ μΈ λΆλΆμ κ°μ§ μ μμ΅λλ€. μ§κΈμ 콧μμΌ λΆλΆμ λͺ¨λ template.jsμ λ€νν μ μμ΅λλ€. κ·Έλ¬λ μ₯κΈ°μ μΌλ‘ ryanatknμ μ κ·Ό λ°©μκ³Ό κ°μ΄ ν νλ¦Ώμ tsx λλ μΌλ° tμ λ°μν μ μμ΅λλ€.
module = true
μΈ λͺ¨λ λ³μλ template.js λ° μΈμ€ν΄μ€μ μ£Όμ λμ§λ§ κ·Έ λ°λλ μλλλ€.μ΄λ° μμΌλ‘ μ°λ¦¬λ typescript ASTμμ λ°μ λ³μ
$: a = 1
λλ $-prefixed storeλ₯Ό μ°Ύλ λ°©λ²μ λ€μ ꡬνν νμκ° μμ΅λλ€. svelte μ»΄νμΌλ¬μ μν΄ μ£Όμ λ μ΄λ¬ν λ³μλ μ΅μμ λ¬Έμμ νμλλ©° μ΅μ ESλ‘ λ³νν©λλ€. λ°λΌμ λλΆλΆ typescriptλ‘ μ΄λ¦μ λ°κΎΈμ§ μμμΌ ν©λλ€.
λ°λΌμ νμΌμ κ°μ .ts
-fileκ³Ό .template
-fileλ‘ λΆν νμκ² μ΅λκΉ? .ts
νλ¨μ 콧μμΌ λΆλΆμ΄ μλ μ΄μ λ 무μμ
λκΉ? μ΄λ κ² νλ©΄ "μ¬μ©νμ§ μλ λ°©λ²" κ²½κ³ λ μ κ±°ν μ μμ΅λλ€. ASTλ₯Ό κ±·μ λ: μ, ν
νλ¦Ώμμ μ°Έμ‘°λλ λͺ¨λ κ²μ΄ μ€ν¬λ¦½νΈμ μ΅μμ μμ€μ΄μ΄μΌ νκΈ° λλ¬Έμ μ¬κΈ°μμ νλͺ
νκ² ASTλ₯Ό λ무 λ§μ΄ μ΄ν΄λ³΄λ κ²μ 건λλΈ μ μλ€κ³ μκ°ν©λλ€.
λ°μ λ³μ
$: a
λν΄ λ€μκ³Ό κ°μ΄ μμ±ν μ μμ΅λλ€.$: a = 1
let a: number $: a = 1
λλ
$: a = someFunction(b) as Type
λ³ννκΈ° μ μ λ³νν νμκ° μλ μ ν¨ν tsμ λλ€.
μ νμ μ μΆν μ μμ΅λκΉ? μλ§λ μ΄κ²μ μ°λ¦¬κ° κ·Έλλ‘ λλ κ²μ΄λ©° μ¬μ©μκ° typescriptλ₯Ό μ¬μ©νλ €λ©΄ let a: number
μ§μ μ μν΄μΌ ν©λλ€. λμμΌλ‘ let a;
μ½μ
ν μ μμ§λ§ any
λ©λλ€.
κ·Έλ¦¬κ³ $-prefixed store svelte/store get κ³Ό κ°μ μΌλ° ν¨μλ₯Ό μμ±νμ¬ μ μ₯μ μ νμ μΆμΆν μ μμ΅λλ€.
/** injected */ let $store = getType(store)
μ, μ’μ κ² κ°μ΅λλ€. λ΄κ° κ°μ§ λ λ€λ₯Έ μμ΄λμ΄λ getter/setterλ₯Ό ꡬμ±νλ κ²μ΄μμ΅λλ€.
λλ svelte-tsκ° κ·Έλ° μΌμ νλ€κ³ μκ°ν©λλ€. μ’μ μκ°μΈ κ² κ°μ΅λλ€.
injected = true
: μ΄ μμ±μ΄ μ νν μ΄λ€ μ½λμ μμ΅λκΉ?
μ»΄νμΌ κ²°κ³Όμλ vars μμ±μ΄ μμ΅λλ€. μ΄ μμ±μ λ€μ μμ±μ κ°μ§ κ°μ²΄μ λ°°μ΄μ
λλ€.
μ΄λ¦, export_name, μ£Όμ
, λͺ¨λ, λ³ν, μ¬ν λΉ, referenced_from_script λ° μ°κΈ° κ°λ₯
μμΈν μ 보λ svelte compile apiλ₯Ό λ³Ό μ μμ΅λλ€.
κ·Έλμ νμΌμ κ°μ .ts νμΌκ³Ό .template νμΌλ‘ λλμκ² μ΅λκΉ? .ts νμΌμ 맨 μλμ 콧μμΌ λΆλΆμ΄ μλ μ΄μ λ 무μμ λκΉ? μ΄λ κ² νλ©΄ "μ¬μ©νμ§ μλ λ°©λ²" κ²½κ³ λ μ κ±°ν μ μμ΅λλ€.
μ΄κ²μ eslint-plugin-svelte3 μ μ κ·Ό λ°©μμ λλ€. λν μΈμ΄λ₯Ό μ§μ νλ μμ±μ΄ μκΈ° λλ¬Έμ ν νλ¦Ώμμ tsλ₯Ό μ§μνκ³ μΆλ€κ³ μκ°νμ΅λλ€.
μ νμ μ μΆν μ μμ΅λκΉ?
μ΄ κ°μ μμ€λ μ ν νμΈ λ° μλ μμ±μ©μΌλ‘λ§ μ¬μ©λκΈ° λλ¬Έμ μ΄κΈ°νλ₯Ό μν΄ μ²« λ²μ§Έ assign λ¬Έμ 볡μ¬νλ κ²λ§μΌλ‘ λ¬μ±ν μ μμ§λ§ λ λ§μ μμ μ΄ νμν κ² κ°μ΅λλ€.
μ νμ μ μΆν μ μμ΅λκΉ? μλ§λ μ΄κ²μ μ°λ¦¬κ° κ·Έλλ‘ λκ³ μ¬μ©μκ° typescriptλ₯Ό μ¬μ©νλ €λ©΄ let: numberλ₯Ό μ§μ μ μν΄μΌ ν©λλ€. λμμΌλ‘ let;μ μ½μ ν μ μμ§λ§ κ·Έλ¬λ©΄ anyκ° λ©λλ€.
μ μμ μΈ μΆλ‘ μ΄ μ°λ¦¬λ₯Ό κ±°κΈ°κΉμ§ λ°λ €λ€μ£Όμ§ λͺ»νλ κ² κ°μ΅λλ€. (μ»΄νμΌ μκ° μΆλ‘ μ μλ―Ένλμ? μλν μ μλμ§ νμ€νμ§ μμ)
let a; // type is "any" initially
$: a = 5;
a; // type is now "number", good
const cb = () => a; // type is implicitly "any", noo
κ·Έ μ΄μ λ μ ν μ½λ νλ¦μμ TypeScriptκ° a
κ° μ¬ν λΉλμ§ μμ κ²μ λ³Ό μ μμ§λ§ μ€μ²©λ ν¨μ λ²μμλ κ·Έλ¬ν 보μ₯μ΄ μκ³ TypeScriptλ μ ν μμ μ± μΈ‘λ©΄μμ μ€λ₯κ° λ°μνλ€λ κ²μ μ μ μκΈ° λλ¬Έμ
λλ€.
λ°λ‘ μ΄κ²μ΄ λ΄ κ±±μ 거리μλ€. κ·Έλ¬λ @jasonlyu123μ΄ μ§μ νλ―μ΄ μ μ( =
λ€μ λͺ¨λ κ²)λ₯Ό 볡μ¬ν μ μμ΅λλ€.
μ μ
$: a = true;
νμ
let a = true;
$: a = true;
κ·Έλ¬λ κ·Έκ²μ΄ λͺ¨λ μν©μμ κ°λ₯νμ§λ λͺ¨λ₯΄κ² μ΅λλ€. νΉν λκ΅°κ°κ° μΈν°νμ΄μ€λ₯Ό ꡬννλ ν° κ°μ²΄μ κ²½μ° μ¬μ©μκ° μμνλ λλ‘ λͺ¨λ κ²μ μΆλ‘ ν μλ μμ΅λλ€. λν λ³΅μ¬ νμ€νκ° κ½€ μ»€μ§ μ μμ΅λλ€. κ·Έλμ μ λ μ¬μ ν "μ¬μ©μκ° μ λ ₯νκ² νλΌ"λ νΈμ λλ€.
λͺ νν ν΄ μ£Όμ μ κ°μ¬ν©λλ€. @jasonlyu123μ΄ λ§ν κ²μ μ€ν΄νμ΅λλ€. κ·Έκ²μ λ΄κ° μΈκΈν μ€μ²©λ ν¨μ λ²μ λ¬Έμ λ₯Ό μμ ν©λλ€.
κ·Έκ²μ΄ μ’μ κΈ°λ³Έ λμμ΄ μλ κ²½μ°μ μκ° μμ΅λκΉ? λλΆλΆμ κ²½μ° μΈμ²΄ 곡νμ μΈ μμ μ μννλ κ²μ²λΌ 보μ΄λ©° λ€λ₯Έ κ²½μ°λ μλμΌλ‘ κ³ μΉ μ μμ΅λλ€. λ€μμ λͺ κ°μ§ μμ λλ€.
μ, λΉμ λ§μ΄ λ§λ κ² κ°μμ. κ°μ₯ μΈμ²΄κ³΅νμ μΈ κ²μ
λλ€. λ΄κ° κ±±μ ν κ²μ μ μΆλ μ νμ΄ μλͺ»λ κ²½μ°μ
λλ€. μλ₯Ό λ€μ΄ μμ±μ μ μλ λ¬Έμμ΄ μ‘°ν©( 'a'
| 'b'
) λμ string
μ
λλ€. κ·Έλ¬λ λΉμ μ΄ λ§νλ―μ΄ μ΄λ¬ν κ²½μ°λ κ·Έλ κ² μΌλ°μ μ΄μ§ μμΌλ©° μ¬μ©μλ μ¬μ ν μλμΌλ‘ μ
λ ₯ν μ μμ΅λλ€.
"νλ₯ν©λλ€. λͺ μμ let κ΅¬λ¬Έμ΄ νλ₯ν©λλ€."μ κ°μ λΆλΆμ΄ μμ΅λλ€. νμ§λ§ μ΄λ κΈ°λ³Έμ μΌλ‘ JS μ§μκ³Ό ν¨κ» μλνμ§ μκ² λ κ²μ λλ€.
첫 λ²μ§Έ λ μ΄λΈμ λ€μκ³Ό κ°μ΄ λ°κΎΈλ©΄ μ΄λ»μ΅λκΉ?
$: a = 1
$: a = 2
λ³μ νλ€
/** injected */
let a = 1
$: a = 2
λλ μ‘°κΈ λ€μ μκ°νκ³ " $:
λ₯Ό let
λ°κΎΈκΈ°"λ³΄λ€ "λ³΅μ¬ μ μ"μ μ΄μ μ μ°Ύμ μ μμ΅λλ€. $:
λ₯Ό let
λ‘ λ°κΎΈλ©΄ μ΄λ€ λ¨μ μ΄ μλμ§ μκ°ν΄ λ³Ό μ μμ΅λκΉ?
μ¬μ©μκ° μμν κ²κ³Ό μ μΆλ μ ν μ°¨μ΄μ λν΄ μλ μ μλ‘ λ³ννλ 리ν©ν λ§ μμ μ μ 곡ν μ μμ΅λκΉ? μ΄ μμ μ 맀λ΄μΌ μ ν λ±μ λ³μλ₯Ό μ¬μ©μμκ² λ©μμ§λ₯Ό νμν©λλ€ μ΄ κ·Έ μΆλ‘ μ ν κ°λ₯ν κ²½μ°μ, λλ 리ν©ν λ§μ.
~ μ μ
$: a = 'const1'
~ νμ
let a : AskUserForType
$: a = 'const1'
μ§μ νμ λΆλΆμ λν΄μλ μκ°νκ³ , λ°°μ΄ μ π
ν, νλͺ
ν μκ°μ
λλ€. $:
λ₯Ό let
μμ ν λ°κΎΈμμμ€. λλ κ·Έκ²μ΄ λμκ² λλ μ΄λ€ μν©λ λͺ¨λ₯Έλ€.
μ°λ¦¬λ λν 첫 λ²μ§Έ λ μ΄λΈλΏλ§ μλλΌ νμ λ³νμ μννλ κ²μ λν΄ μκ°ν μ μμ΅λλ€. κ·Έλ° λ€μ μ¬μ©μμκ² "μ΄ λ³μλ₯Ό λ λ² μ μνμ΅λλ€"λΌλ ννΈλ₯Ό μ£Όλ "μ¬μ μΈν μ μμ" μ€λ₯κ° λ°μν©λλ€. μλλ©΄ μ΄κ²μ΄ μ€ν κ°λ₯νκ³ μ€μκ° μλ μν©μ΄ μμ΅λκΉ?
μ’μ΅λλ€. λΌλ²¨ κ΅μ²΄λ μ€ν¨ν μ΄μ κ° μλ€κ³ μκ°ν©λλ€. ( break $
λ ν λΉ λ΄μμ μλνμ§ μκΈ° λλ¬Έμ λ§μ΅λκΉ?)
λμΌν λ°μ λ³μλ₯Ό λ€μ μ μΈνκΈ° μν΄ Svelteκ° μ΄λ₯Ό νμ©νλ κ²μ²λΌ 보μ΄λ©° μμλλ‘ μμλλ‘ μλν©λλ€. ( μ΄ repl μμ μ°Έμ‘° ) μ λ κ°μΈμ μΌλ‘ μ΄ ν¨ν΄μ μλμ μΌλ‘ μ¬μ©νλ κ²μ λ³΄μ§ μκ³ μ€λ₯λ₯Ό μνμ§λ§ Svelteμ μλ―Έλ‘ μ ν΄μνλ μμμ μμΌλ―λ‘ λ΄ λ§μ λ°μλ€μ΄μ§ λ§μμμ€!
λ€μ μ μΈνλ©΄ μ€μ λ‘ μλνλ ν¨ν΄μ λλ€. λλ μ°λ¦¬κ° κ·Έκ²μ νμ©νλ κ²μ΄ λ λ«λ€κ³ λ§ν κ²μ λλ€ - λλ κΈ°λ³Έμ μΌλ‘ κΊΌμ Έμλ "νμ©λμ§ μμ μ¬μ μΈ"κΈ°λ₯ νλκ·Έλ₯Ό λμ€μ λ§λμμμ€.
@halfnelson μ https://github.com/halfnelson/svelte-type-checker-vscode μμ μμ μ svelte2tsx μ κ·Ό λ°©μμ κΈ°λ°μΌλ‘ μΈμ΄ μλ²λ₯Ό λ§λ€μμ΅λλ€. μ΄ λͺ¨λ κ²μ΄ μ΄λ―Έ μΌλ§λ μ μλνλμ§ μ λ§ μ’μνμ§λ§ tsxλ₯Ό μ€κ° μΆλ ₯μΌλ‘ μ¬μ©νμ§ μλ κ²μ μ νΈν©λλ€. λ무 λλ¦¬κ³ λͺ κ°μ§ μ ν μ¬νμ΄ μμ μ μκΈ° λλ¬Έμ λλ€. νμ§λ§ 그건 μ μ§κ°μΌ λΏμ λλ€. κ·Έλλ svelte2tsx: ꡬ문 λΆμ-μ»΄νμΌλ§-λ³νμ νλ¦μ΄ μνλλ λ°©μκ³Ό κ΄λ²μν ν μ€νΈ μ νκ΅°μμ λ§μ κ²μ μ»μ μ μμ΅λλ€. λ€λ₯Έ μ¬λλ€μ μ½λλ₯Ό tsxλ‘ λ³ννλ μ κ·Ό λ°©μμ μ΄λ»κ² λ³΄κ³ μμ΅λκΉ?
λλ λ€λ₯Έ λ³νμ΄ μ΄λ»κ² μκ²Όλμ§μ λν΄ μκ°νμ΅λλ€. μ¬κΈ° λͺ κ°μ§ μκ° μμ΄μ. νΌλλ°± νμν©λλ€.
μλμ:
<script>
import { createEventDispatcher } from 'svelte';
const dispatch = createEventDispatcher();
export let todo: string;
function doneChange() {
dispatch('doneChange', true);
}
</script>
λ³νλ¨:
export default class Component {
constructor(props: {todo: string; 'on:doneChange': (evt: CustomEvent<boolean>) => void}) {}
}
import { createEventDispatcher } from 'svelte';
const dispatch = createEventDispatcher();
export let todo: string;
function doneChange() {
dispatch('doneChange', !todo.done);
}
μ€λͺ
:
μ΄λ»κ²λ λͺ¨λ props(μ¬μ) λ° λμ€ν¨μΉλ μ΄λ²€νΈ(hard)λ₯Ό κ°μ Έμ νλμ ν° props κ°μ²΄μ μΆκ°ν©λλ€. on:
-prefixλ₯Ό μ¬μ©νμ¬ μ΄λ²€νΈλ₯Ό μΆκ°νλ©΄ μΆ©λμ μ΅μννκ³ μλ μμ± μ μμ λ μ½κ² ꡬνν μ μμ΅λλ€.
(λ€μ μμμ κ΅¬μ± μμ μ μλ κ°κ²°ν¨μ μν΄ μλ΅λ©λλ€.)
μλμ:
<script>const bla = {bla: 'bla'};</script>
<p>{bla.bla}</p>
λ³νλ¨:
const bla = 'bla';
const _bla = bla.bla;
μ€λͺ
:
λ³μμ μ¬λ°λ₯Έ μ¬μ©λ²μ νμΈνκ³ "μ¬μ©νμ§ μμ" κ²½κ³ λ₯Ό μμ κΈ° μν΄ μμμ const
μμλ₯Ό μΆκ°ν©λλ€. κ·Έλ° λ€μ μ¬μ©νμ§ μλ _bla
-warning ...
μλμ:
<script>function bla() {return true;}</script>
<button on:click={bla}>bla</button>
λ³νλ¨:
function bla() {return true;}
const btn = document.createElement('button');
btn.addEventListener('click', bla);
μ€λͺ
:
λ€μ΄ν°λΈ μ΄λ²€νΈ 리μ€λλ₯Ό μ¬μ©νλ κ²½μ° ν΄λΉ μμλ₯Ό μμ±ν ν μ΄λ²€νΈ 리μ€λλ₯Ό μΆκ°ν©λλ€. μ΄λ° μμΌλ‘ μ°λ¦¬λ addEventListener
-typingsλ₯Ό νμ©ν©λλ€. μ¬κΈ°μλ κ±°μ λͺ¨λ 리μ€λμ λν μ€λ²λ‘λκ° μμ΅λλ€. .addEventListener('click', ...);
-> μ΄λ²€νΈλ MouseEvent
μ νμ
λλ€. μ΄ ν¨ν΄μ μμκ° μ΄λ²€νΈκ° μ μλ λ λ€λ₯Έ svelte κ΅¬μ± μμμΈμ§ νμΈν ν μ¬μ©λ©λλ€(λ€μ μμ μ°Έμ‘°). λ¨μ : Svelteκ° μΉμ΄ μλ νκ²½(Nativescript)μμ μ¬μ©λλ€λ©΄?
μλμ:
<script>
import Bla from './bla.svelte';
function blub() {}
</script>
<Bla bla={1} on:blubb={blub} />
λ³νλ¨:
import Bla from './bla.svelte';
function blub() {}
const bla = new Bla({bla: 1, 'on:blubb': blub});
μ€λͺ
:
λͺ¨λ κ΅¬μ± μμμλ ν΄λμ€ μ μκ° μμΌλ―λ‘ ν΄λΉ ν΄λμ€λ₯Ό μΈμ€ν΄μ€ννλ©΄ λ©λλ€.
μλμ:
{#each todos as todo,i (todo.id)}
<p>{todo.text}</p>
{/each}
λ³νλ¨:
todos.forEach((todo, i) => {
const _todoText = todo.text;
});
μ€λͺ
:
forEach
λ λ³ννκΈ° κ°μ₯ μ¬μ΄ κ² κ°μ΅λλ€. λ΄λΆμμλ λ€λ₯Έ λͺ¨λ κΈ°λ₯μ μ¬κ·μ μΌλ‘ μ μ©ν μ μμ΅λλ€.
μλμ:
{#if x === 1}
<p>if</p>
{else if x === 2}
<p>elseif</p>
{else}
<p>else</p>
{/if}
λ³νλ¨:
if (x === 1) {
} else if (x === 2) {
} else {
}
μ€λͺ
:
κ½€ μλͺ
ν©λλ€.
svelte:x
ꡬμ±νuse:action
, transition
, bind
μ κ°μ λ€λ₯Έ μμ/κ΅¬μ± μμ μ§μλ¬Έμ¬λ¬λΆμ μ΄λ»κ² μκ°νμΈμ? μ΄λ¬ν λ³νμ΄ μ€ν κ°λ₯νκ³ μ€ν κ°λ₯νκ°? λ΄κ° λ λμΉ κ±° μλ?
κ΅¬μ± μμ ν΄λμ€μ λν΄ svelteμ μ체 SvelteComponent ν΄λμ€λ₯Ό νμ₯νλ κ²μ μ νΈνμ§λ§ μ΄κ²μ΄ ꡬννκΈ° μ¬μ΄μ§ μ¬λΆλ λͺ¨λ₯΄κ² μ΅λλ€.
import { SvelteComponent } from "svelte";
export default class Component extends SvelteComponent {
constructor(options: ComponentOption<{ propA: string }>) {
super(options)
}
$on(
event: 'input',
callback: (event: CustomEvent<string>) => void
): () => void
$on(
event: 'click',
callback: (event: CustomEvent<number>) => void
): () => void
$on(
event: string,
callback: (event: CustomEvent<any>) => void
): () => void {
return () => { }
}
}
μ΄λ¬ν μΈν°νμ΄μ€λ₯Ό κ°μ Έμ΅λλ€.
interface ComponentOption<TProps, TSlot = undefined> {
target: Element,
props: TProps | SlotProp<TSlot>
}
type SlotOption<T> = [unknown, unknown, unknown]
interface SlotProp<TSlot> {
$$slots: Record<string, SlotOption<TSlot>>
}
$$slots
λ μλ§λ svelteμ λ΄λΆ APIμΌ κ²μ
λλ€. μ»΄νμΌλ μ½λμμ κ°μ Έμμ΅λλ€.
κ·Έ μ΄μ λ λ°λλΌ ts/jsλ₯Ό μ
λ ₯νλ λ° μ¬μ©ν μ μλ .d.ts
λ₯Ό λ΄λ³΄λ΄λ λ° μ¬μ©ν μ μκΈ° λλ¬Έμ
λλ€.
λν μΆ©λΆν μ΄μνμ§λ§ μ΄κ²μ μ ν¨ν ꡬ문μ΄κΈ° λλ¬Έμ:
<script>
onMount(() => {
new Component({
target: document.getElementById('foo')
})
})
</script>
Transition
, use:action
λ° κΈ°ν μμ μ§μλ¬Έμ λ€μκ³Ό κ°μ΄ λ³νν μ μμ΅λλ€.
fade(null as Element, { } /* option in attribute*/)
{#await promise}
<p>...waiting</p>
{:then number}
<p>The number is {number}</p>
{:catch error}
<p style="color: red">{error.message}</p>
{/await}
μκ²
promise.then(number => { number })
promise.catch(error => { error.message })
<script>
let a;
</script>
<div bind:this={a}><div>
μκ²
let a;
onMount(() => {
a = document.createElement('div')
})
μ¦μ μ¬μ©ν μ μκΈ° λλ¬Έμ μ½λ°±μΌλ‘ λνν΄μΌ ν¨
μ΄κ±΄ μ’ κΉλ€λ‘λ€
<script context="module">
let count = 1;
</script>
<script>
import _ from "lodash"
let b;
</script>
λ‘ μ»΄νμΌν΄μΌ ν©λλ€.
import _ from "lodash"
let count = 1;
// any block is ok
{
let b;
{
λν μ¬μ©μκ° λͺ¨λμ jsμ μΈμ€ν΄μ€μ tμ κ°μ΄ λ κ°μ μ€ν¬λ¦½νΈμμ λ€λ₯Έ μΈμ΄λ₯Ό μ¬μ©νλ€λ©΄ μ΄λ»κ² λ κΉμ?
μ’μ, μ’μ. "ν
νλ¦Ώμμ λ³μ μ¬μ©"μ κ²½μ° const _bla = bla.bla;
λ "μ¬μ©νμ§ μλ var" μ§λ¨μ κ±Έλ¬λΌ νμ μμ΄ TypeScriptκ° κ²μ¬λ₯Ό μννλλ‘ νλ bla.bla;
μ μμ΅λλ€. λλ μ΄κ²μ΄ μλνμ§ μλ μ½λ μΌμ΄μ€λ₯Ό μκ°ν μ μμ΅λλ€.
Vue ν μ€ μΌλΆλ typescript μΈμ΄ μλ² νλ¬κ·ΈμΈμ νμ μ€μ λλ€ - https://github.com/znck/vue-developer-experience
μ€λλ μ΄λ¬ν κ²½νμ΄ TypeScript μΈλΆμ λ΄λΆ(veturκ° νλ κ²μ²λΌ μ체 tsserver-ish λ° html/css/etc LSPλ₯Ό μ€ννκΈ° λλ¬Έμ) λλ TypeScript λ΄λΆμμ μΈλΆλ‘ μμ νλ €κ³ μλνλ κ²μ ν₯λ―Έλ‘μ΄ κ°λμ λλ€( μλ₯Ό λ€μ΄ μ΄ μ μ) .vue νμΌμ΄ λΉ TS μ½λλ₯Ό λ§μ€νΉνμ¬ ν©λ²μ μΈ TypeScriptλΌκ³ ν¨κ³Όμ μΌλ‘ λ―Ώλλ‘ TSServerλ₯Ό μ‘°μνλ κ²½μ°.
μ€λλ μλ νμ΄νμ€ν¬λ¦½νΈμ ν¨μΉκ° μμ΄μΌλ§ μλν μ μμ§λ§
ν₯λ―Έλ‘μ΄ μ κ·Ό λ°©μμ λλ€. κ·Έλ¬λ html λλ cssμ λν μλ μμ±κ³Ό κ°μ κΈ°λ₯μ μ΄λ»κ² μλν κΉμ? μ΄ λͺ¨λ κ²μ "μλμΌλ‘" ꡬννκ³ κΈ°λ³Έ μΈμ΄ μλ²μ λ μ΄μ μμ‘΄νμ§ μμμΌ ν©λκΉ, μλλ©΄ μ κ° λμΉκ³ μλ κ²μ΄ μμ΅λκΉ?
ν λ² μ΄μ νλ κ²μ μ₯μ μ΄ μμ΅λκΉ?
JS/TS μ§μ μ΄μΈμ λͺ¨λ κ²μ λ³λμ vscode LSPμμ μ²λ¦¬λ©λλ€. μ΄ νμ₯μ΄ JS/TSμ λν λͺ¨λ μ§μμ μ κ±°νκ³ λλ¨Έμ§λ§ μ²λ¦¬νλ©΄ typescript νλ¬κ·ΈμΈμ΄ λλ¨Έμ§λ₯Ό μ²λ¦¬νλ κ²κ³Ό κ°μ΅λλ€.
μ΄ κ²½μ° "무λ£"λ‘ λͺ¨λ TS λꡬλ₯Ό μ»μ μ μλ€λ μ΄μ μ΄ μμ΅λλ€. κΈ°νΈ, νμΌ λ§€ν λ±μΌλ‘ μ΄λν©λλ€.
λλ μλ§λ κ·Έκ²μ κΆμ₯νμ§ μμ κ²μ λλ€. μ€λλ μλ μ§μ μ₯λ²½μ΄ μλΉν λμ TypeScriptμ ν¬ν¬λ ν¨μΉκ° νμν©λλ€. κ·Έλ¦¬κ³ TypeScript νμ μ»΄νμΌλ¬ νλ¬κ·ΈμΈμ΄ κ·Έλ° μ’ λ₯μ μ‘μΈμ€ κΆνμ κ°μ§ μ μλμ§/μΈμ κΉμ§ νμ ν μ μμ΅λλ€.
ν΅μ°°λ ₯ μ£Όμ μ κ°μ¬ν©λλ€. λλ μ°λ¦¬κ° νμ¬μ μ κ·Ό λ°©μμ κ°μ§κ³ μλ€κ³ λ§ν κ²μ λλ€(outside-in).
μμμ λ Όμν "κ°μ ts νμΌ λ§λ€κΈ°" μ κ·Ό λ°©μμ μ¬μ©νλ κ²½μ° μ΄λ₯Ό ꡬννκ³ μμ€ λ§€νμ μ μ§νλ €λ©΄ μ΄λ»κ² ν΄μΌ ν©λκΉ?
μ€λλ μλ "μ€ν¬λ¦½νΈ μμ μ°ΎκΈ°, μ€ν¬λ¦½νΈ λ μ°ΎκΈ°", "μ€ν¬λ¦½νΈ λΆλΆ μΆμΆ" λ° "κ°λλ€λ νμΌμ μ€νμ
μ μμΉμ μΆκ°" 맀νμ μν΄ κ°λ¨νκΈ° λλ¬Έμ μ½μ΅λλ€.
μ§κΈ μ€ν¬λ¦½νΈ λΆλΆμ λ³κ²½νλ©΄ λ μ κ΅ν 맀νμ΄ νμν©λλ€.
μλμ
<script lang="typescript">
let a = 1;
$: b = a + 1;
</script>
<p>{b}</p>
맀νλ¨:
export default class Bla extends SvelteComponent { ... } // <- prepended, no mapping needed as far as I know
let a = 1; // <- untouched
let b = a + 1; // <- modified in place. How to map? Do we need to adjust all following code positions now to have a new offset/position?
b; // <- appended. Needs mapping from {b} inside svelte-mustache-tag to here. We can get the original position from the html ast which is part of the output of svelte.parse
μ΄λ€ μμ΄λμ΄? μμ€ λ§€ν μμ μ ν λ²λ ν΄λ³Έ μ μ΄ μμ΅λλ€.
Vue ν μ€ μΌλΆλ typescript μΈμ΄ μλ² νλ¬κ·ΈμΈμ νμ μ€μ λλ€ - https://github.com/znck/vue-developer-experience
μ€λλ μ΄λ¬ν κ²½νμ΄ TypeScript μΈλΆμ λ΄λΆ(veturκ° νλ κ²μ²λΌ μ체 tsserver-ish λ° html/css/etc LSPλ₯Ό μ€ννκΈ° λλ¬Έμ) λλ TypeScript λ΄λΆμμ μΈλΆλ‘ μμ νλ €κ³ μλνλ κ²μ ν₯λ―Έλ‘μ΄ κ°λμ λλ€( μλ₯Ό λ€μ΄ μ΄ μ μ) .vue νμΌμ΄ λΉ TS μ½λλ₯Ό λ§μ€νΉνμ¬ ν©λ²μ μΈ TypeScriptλΌκ³ ν¨κ³Όμ μΌλ‘ λ―Ώλλ‘ TSServerλ₯Ό μ‘°μνλ κ²½μ°.
μ€λλ μλ νμ΄νμ€ν¬λ¦½νΈμ ν¨μΉκ° μμ΄μΌλ§ μλν μ μμ§λ§
μ κ±° TypeScript ν¨μΉ PRμ΄ λ³ν©λ©λλ€.
https://github.com/znck/vue-developer-experience/pull/7
κ·Έλμ ... @orta μ΄κ²μ "λΉκ³΅μ"μ κ΄ν λ¨μ μ΄ λ μ΄μ μλμ μλ―Έν©λκΉ? μλλ©΄ ν¨μΉκ° μλλΌ package.json
ꡬμ±μ ν΅ν΄ μμμΌ νκ³ μΈμ λ μ§ λ³κ²½ν μ μλ μΌμ’
μ λΉκ³΅μμ μ
λκΉ?
λ λ€λ₯Έ μ£Όμ : νμ¬λ‘μλ μ΄ μ΅μ μ μ κ·Ό λ°©λ²μ λν΄ μ¬μ ν λ
Όμ μ€μ΄λ©°, κ²°μ νλ©΄ ꡬννλ λ° μκ°μ΄ 걸릴 κ²μ
λλ€. κ·Έλμ svelte2tsx
μ μ¬μ©νλ κ²μ λν΄ μ΄λ»κ² μκ°νμλκΉ? μ΄κ²μ μμ£Ό μ’μ μΆλ°μ μν μ ν μ μκ³ , μ°λ¦¬λ μ΄κ²μ λν΄ λͺ κ°μ§ ν
μ€νΈλ₯Ό ν μ μκ³ , κ·Έλ° λ€μ μ°λ¦¬λ "μ΄κ²μ μ€μ λ‘ μ μλν©λλ€. λ³κ²½νμ§ λ§μ"λΌκ³ νμΈνκ±°λ μ μ§μ μΌλ‘ λ§μ΄κ·Έλ μ΄μ
ν μ μμ΅λλ€. μκ°?
μ, TSμ κΈ°λ³Έ νλ¦μ νΈμ§νλ λ κ°μ§ λ°©λ²μ΄ μμμ΅λλ€. μ¬μ ν TypeScriptλ₯Ό ν¨μΉνκ³ μμ§λ§ λ°νμ μλ TSμ κΈ°λ₯μ κ΅μ²΄ν©λλ€. νλ¬κ·ΈμΈ κ°λ°μ΄ μμ§ λ‘λ맡μ ν¬ν¨λμ§ μμ μ μ κ³ λ €νλ©΄ ν©λ¦¬μ μ΄λΌκ³ μκ°ν©λλ€.
κ·Έλλ μΆμ²νλ€λ©΄ λμ ν΅μ¬ νμμ΄ λ κ²μ λλ€ ;)
svelte2ts
μλνλ κ²μ νμμ μν μ’μ λ°©λ²μΈ κ² κ°μ΅λλ€!
μ΄ vscode νλ¬κ·ΈμΈμ μ¬μ©νμ¬ svelte2tsxκ° μ΄λ€ κ²μΈμ§ νμΈν μ μμ΅λλ€. https://marketplace.visualstudio.com/items?itemName=halfnelson.svelte-type-checker-vscode μ Svelte Beta(svelte λ² νλ₯Ό λΉνμ±ννλ©΄ κ°μ₯ μ μλ λ λ² ννΈλ₯Ό μ»μ§ μλλ‘ typescript μ΅μ :) )
svelte2tsxλ₯Ό μ¬μ©νμ§ μλλΌλ typescriptλ₯Ό λ§μ‘±μ€λ½κ² μ μ§νλ €λ©΄ svelteμ JS μ½λμ μ΄λ€ λ³νμ μνν΄μΌ νλμ§μ λν λ Όμκ° μμ΅λλ€. svelte2tsx 컀λ²μ λν ν μ€νΈ μ€μνΈκ° μλλΌμ΄ ν νλ¦Ώμ λ§λ€ μ νμν λ³κ²½λΏλ§ μλλΌ, λΉμ μ μ€ν¬λ¦½νΈ νκ·Ένλ €λ κ²½μ° μ€ν¬λ¦½νΈ νκ·Έλ, μ μΌν ν΄κ²°μ± μ μ’μ μΆλ°μ μ΄ λ μ μμ΅λλ€ https://github.com/halfnelson /svelte2tsx/tree/master/test/svelte2tsx/samples
htmlx2jsx
λ ν
νλ¦Ώ λ³κ²½ ν
μ€νΈ(htmlx) ν΄λμ΄κ³ svelte2tsx
μνμ svelteμ js ꡬ문 λ¨μ©μ νμν svelte νΉμ λ³κ²½ μ¬νμ
λλ€. :)
https://github.com/pivaszbs/svelte-autoimport 리ν¬μ§ν 리λ₯Ό λ°©κΈ λ°κ²¬νμ΅λλ€. svelte2tsx
λ
립μ μΈ μΈν
리μΌμ€ κ°μ Έμ€κΈ°λ₯Ό μνλμ§ μ΄ν΄λ³Ό κ°μΉκ° μμ΅λλ€.
μ΄ νλ‘μ νΈμ μ λ°μ μΈ λ°©ν₯μ΄ λλΆλΆ μ 리λκ³ κΉλνκ² μ§νλλ μ§μ μ μλ€κ³ μκ°ν©λλ€. νΌλλ°±μ μν΄ μΌμ£ΌμΌμ μ£Όκ² μ§λ§ μ§κΈμ ꡬ쑰μ μΌλ‘ λ€μ μκ°ν νμκ° μμ΄ λ§€μ° κΈ°μ©λλ€.
μ무λ μ΄μλ₯Ό μ κΈ°νμ§ μλ κ² κ°μΌλ μ΄λ§ λ§μΉκ² μ΅λλ€. ν λ‘ ν΄ μ£Όμ μ κ°μ¬ν©λλ€!
κ°μ₯ μ μ©ν λκΈ
ν° νμΈ! κ³μν΄μ μΌλΆ PRμ ν΅ν΄ μ½λμ μΌλΆλ₯Ό μ¬κ΅¬μ±νκ³ μ€λΉνμ¬ κ°λ³ νλͺ©μ λν μμ μ λ³λ ¬νν μ μμ΅λλ€.