ν™ˆ Typescript Module Resolution
포슀트
μ·¨μ†Œ

Typescript Module Resolution

πŸ’» Module Resolution μ΄λž€?

Module Resolution (λͺ¨λ“ˆ 해석)은 TypeScript μ»΄νŒŒμΌλŸ¬κ°€ import λ¬Έμ—μ„œ 어떀것을 μ°Έμ‘°ν•˜λŠ”μ§€ μ•Œμ•„λ‚΄κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

πŸ’» Module Resolution Strategy

μž„ν¬νŠΈν•œ λͺ¨λ“ˆμ˜ 경둜의 μœ ν˜•(μƒλŒ€μ  λͺ¨λ“ˆ VS λΉ„-μƒλŒ€μ  λͺ¨λ“ˆ) 따라 μ»΄νŒŒμΌλŸ¬κ°€ λͺ¨λ“ˆμ„ μ°ΎλŠ” 방식이 λ‹¬λΌμ§‘λ‹ˆλ‹€. TypeScript μ»΄νŒŒμΌλŸ¬κ°€ λͺ¨λ“ˆμ„ μ°ΎλŠ” 방식을 Module Resolution Strategy 라고 ν•˜λ©°, 크기 Classic κ³Ό Node 방식, 두가지가 μžˆμŠ΅λ‹ˆλ‹€.

πŸ–Š μƒλŒ€μ  λͺ¨λ“ˆ(relative) VS λΉ„-μƒλŒ€μ  λͺ¨λ“ˆ(non-relative)

μƒλŒ€μ  λͺ¨λ“ˆμ€ /, ./, ../ 와 같이 μ‹œμž‘ν•˜λŠ” 경둜λ₯Ό μ˜λ―Έν•˜λ©°, λΉ„-μƒλŒ€μ  λͺ¨λ“ˆμ€ import * as $ from "jquery" 와 같은 경둜λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

πŸ‘¨β€πŸ’» Classic

Classic μ „λž΅μ€ TypeScript μ—μ„œλ§Œ μ‚¬μš©λ˜λŠ” λ°©μ‹μœΌλ‘œ, 이전 λ²„μ „κ³Όμ˜ ν˜Έν™˜μ„±μ„ μœ„ν•΄ 주둜 μ‚¬μš©λ©λ‹ˆλ‹€.

πŸ™‹β€β™‚οΈ μƒλŒ€μ  λͺ¨λ“ˆ

μƒλŒ€μ  λͺ¨λ“ˆμ΄ μž„ν¬νŠΈ λ˜μ—ˆμ„ 경우, ν˜„μž¬ 파일의 μƒλŒ€μ μΈ μœ„μΉ˜μ—μ„œ λͺ¨λ“ˆμ„ μ°ΎμŠ΅λ‹ˆλ‹€.

1
2
// /root/src/folder/A.ts
import { b } from "./moduleB";

μœ„μ™€ 같이 μž„ν¬νŠΈν–ˆμ„λ•Œ, λͺ¨λ“ˆμ„ νƒμƒ‰ν•˜λŠ” μˆœμ„œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  1. /root/src/folder/moduleB.ts
  2. /root/src/folder/moduleB.d.ts
  3. Error: Cannot find module

πŸ™‹β€β™‚οΈ λΉ„-μƒλŒ€μ  λͺ¨λ“ˆ

λΉ„-μƒλŒ€μ  λͺ¨λ“ˆμ„ μž„ν¬νŠΈν•  경우, ν˜„μž¬ λ””λ ‰ν† λ¦¬μ—μ„œ .ts, .d.ts νŒŒμΌμ„ νƒμƒ‰ν•˜κ³  없을 경우 μƒμœ„ λ””λ ‰ν† λ¦¬λ‘œ 이동해 같은 과정을 λ°˜λ³΅ν•©λ‹ˆλ‹€.

1
2
// /root/src/folder/A.ts
import { b } from "moduleB";

μœ„μ™€ 같이 μž„ν¬νŠΈ ν•  경우, λ‹€μŒκ³Ό 같이 νƒμƒ‰ν•©λ‹ˆλ‹€.

  1. /root/src/folder/moduleB.ts
  2. /root/src/folder/moduleB.d.ts
  3. /root/src/moduleB.ts
  4. /root/src/moduleB.d.ts
  5. /root/moduleB.ts
  6. /root/moduleB.d.ts
  7. moduleB.ts
  8. moduleB.d.ts
  9. Error: Cannot find module

πŸ‘¨β€πŸ’» Node

Node 의 module resolution 방식을 λͺ¨λ°©ν•œ λ°©μ‹μœΌλ‘œ Node ν™˜κ²½μ—μ„œ TypeScript ν”„λ‘œμ νŠΈλ₯Ό λ™μž‘ν•˜κ²Œλ” ν•˜κΈ°μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€.

πŸ™‹β€β™‚οΈ μƒλŒ€μ  λͺ¨λ“ˆ

1
2
// /root/src/folder/moduleA.ts
import { b } from "./moduleB";

