Language-tools: μ–Έμ–΄ μ„œλ²„μ˜ μ ‘κ·Ό 방식 κ°œμš”

에 λ§Œλ“  2020λ…„ 03μ›” 24일  Β·  37μ½”λ©˜νŠΈ  Β·  좜처: sveltejs/language-tools

이 μŠ€λ ˆλ“œλŠ” svelte 파일용 μ–Έμ–΄ μ„œλ²„λ₯Ό κ΅¬ν˜„ν•˜λŠ” 방법에 λŒ€ν•œ μ ‘κ·Ό λ°©μ‹μ˜ κ°œμš”λ₯Ό μœ„ν•œ κ²ƒμž…λ‹ˆλ‹€. μ„ ν˜Έν•˜λŠ” μ†”λ£¨μ…˜μ— λŒ€ν•œ λ…Όμ˜λ„ μ—¬κΈ°μ—μ„œ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ–Έμ–΄ μ„œλ²„μ˜ ν˜„μž¬ μƒνƒœ

ν˜„μž¬ ꡬ문 κ°•μ‘° 및 일뢀 κΈ°λ³Έ μžλ™ 완성은 svelte νŒŒμΌμ— λŒ€ν•΄ μž‘λ™ν•©λ‹ˆλ‹€.
κ·ΈλŸ¬λ‚˜ ν’λΆ€ν•œ μΈν…”λ¦¬μ„ΌμŠ€κ°€ μ œκ³΅λ˜μ§€ μ•Šκ³  μž‘μ—… κ³΅κ°„μ˜ λͺ¨λ“  typescript νŒŒμΌμ— λŒ€ν•΄ μ•Œμ§€ λͺ»ν•˜λ©° svelte ꡬ성 μš”μ†Œμ— λŒ€ν•œ μœ ν˜• 정보도 μ—†μŠ΅λ‹ˆλ‹€.
νŠΉμˆ˜ν•œ svelte ꡬ문이 κ°•μ‘° ν‘œμ‹œλ˜μ§€λ§Œ intellisenseκ°€ μž‘λ™ν•˜μ§€ μ•ŠλŠ” html 뢀뢄도 λ§ˆμ°¬κ°€μ§€μž…λ‹ˆλ‹€. 기본적으둜 νŠΉλ³„ν•œ ꡬ문을 μ•Œμ§€ λͺ»ν•˜λŠ” vscode-html-languageserviceκ°€ μ‚¬μš©λ©λ‹ˆλ‹€.
ν˜„μž¬ μ–Έμ–΄ μ„œλ²„λŠ” νŒŒμΌμ„ ꡬ문 λΆ„μ„ν•˜κ³  "이 img νƒœκ·Έμ— alt 속성이 μ—†μŒ"κ³Ό 같은 진단을 μ–»κΈ° μœ„ν•΄ svelte 컴파일러λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
보닀 심측적인 뢄석: λŒ“κΈ€

κΈ°μ‘΄ μ ‘κ·Ό 방식/μ†”λ£¨μ…˜

λ©΄μ±… μ‘°ν•­: μ €λŠ” κΈ°μ‘΄ μ†”λ£¨μ…˜μ˜ μž‘μ„±μžκ°€ μ•„λ‹ˆμ§€λ§Œ μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€. 일뢀 정보가 잘λͺ»λ˜μ—ˆκ±°λ‚˜ μΆ©λΆ„νžˆ μƒμ„Έν•˜μ§€ μ•Šκ±°λ‚˜ μ†”λ£¨μ…˜μ΄ λˆ„λ½λœ 경우 μ–Έμ œλ“ μ§€ μ˜κ²¬μ„ λ³΄λ‚΄μ£Όμ‹œλ©΄ μˆ˜μ •ν•˜κ² μŠ΅λ‹ˆλ‹€.

https://github.com/alexprey/sveltedoc-parser

htmlparser2 λ₯Ό μ‚¬μš©ν•˜μ—¬
espree λ₯Ό μ‚¬μš©ν•˜μ—¬
κ²°κ³Όλ₯Ό JSON ν˜•μ‹μœΌλ‘œ μ œκ³΅ν•©λ‹ˆλ‹€.

https://github.com/ArdenIvanov/svelte-intellisense λŠ” 이λ₯Ό μ‚¬μš©ν•˜μ—¬ svelte νŒŒμΌμ„ ꡬ문 λΆ„μ„ν•©λ‹ˆλ‹€. κ²°κ³Όλ₯Ό μ‚¬μš©ν•˜μ—¬ λͺ‡ 가지 μΆ”κ°€ λ™μž‘μ„ μ²¨λΆ€ν•©λ‹ˆλ‹€.

이것은 μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμ„œλ₯Ό μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— typescriptμ—μ„œλŠ” μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

https://github.com/halfnelson/svelte2tsx

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λ₯Ό μ‚¬μš©ν•˜λŠ” 또 λ‹€λ₯Έ μ–Έμ–΄ μ„œλ²„μž…λ‹ˆλ‹€.

https://github.com/marcus-sa/svelte-ts

κ΅¬ν˜„μžμ˜ 의견 μ—μ„œ κ°€μ Έμ˜¨ μ„€λͺ… :

컴파일러:

  1. μ»΄νŒŒμΌλŸ¬λŠ” λͺ¨λ“  μ†ŒμŠ€ νŒŒμΌμ„ μ½μŠ΅λ‹ˆλ‹€.
  2. 슀크립트 νƒœκ·Έμ˜ λ‚΄μš©μ„ μ œμ™Έν•œ λͺ¨λ“  것이 λ²„λ €μ§‘λ‹ˆλ‹€.
  3. 슀크립트 μ†ŒμŠ€ μ½”λ“œλŠ” μœ νš¨ν•œ JS 및 μ„ μ–Έ 파일둜 μ»΄νŒŒμΌλ©λ‹ˆλ‹€.
  4. 슀크립트 νƒœκ·Έμ˜ TS μ†ŒμŠ€λ₯Ό 컴파일된 JS둜 λŒ€μ²΄ν•˜λŠ” 2λ‹¨κ³„λ‘œ λ‹€μ‹œ μ΄λ™ν•©λ‹ˆλ‹€.
  5. Svelte μ»΄νŒŒμΌλŸ¬λŠ” 전체 μ†ŒμŠ€ νŒŒμΌμ„ μ»΄νŒŒμΌν•©λ‹ˆλ‹€.
  6. μœ„ λ‹¨κ³„μ˜ 좜λ ₯ μ»΄νŒŒμΌμ€ μΊμ‹œλ˜μ–΄ HTML ASTκ°€ μœ ν˜• κ²€μ‚¬κΈ°μ—μ„œ μ‚¬μš©λ©λ‹ˆλ‹€.

Svelte 슀크립트 λ‚΄λΆ€μ—μ„œ 내보낸 λ³€μˆ˜μ™€ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜κ³  λŸ°νƒ€μž„ SvelteComponentλ₯Ό ν™•μž₯ν•˜λŠ” 클래슀λ₯Ό ν¬ν•¨ν•˜λŠ” μ„ μ–Έ 파일둜 μƒμ„±ν•©λ‹ˆλ‹€.

μœ ν˜• 검사기:

  1. μœ ν˜• κ²€μ‚¬κΈ°λŠ” μΊμ‹œλœ ASTμ—μ„œ λͺ¨λ“  ꡬ성 μš”μ†Œλ₯Ό μ°ΎμŠ΅λ‹ˆλ‹€.
  2. ν…œν”Œλ¦Ώμ˜ λͺ¨λ“  ꡬ성 μš”μ†Œκ°€ SvelteComponentλ₯Ό ν™•μž₯ν•˜λŠ” μœ νš¨ν•œ ν΄λž˜μŠ€μΈμ§€ ν™•μΈν•©λ‹ˆλ‹€.
  3. μœ νš¨ν•œ μ„ μ–Έ, 속성 등을 ν™•μΈν•©λ‹ˆλ‹€.

기타 μ ‘κ·Ό 방식

이 μŠ€λ ˆλ“œμ˜ λŒ“κΈ€μ„ μ°Έμ‘°ν•˜μ„Έμš”.

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

큰 확인! κ³„μ†ν•΄μ„œ 일뢀 PR을 톡해 μ½”λ“œμ˜ 일뢀λ₯Ό μž¬κ΅¬μ„±ν•˜κ³  μ€€λΉ„ν•˜μ—¬ κ°œλ³„ ν•­λͺ©μ— λŒ€ν•œ μž‘μ—…μ„ 병렬화할 수 μžˆμŠ΅λ‹ˆλ‹€.