μœ„μ™€ 같은 μƒλŒ€μ  λͺ¨λ“ˆμ„ Node μ „λž΅μ—μ„œλŠ” λ‹€μŒκ³Ό 같이 νƒμƒ‰ν•©λ‹ˆλ‹€.

  1. /root/src/folder/moduleB.ts
  2. /root/src/folder/moduleB.d.ts
  3. /root/src/folder/moduleB/package.json –> [types/typing]
  4. /root/src/folder/moduleB/index.ts
  5. /root/src/folder/moduleB/index.d.ts
  6. Error: Cannot find module

μƒλŒ€κ²½λ‘œμ— λͺ…μ‹œλœ λ””λ ‰ν† λ¦¬μ—μ„œ .ts, .d.ts νŒŒμΌμ„ νƒμƒ‰ν•œ ν›„, 없을 경우 λ””λ ‰ν† λ¦¬λ‘œ κ°„μ£Όν•΄ package.json 을 νƒμƒ‰ν•©λ‹ˆλ‹€. κ·Έ λ‹€μŒ package.json 의 types λ‚˜ typing ν•„λ“œμ— λͺ…μ‹œλ˜μ–΄ μžˆλŠ” declaration file 을 μž„ν¬νŠΈ ν•˜κ²Œ λ©λ‹ˆλ‹€.
λ§Œμ•½ package.json 파일이 없을 경우 ν•΄λ‹Ή λ””λ ‰ν† λ¦¬μ—μ„œ index.ts λ‚˜ index.d.ts λ₯Ό νƒμƒ‰ν•©λ‹ˆλ‹€.

πŸ™‹β€β™‚οΈ λΉ„-μƒλŒ€μ  λͺ¨λ“ˆ

λΉ„-μƒλŒ€μ  λͺ¨λ“ˆμ„ μž„ν¬νŠΈν•  경우, ν˜„μž¬μ˜ λ””λ ‰ν† λ¦¬μ—μ„œ node_modules 디렉토리λ₯Ό μ°ΎλŠ”λ‹€λŠ” 점을 μ œμ™Έν•˜κ³  μƒλŒ€μ  λͺ¨λ“ˆμ„ μž„ν¬νŠΈν•˜λŠ” 것과 λ™μΌν•©λ‹ˆλ‹€.

1
2
// /root/src/folder/moduleA.ts
import { b } from "moduleB";
  1. /root/src/folder/node_modules/moduleB.ts
  2. /root/src/folder/node_modules/moduleB.d.ts
  3. /root/src/folder/node_modules/moduleB/package.json –> [types/typing]
  4. /root/src/folder/node_modules/moduleB/index.ts
  5. /root/src/folder/node_modules/moduleB/index.d.ts

  6. /root/src/node_module/moduleB.ts
  7. /root/src/node_modules/moduleB.d.ts
  8. /root/src/node_modules/moduleB/package.json –> [types/typing]
  9. /root/src/node_modules/moduleB/index.ts
  10. /root/src/node_modules/moduleB/index.d.ts

  11. /root/node_modules/moduleB.ts
  12. /root/node_modules/moduleB.d.ts
  13. /root/node_modules/moduleB/package.json –> [types/typing]
  14. /root/node_modules/moduleB/index.ts
  15. /root/node_modules/moduleB/index.d.ts

  16. /node_modules/moduleB.ts
  17. /node_modules/moduleB.d.ts
  18. /node_modules/moduleB/package.json –> [types/typing]
  19. /node_modules/moduleB/index.ts
  20. /node_modules/moduleB/index.d.tss

  21. Error: Cannot find module
πŸ–Š Node 의 module resolution

TypeScript 의 Node 방식이 Node 의 module resolution 방식을 λͺ¨λ°©ν•œ 것이기 λ•Œλ¬Έμ— μœ μ‚¬ν•©λ‹ˆλ‹€.

  • μƒλŒ€μ  λͺ¨λ“ˆ
1
2
// /root/src/moduleA.js
var x = require("./moduleB");

μœ„μ˜ 경우 λ‹€μŒκ³Ό 같은 μˆœμ„œλ‘œ νƒμƒ‰ν•©λ‹ˆλ‹€.

  1. /root/src/moduleB.js
  2. /root/src/moduleB/package.json –> [main]
  3. /root/src/moduleB/index.js
  • λΉ„-μƒλŒ€μ  λͺ¨λ“ˆ
1
2
// /root/src/moduleA.js
var x = require("moduleB");
  1. /root/src/node_modules/moduleB.js
  2. /root/src/node_modules/moduleB/package.json –> [main]
  3. /root/src/node_modules/moduleB/index.js

  4. /root/node_modules/moduleB.js
  5. /root/node_modules/moduleB/package.json –> [main]
  6. /root/node_modules/moduleB/index.js

  7. /node_modules/moduleB.js
  8. /node_modules/moduleB/package.json –> [main]
  9. /node_modules/moduleB/index.js
이 κΈ°μ‚¬λŠ” μ €μž‘κΆŒμžμ˜ CC BY 4.0 λΌμ΄μ„ΌμŠ€λ₯Ό λ”°λ¦…λ‹ˆλ‹€.

first-child/last-child vs first-of-type/last-of-type

Namespace