λͺ¨λ“  37 λŒ“κΈ€

κ·Έλž˜μ„œ κ·Έλ“€ 쀑 λˆ„κ΅¬λ„ 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 λͺ¨λ“ˆμ„ 찾지 μ•ŠκΈ° λ•Œλ¬Έμ— λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€(λ‹€μŒ μ„Ήμ…˜ μ°Έμ‘°).

ν˜„μž¬μ˜ 단점과 κ°œμ„ μ„ μœ„ν•œ 아이디어

  • script νƒœκ·ΈλŠ” typescript μ–Έμ–΄ μ„œλΉ„μŠ€μ— μžˆλŠ” κ·ΈλŒ€λ‘œ λΆ€μ—¬λ˜κΈ° λ•Œλ¬Έμ— νŠΉμˆ˜ν•œ svelte ꡬ문($)을 μ²˜λ¦¬ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
  • typescript μ–Έμ–΄ μ„œλΉ„μŠ€λŠ” ν˜„μž¬ μ—΄λ € μžˆλŠ” svelte νŒŒμΌμ—μ„œ μ°Έμ‘°λ˜λŠ” λ‹€λ₯Έ νŒŒμΌμ„ μ‘°νšŒν•˜λ €κ³  ν•©λ‹ˆλ‹€. .ts / .js 파일의 경우 μž‘λ™ν•˜μ§€λ§Œ .svelte 파일의 경우 μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이유: typescript μ–Έμ–΄ μ„œλΉ„μŠ€λŠ” .svelte 끝을 μ•Œμ§€ λͺ»ν•˜λ―€λ‘œ 일반 typescript 파일이라고 κ°€μ •ν•˜κ³  ../Component.svelte.ts 와 같은 νŒŒμΌμ„ κ²€μƒ‰ν•˜λŠ” 것은 잘λͺ»λœ κ²ƒμž…λ‹ˆλ‹€. 이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄, μš°λ¦¬λŠ” 방법을 κ΅¬ν˜„ν•΄μ•Ό resolveModuleNames μ—μ„œ LanguageServiceHost λͺ¨λ“  λΌμš°νŒ… .svelte.ts 에 파일 쑰회 .svelte . 그러면 μ–Έμ–΄ μ„œλΉ„μŠ€κ°€ λͺ¨λ“  svelte νŒŒμΌμ„ νƒμƒ‰ν•©λ‹ˆλ‹€. μ°Έκ³ : 이λ₯Ό κ΅¬ν˜„ν•˜λ €λ©΄ λ‹€μŒ 버그도 μˆ˜μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€. 이제 typescript μ–Έμ–΄ μ„œλΉ„μŠ€κ°€ λͺ¨λ“  νŒŒμΌμ„ κ²€μƒ‰ν•˜λ―€λ‘œ createDocument μ—μ„œ TypescriptPlugin createDocument λ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 이것은 ν˜„μž¬ script νƒœκ·Έ μ•ˆμ˜ λ‚΄μš©λΏλ§Œ μ•„λ‹ˆλΌ 전체 λ¬Έμ„œλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. 이것은 openDocument λž˜ν•‘ν•˜μ§€ μ•ŠλŠ” wrapFragmentPlugin λ‚΄λΆ€μ˜ λ²„κ·Έμž…λ‹ˆλ‹€.
  • svelte component import 이름을 ν΄λ¦­ν•˜μ—¬ "go to svelte file"κ³Ό 같은 κ³ κΈ‰ κΈ°λŠ₯을 κ΅¬ν˜„ν•˜κ±°λ‚˜ typescriptλ₯Ό $ 기호둜 λ§Œλ“€λ €λ©΄ μ „μ²˜λ¦¬κΈ°λ₯Ό μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€. 이 μ „μ²˜λ¦¬κΈ°λŠ” μ–΄λ–€ μ‹μœΌλ‘œλ“  typescript에 λˆ„λ½λœ 뢀뢄을 μΆ”κ°€ν•©λ‹ˆλ‹€. μ΄μƒμ μœΌλ‘œλŠ” λͺ¨λ“  μΆ”κ°€ ν•­λͺ©μ„ κΈ°μ‘΄ μ½”λ“œ μœ„μ— μΆ”κ°€ν•  수 μžˆμœΌλ―€λ‘œ μœ„μΉ˜ 맀핑이 μ˜€ν”„μ…‹μœΌλ‘œ μœ„μΉ˜λ₯Ό λ§€ν•‘ν•˜λŠ” κ²ƒλ§ŒνΌ μ‰½μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 이것은 또 λ‹€λ₯Έ 문제λ₯Ό μ œκΈ°ν•©λ‹ˆλ‹€. 이제 두 개의 μœ„μΉ˜ 맀핑이 μžˆμŠ΅λ‹ˆλ‹€. ν•˜λ‚˜λŠ” 전체 svelte νŒŒμΌμ—μ„œ 슀크립트 νƒœκ·Έλ‘œ, λ‹€λ₯Έ ν•˜λ‚˜λŠ” 슀크립트 νƒœκ·Έμ—μ„œ μ „μ²˜λ¦¬λœ typescript μ½”λ“œλ‘œμž…λ‹ˆλ‹€. 이 μ‹œμ μ—μ„œ 이것이 갈 길인지 μ•„λ‹ˆλ©΄ 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 의 κ°€λ³€ μ ‘κ·Ό 방식을 κ²°ν•©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  1. svelte μ „μ²˜λ¦¬ λ₯Ό μ‚¬μš©ν•˜μ—¬ 슀크립트λ₯Ό js둜 μ „μ²˜λ¦¬ν•˜μ‹­μ‹œμ˜€.
    μ—¬κΈ°μ„œ μš°λ¦¬λŠ” κ°€λŠ₯ν•œ ν•œ 적은 λ³€ν˜•μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ μ΅œμ‹  λ˜λŠ” λ‹€μŒ λ²„μ „μ˜ ES둜 λ³€ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  2. svelteκ°€ μ „μ²˜λ¦¬λœ μ†ŒμŠ€λ₯Ό 컴파일 ν•˜λ„λ‘ ν•©λ‹ˆλ‹€.
  3. 그런 λ‹€μŒ 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)
  1. svelte μ „μ²˜λ¦¬ λ₯Ό μ‚¬μš©ν•˜μ—¬ 슀크립트λ₯Ό js둜 μ „μ²˜λ¦¬ν•˜μ‹­μ‹œμ˜€.
    μ—¬κΈ°μ„œ μš°λ¦¬λŠ” κ°€λŠ₯ν•œ ν•œ 적은 λ³€ν˜•μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ μ΅œμ‹  λ˜λŠ” λ‹€μŒ λ²„μ „μ˜ ES둜 λ³€ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  2. svelteκ°€ μ „μ²˜λ¦¬λœ μ†ŒμŠ€λ₯Ό 컴파일 ν•˜λ„λ‘ ν•©λ‹ˆλ‹€.
  3. 그런 λ‹€μŒ 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 독립적인 μΈν…”λ¦¬μ„ΌμŠ€ κ°€μ Έμ˜€κΈ°λ₯Ό μ›ν•˜λŠ”μ§€ μ‚΄νŽ΄λ³Ό κ°€μΉ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€.

이 ν”„λ‘œμ νŠΈμ˜ μ „λ°˜μ μΈ λ°©ν–₯이 λŒ€λΆ€λΆ„ μ •λ¦¬λ˜κ³  κΉ”λ”ν•˜κ²Œ μ§„ν–‰λ˜λŠ” 지점에 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. ν”Όλ“œλ°±μ„ μœ„ν•΄ 일주일을 μ£Όκ² μ§€λ§Œ μ§€κΈˆμ€ ꡬ쑰적으둜 λ‹€μ‹œ 생각할 ν•„μš”κ°€ μ—†μ–΄ 맀우 κΈ°μ©λ‹ˆλ‹€.

아무도 이의λ₯Ό μ œκΈ°ν•˜μ§€ μ•ŠλŠ” 것 κ°™μœΌλ‹ˆ 이만 λ§ˆμΉ˜κ² μŠ΅λ‹ˆλ‹€. ν† λ‘ ν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€!

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