Typescript: ๋ชจ๋“ˆ ์ง€์ •์ž์˜ ๋์— '.js' ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ œ๊ณต

์— ๋งŒ๋“  2017๋…„ 06์›” 16์ผ  ยท  273์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: microsoft/TypeScript

๋ธŒ๋ผ์šฐ์ €์—์„œ es6 ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด .js ํŒŒ์ผ ํ™•์žฅ์ž๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ถœ๋ ฅ์—๋Š” ์ถ”๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

TS์—์„œ:
import { ModalBackground } from './ModalBackground';
ES2015 ์ถœ๋ ฅ์—์„œ:
import { ModalBackground } from './ModalBackground';

์ด์ƒ์ ์œผ๋กœ๋Š” ์ด๊ฒƒ์ด ์ถœ๋ ฅ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.
import { ModalBackground } from './ModalBackground.js';

๊ทธ๋ ‡๊ฒŒํ•˜๋ฉด Chrome 51์—์„œ ์ถœ๋ ฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Webpack boilerplate</title>
  <script type="module" src="index.js"></script>
</head>
<body></body>
</html>

image

https://github.com/Microsoft/TypeScript/issues/13422 ๊ด€๋ จ

ES Modules Needs Proposal Suggestion

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋˜ํ•œ ์ด ๋ฌธ์ œ๋ฅผ ์กฐ๊ธˆ ์ผ๋ฐ˜ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์‹ค์ œ๋กœ .js ํ™•์žฅ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ™•์žฅ์ž๊ฐ€ ๋ฌด์—‡์ด๋“  ๋ชจ๋“ˆ ์ง€์ •์ž๋ฅผ ์‹ค์ œ ๊ฒฝ๋กœ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  273 ๋Œ“๊ธ€

#13422๋งŒ์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ™์€ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ค‘์š”ํ•œ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์‘๋‹ต์€ ์ƒ๋‹นํžˆ ๋ถ€์ •์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ท€ํ•˜์˜ ๋ฌธ์ œ๊ฐ€ ๋” ์ž˜ ๋ฐ›์•„๋“ค์—ฌ์ง€๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ธ€์Ž„, ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ถ”๊ฐ€๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ TypeScript ํŒŸ์บ์ŠคํŠธ์—์„œ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด POC์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ธฐ๋ฅผ ์ •๋ง๋กœ ๊ณ ๋Œ€ํ–ˆ์ง€๋งŒ ๋นŒ๋“œ ๋„๊ตฌ ์—†์ด TypeScript๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๊ธฐ๋‹ค๋ ค์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ TypeScript๋Š” ๊ฒฝ๋กœ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ์งœ์ฆ๋‚˜์ง€๋งŒ ํ˜„์žฌ .js ํ™•์žฅ์ž๋ฅผ ์ง์ ‘ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@jusinfagnani @rictic

ํŒ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์‰˜/๋…ธ๋“œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@DanielRosenwasser ๋ ˆ์ด๋ธ” ์•„๋ž˜์— ๊ธฐ๋ณธ ES6 ๋ชจ๋“ˆ ๋ฌธ์ œ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋˜ํ•œ ์ด ๋ฌธ์ œ๋ฅผ ์กฐ๊ธˆ ์ผ๋ฐ˜ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์‹ค์ œ๋กœ .js ํ™•์žฅ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ™•์žฅ์ž๊ฐ€ ๋ฌด์—‡์ด๋“  ๋ชจ๋“ˆ ์ง€์ •์ž๋ฅผ ์‹ค์ œ ๊ฒฝ๋กœ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ typescript์˜ ๋„๋ฉ”์ธ์€ ์•„๋‹ˆ์ง€๋งŒ ๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

node_modules๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ webpack์€ ts-loader๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ์— ๋ฒˆ๋“ค์„ ์ œ๊ณตํ•˜์ง€๋งŒ ๋ถ„๋ช…ํžˆ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ์ด๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

import { KeyCodes } from 'vanilla-typescript;
https://github.com/quantumjs/vanilla-typescript/blob/master/events/KeyCodes.ts#L3

์—ฌ๊ธฐ์— js ํ™•์žฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์„œ๋ฒ„์—์„œ ์‹คํ–‰๋˜๋Š” typescript ๋˜๋Š” url resolver์— ์˜ํ•œ ๊ฒฝ๋กœ ํ™•์žฅ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์˜คํžˆ๋ ค ํ‹ˆ์ƒˆ ์ผ€์ด์Šค์— ๊ฐ์‚ฌํ•˜์ง€๋งŒ TS๊ฐ€ ์ด ์˜์—ญ์—์„œ ์ผ์ฐ ๋น›๋‚  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. tsc ์ปดํŒŒ์ผ๋Ÿฌ์— ๋Œ€ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์—ฌ๊ธฐ์— ์™€์„œ ์ž„์‹œ ์†”๋ฃจ์…˜์„ ์›ํ•˜๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•ด import ๋ฌธ์— js ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

"use strict";

const FileHound = require('filehound');
const fs = require('fs');
const path = require('path');

const files = FileHound.create()
  .paths(__dirname + '/browserLoading')
  .discard('node_modules')
  .ext('js')
  .find();


files.then((filePaths) => {

  filePaths.forEach((filepath) => {
    fs.readFile(filepath, 'utf8', (err, data) => {


      if (!data.match(/import .* from/g)) {
        return
      }
      let newData = data.replace(/(import .* from\s+['"])(.*)(?=['"])/g, '$1$2.js')
      if (err) throw err;

      console.log(`writing to ${filepath}`)
      fs.writeFile(filepath, newData, function (err) {
        if (err) {
          throw err;
        }
        console.log('complete');
      });
    })

  })
});

์ด๊ฑธ cli ๋„๊ตฌ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„์ง€๋„..

@justinfagnani ๋‹˜ ์˜ ๋Œ“๊ธ€์ด ๋จธ๋ฆฌ์— ๋ชป์„ ๋ฐ•์•˜์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ด ๋ฌธ์ œ๋ฅผ ์กฐ๊ธˆ ์ผ๋ฐ˜ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์‹ค์ œ๋กœ .js ํ™•์žฅ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ™•์žฅ์ž๊ฐ€ ๋ฌด์—‡์ด๋“  ๋ชจ๋“ˆ ์ง€์ •์ž๋ฅผ ์‹ค์ œ ๊ฒฝ๋กœ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ์“ธ ๋•Œ

import { KeyCodes } from 'vanilla-typescript';

๋˜๋Š” ๊ทธ ๋ฌธ์ œ์— ๋Œ€ํ•ด

import { KeyCodes } from 'vanilla-javascript';

๋ชจ๋“ˆ ์ง€์ •์ž์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ ํŒŒ์ผ์ผ ์ˆ˜๋„ ์žˆ๊ณ  ์•„๋‹ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ด ๊ฒฝ์šฐ ๋์— .js ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์œ ํšจํ•œ ํ•ด๊ฒฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

NodeJS ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ NodeJS Require ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์–‘ํ•œ ํ•ด์„์„ ์‹œ๋„ํ•˜์ง€๋งŒ ์ถ”์ƒ ์ด๋ฆ„์„ ์ฐธ์กฐํ•˜๊ณ  ๊ทœ์น™๊ณผ ๊ตฌ์„ฑ์— ๋”ฐ๋ผ ํ•ด์„๋˜๊ธฐ ๋•Œ๋ฌธ์— 'vanilla-typescript.js' ๋กœ ํ•ด์„ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜์ง€ _์•Š์Šต๋‹ˆ๋‹ค_( ์•„๋งˆ๋„ ๋‹ค์–‘ํ•œ ์‹œ๋„๋ฅผ ํ†ตํ•ด) '../../../node_modules/vanilla_typescript/index.js' .

AMD์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ํ™˜๊ฒฝ์€ ์ด ํ•ด์ƒ๋„๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ฐจ์ด๊ฐ€ ์žˆ์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ํ™˜๊ฒฝ์ด ๊ณตํ†ต์ ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ•œ ๊ฐ€์ง€๋Š” ์ถ”์ƒํ™”๋œ ๋ชจ๋“ˆ ์ง€์ •์ž ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ œ๊ณต๋˜๋Š” ES ๋ชจ๋“ˆ ๊ตฌํ˜„์ด ๋ถˆ์™„์ „ํ•œ ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ์ข…์†์„ฑ์กฐ์ฐจ๋„ ๊ณ ๋ คํ•˜๊ณ  ์ „์ด์ ์ธ ์ข…์†์„ฑ์— ๋Œ€ํ•œ ์ฃผ์ œ๋ฅผ ๋‹ค๋ฃจ์ž ๋งˆ์ž doggone ํ•ญ๋ชฉ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ด์ง‘๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋จผ ์ด์•ผ๊ธฐ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‹น์‹ ์ด ๋ฐœ๊ฒฌํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์šฐ๋ฆฌ์—๊ฒŒ ์ฃผ์–ด์ง„ ์ด (์ •์ค‘ํ•˜๊ฒŒ) ๊ฐœ๋… ์ฆ๋ช… ๊ตฌํ˜„์— ์“ฐ๋Š” ๊ฒƒ์€ ํ˜„์‹ค์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ฌธ์ œ๋Š” ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— TypeScript๊ฐ€ ์—ฌ๊ธฐ์—์„œ ์–ด๋–ป๊ฒŒ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

@QuantumInformation .js ๋ฅผ ๊ฒฝ๋กœ์— ์ถ”๊ฐ€ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์€ ๋ฉ‹์ง€๊ณ  ๊ฐ€๋ณ๊ณ  ์šฐ์•„ํ•ด ๋ณด์ด์ง€๋งŒ ๊ถ๊ทน์ ์œผ๋กœ ์ž์‹ ์˜ ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์žฌ๋ฏธ์žˆ๊ณ  ํฅ๋ฏธ๋กœ์šด ์ž‘์—…์ด์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ˜„์žฌ ๊ตฌํ˜„์˜ ๊ฒฐํ•จ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ˆœ์ˆ˜ JavaScript๋กœ ์ž‘์„ฑํ•˜๋”๋ผ๋„ ์ „์ด์ ์œผ๋กœ ๊ฐ€์ ธ์˜จ ์ข…์†์„ฑ์„ ์ปดํŒŒ์ผํ•˜๊ณ  ํŒจํ‚ค์ง•ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ์ „ํžˆ ๋ฌด์–ธ๊ฐ€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฆด๋ฆฌ์Šค๋œ ES ๋ชจ๋“ˆ์˜ ๊ตฌํ˜„์ด ์ ์ ˆํ•˜์ง€ ์•Š๋‹ค๋Š” ์‚ฌ์‹ค์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์‹œ NodeJS, RequireJS AMD, Dojo AMD, Sea Package Manager, CommonJS, Browserify, Webpack, SystemJS๋Š” ๋ชจ๋‘ ๊ณ ์œ ํ•œ ์ž‘์—… ๋ฐฉ์‹์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ๋ชจ๋‘ ์ถ”์ƒ์ ์ธ ์ด๋ฆ„ ํ™•์ธ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. _๊ธฐ๋ณธ_์ด๊ธฐ ๋•Œ๋ฌธ์— ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ œ ์š•์„ ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ๋ฒ„์ „์˜ TS๊ฐ€ ์ถ”๊ฐ€ํ–ˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ' ./file.js' ์™€ ๊ฐ™์€ ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ์ด์ œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค(ํŒŒ์ผ์ด ์‹ค์ œ๋กœ file.ts์ธ ๊ฒฝ์šฐ์—๋„).
TypeScript๋Š” ํŒŒ์ผ์„ ์ž˜ ํ•ด์„ํ•˜๊ณ  ์™„์ „ํ•œ .js ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
lit-html ์‚ฌ์šฉ: https://github.com/PolymerLabs/lit-html/blob/master/src/lib/repeat.ts#L15

TS 2.0๋ถ€ํ„ฐ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ webpack๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋Š” ์ด๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ฒฐ๊ตญ ์“ธ๋ชจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์†Œ์Šค์—์„œ ts-loader๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์“ธ๋ชจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค(๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€).
์‹ค์ œ js ํŒŒ์ผ์ด ๊ฑฐ๊ธฐ์— ์žˆ๊ณ  ํ•ด๊ฒฐ ํ”„๋กœ์„ธ์Šค์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€์ƒ(์ผ๋ฐ˜์ ์œผ๋กœ "dist" ํด๋”)์„ ๋ฒˆ๋“ค๋กœ ๋ฌถ๋Š” ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋Œ€์ƒ ์ฝ”๋“œ์—์„œ .js ํ™•์žฅ์„ ์ œ๊ฑฐํ•˜์—ฌ ์†Œ์Šค์—์„œ ์ง์ ‘ ๋ฒˆ๋“ค๋กœ ํ—ˆ์šฉํ•˜๋Š” ๋น ๋ฅธ ๋ณ€ํ™˜์„ ts-loader ์—์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ช‡ ๋‹ฌ ์ „์— ts-loader์™€ ๊ฐ™์€ ์ฃผ์š” webpack ts ๋กœ๋”์— ๋ฌธ์ œ๋ฅผ ๊ฒŒ์‹œํ–ˆ๋Š”๋ฐ ๊ฝค ๋‚˜์œ ๋ฐ˜์‘์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค...

์ฐธ๊ณ ๋กœ ๋กค์—… ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ฆ๊ฑฐ๋กœ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ์ข…์†์„ฑ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋กœ๋“œ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ธŒ๋ผ์šฐ์ € ๋กœ๋” ๊ตฌํ˜„ ๋ฐ WGATWG ๋กœ๋” ์‚ฌ์–‘์ด ์ตœ์†Œํ•œ _์ผ๋ถ€_ ๊ตฌ์„ฑ์„ ์ง€์›ํ•  ๋•Œ๊นŒ์ง€ ์ด๊ฒƒ์ด ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ๊ด€์ ์—์„œ๋Š” ์•„์ง URL์ด ์•„๋‹ ์ˆ˜ ์žˆ๋Š” ์ž„์˜์˜ ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด ์ง€์ •์ž๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ์— ๋„ค์ดํ‹ฐ๋ธŒ ๋กœ๋”๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์‹ค์šฉ์ ์ด๊ธฐ ์ „๊นŒ์ง€๋Š” ์ด ์ค‘ ์•„๋ฌด ๊ฒƒ๋„ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ค์ œ URL.

๊ทธ๋•Œ๊นŒ์ง€ ์šฐ๋ฆฌ๋Š” SystemJS ๋ฐ Webpack๊ณผ ๊ฐ™์€ ๋„๊ตฌ์— ๊ณ„์† ์˜์กดํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

import/export ๋ฌธ์—์„œ '.js'๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ์ž‘์€ ๋ณ€ํ™˜๊ธฐ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
tsutils ์œ ํ˜• ๊ฐ€๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— yarn add tsutils --dev . (ํ”„๋กœ์ ํŠธ์— tslint ๊ฐ€ ์žˆ์œผ๋ฉด ํŒจํ‚ค์ง€๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์„ค์น˜๋˜๋ฏ€๋กœ ์ถ”๊ฐ€ ์ข…์†์„ฑ์ด ์žˆ์Œ)

https://gist.github.com/AviVahl/40e031bd72c7264890f349020d04130a

์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ .js ๋กœ ๋๋‚˜๋Š” ํŒŒ์ผ์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ํฌํ•จํ•˜๋Š” ts ํŒŒ์ผ์„ ๋ฌถ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ( webpack ๋ฐ ts-loader ์‚ฌ์šฉ), ์—ฌ์ „ํžˆ ์†Œ์Šค๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” esm ๋ชจ๋“ˆ๋กœ ํŠธ๋žœ์ŠคํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €( tsc ์‚ฌ์šฉ).

์ด๊ฒƒ์ด ์œ ์šฉํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์•„๋งˆ๋„ ์ œํ•œ์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŽธ์ง‘: ๋‚ด๋ณด๋‚ด๊ธฐ์—์„œ๋„ ์ž‘๋™ํ•˜๋„๋ก ์š”์ ์„ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ์ˆœ์ง„ํ•˜๊ณ  ์ตœ์ ํ™”๋˜์ง€ ์•Š์•˜์ง€๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์›€์ง์ž„์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ํ™•์žฅ ๋ฌธ์ œ๋Š” TypeScript์˜ ๋งจ ์ฒ˜์Œ์œผ๋กœ ๋Œ์•„๊ฐ€ tsconfig.json ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ์™€ module ์˜ต์…˜์ด compilerOptions ์„ค์ •์— ์ถ”๊ฐ€๋œ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

extension ํ™•์žฅ์˜ ๋ฌธ์ œ๋Š” ES2015+์— ๋Œ€ํ•ด์„œ๋งŒ ๋ฌธ์ œ๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ๊ฝค ์ž˜ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋Œ€์ƒ ์ฝ”๋“œ๊ฐ€ ES2015+์ผ ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์ถ”๊ฐ€ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

  1. .js ์— ๋Œ€ํ•œ .ts
  2. .jsx ์— ๋Œ€ํ•œ .tsx

์•ˆ๋…•ํ•˜์„ธ์š” ๋Šฆ๊ฒŒ ์™”์ง€๋งŒ ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. OP ์˜ˆ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

import { ModalBackground } from './ModalBackground';

'./ModalBackground' ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅด๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ? ํด๋” ๋˜๋Š” ๋‹ค๋ฅธ ๊ฒƒ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ „์ฒด ํ”„๋กœ์ ํŠธ์—์„œ tsc ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ModalBackground.ts๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ํ™•์žฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ๋˜ํ•œ RxJS ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๋งค์šฐ ๊ด€์‹ฌ์„ ๊ฐ–๊ณ  ์žˆ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์˜ ํƒ€์ž„๋ผ์ธ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์‹ฌ์ง€์–ด ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋„์›€์ด ๋  ํƒ€์‚ฌ ๋ณ€ํ™˜์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ถœ๋ ฅ ๋Œ€์ƒ์ด ES2015์ธ ๊ฒฝ์šฐ ์ด๊ฒƒ์ด ๋ฌธ์ œ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ES2015browser ๊ธฐ๋Šฅ์˜ ์˜์—ญ์— ์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”๊ตฐ๋‹ค๋‚˜ @justinfagnani ๊ฐ€ ์ด๊ฒƒ์„ ํ”Œ๋žซํผ ๋ชฉํ‘œ๋กœ ์ถ”์ง„ํ•  ์ˆ˜๋Š” ์—†๋‚˜์š”? (๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ๋กœ ๋ถ„๊ธฐํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Œ).

๋”๊ตฐ๋‹ค๋‚˜ @justinfagnani ๊ฐ€ ์ด๊ฒƒ์„ ํ”Œ๋žซํผ ๋ชฉํ‘œ๋กœ ์ถ”์ง„ํ•  ์ˆ˜๋Š” ์—†๋‚˜์š”? (๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ๋กœ ๋ถ„๊ธฐํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Œ).

๋„ค, ๋ฌผ๋ก  ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ํ”Œ๋žซํผ์ด ์–ด๋–ค ํ˜•ํƒœ์˜ ๋ฒ ์–ด ์ง€์ •์ž๋ฅผ ์ง€์›ํ•˜๊ธฐ๋ฅผ ์›ํ•˜์ง€๋งŒ ํ˜„์žฌ ์‚ฌ์‹ค์€ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉฐ ์ถ”๊ฐ€ํ•  ์ œ์•ˆ์กฐ์ฐจ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ ์ „์ฒด, ์•„๋งˆ๋„ ๋‹ค๋…„ ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ถ๊ทน์ ์œผ๋กœ ์ง€์ •์ž๋งŒ ์ง€์›ํ•œ๋‹ค๊ณ  ํ•ด๋„ ๋…ธ๋“œ-๋ชจ๋“ˆ-ํ•ด์ƒ๋„๊ฐ€ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ์˜ ํ˜•ํƒœ๊ฐ€ ๋  ๊ฐ€๋Šฅ์„ฑ์€ ๋งค์šฐ ๋‚ฎ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ tsc์—์„œ ํŒŒ์ผ์„ ์ฐพ๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ํ•ด์ƒ๋„ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํ•ด์ƒ๋„ ์•Œ๊ณ ๋ฆฌ์ฆ˜(๋…ธ๋“œ์˜ ๊ธฐ๋ณธ ๋ชจ๋“ˆ ์ง€์›์ธ afaik) ๊ฐ„์— ๋ถˆ์ผ์น˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์šด์ŠคํŠธ๋ฆผ ๋„๊ตฌ์™€ ํ™˜๊ฒฝ์ด ์ถฉ๋Œํ•˜๋Š” ์˜๊ฒฌ์œผ๋กœ ์ง€์ •์ž๋ฅผ ํ•ด์„ํ•˜์ง€ ์•Š๋„๋ก tsc๊ฐ€ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์„ ์ฐพ๋Š” ๋ฐ ์‚ฌ์šฉํ•œ ๊ฒฝ๋กœ๋ฅผ ๊ตฌ์ฒดํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@justinfagnani ๊ทธ๋“ค์€ ์ด๋ฏธ ์ƒ์ถฉ๋˜๋Š” ์˜๊ฒฌ์œผ๋กœ ํ•ด์„๋ฉ๋‹ˆ๋‹ค. TS๋Š” ์ƒ์„ฑํ•˜๋Š” JS ์ฝ”๋“œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค์ง€ ์•Š๋Š” JS ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ES6์€ JavaScript๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ณต์‹์ ์œผ๋กœ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ฒƒ์ด๋ฏ€๋กœ TypesScript์—์„œ ์ƒ์„ฑํ•œ ES6 ์ฝ”๋“œ๊ฐ€ ์ž˜๋ชป๋œ ๊ฒฝ์šฐ ์ด๋Š” ๋‹จ์ˆœํ•˜๊ณ  ๋‹จ์ˆœํ•œ ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค. ์ œ์•ˆ ๋“ฑ์„ ๊ธฐ๋‹ค๋ฆด ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. TypeScript์˜ ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์˜ค๋Š˜๋‚  ์‚ฌ๋žŒ๋“ค์€ ๋ฌด์–ธ๊ฐ€ ์ž˜๋ชป์„ ์ฐพ์ง€ ์•Š๊ณ  10๋‹จ๊ณ„์˜ ์ œ์•ˆ์„ ๊ฑฐ์ณ ์—ฐ๊ธฐ๋ฅผ ํ•˜๋ฉด ์ง€์ ์œผ๋กœ ํ–‰๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‰ฌ๊ฒŒ ํ•ด์ค˜

@aluanhaddad ๋งŽ์€ ํ”„๋กœ์ ํŠธ๊ฐ€ ํ˜œํƒ์„ ๋ฐ›์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์‹ค์ด์ง€๋งŒ npm ์ข…์†์„ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”(๋˜๋Š” ์–ด๋–ค ์‹์œผ๋กœ๋“  npm ์ข…์†์„ฑ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”) ์ผ๋ถ€ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๊ฐ€ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ES6์œผ๋กœ ์ปดํŒŒ์ผ๋œ TypeScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—๋„ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ด๋Ÿฌํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์ง€๋งŒ TypeScript๊ฐ€ .js ํ™•์žฅ์„ ์ถœ๋ ฅํ•˜๋ฉด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@justinfagnani ์•„์ง ํ‘œ์ค€ํ™”๋˜๊ฑฐ๋‚˜ ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ €์—์„œ npm ํŒจํ‚ค์ง€๊ฐ€ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€ ์ด๋ฆ„ ๋งต์€ TypeScript ์ปดํŒŒ์ผ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ๋„๊ตฌ์— ์˜ํ•ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์ด๊ฒƒ์„ ๋‹ค์‹œ ๊ฒ€ํ† ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ ๋…ธ๋“œ ์Šคํฌ๋ฆฝํŠธ ์™ธ์— ์ด๊ฒƒ์— ๋Œ€ํ•œ ์ข‹์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š”์ด ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•ด ์™”์Šต๋‹ˆ๋‹ค.
https://github.com/Microsoft/TypeScript/issues/16577#issuecomment -343610106

๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“ˆ์— ํŒŒ์ผ ํ™•์žฅ์ž๊ฐ€ ์—†์ง€๋งŒ ์˜ฌ๋ฐ”๋ฅธ MIME ์œ ํ˜•์ด ์ œ๊ณต๋˜๋ฉด ํ•ด๊ฒฐ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์›€์ง์ž„์ด ์žˆ์Šต๋‹ˆ๊นŒ?

https://github.com/Microsoft/TypeScript/pull/25073์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@Kingwl ๋‹ค๋ฅธ ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ์ง€์›ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์˜ˆ: .mjs .es .esm .

์•„๋‹ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ์ด๋Ÿฐ ์ผ์ด? ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋Œ€์ƒ ์ถœ๋ ฅ์ด JS ํŒŒ์ผ์ด๋ผ๋Š” ๊ฒƒ์„ _์•Œ๊ณ _ ์žˆ์Šต๋‹ˆ๋‹ค. 15๋ถ„ ๋™์•ˆ ์ด ์Šค๋ ˆ๋“œ๋ฅผ ํƒ์ƒ‰ํ–ˆ์ง€๋งŒ ํ™•์žฅ์ž๊ฐ€ ์ƒ๋žต๋œ ์ด์œ ๋ฅผ ์—ฌ์ „ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ฐธ์กฐ ์ˆ˜๋ฅผ ๋ณด๋ฉด ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ณง ๋‹ค๋ฅธ ์‹œ๋„๋ฅผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ์ด๋Ÿฐ ์ผ์ด? ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋Œ€์ƒ ์ถœ๋ ฅ์ด JS ํŒŒ์ผ์ด๋ผ๋Š” ๊ฒƒ์„ _์•Œ๊ณ _ ์žˆ์Šต๋‹ˆ๋‹ค. 15๋ถ„ ๋™์•ˆ ์ด ์Šค๋ ˆ๋“œ๋ฅผ ํƒ์ƒ‰ํ–ˆ์ง€๋งŒ ํ™•์žฅ์ž๊ฐ€ ์ƒ๋žต๋œ ์ด์œ ๋ฅผ ์—ฌ์ „ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™•์žฅ ๊ธฐ๋Šฅ์ด ์—†์–ด ์ธํ”„๋ผ๊ฐ€ ๋” ์œ ์—ฐํ•ด์ง‘๋‹ˆ๋‹ค. ๋…ธ๋“œ ํ•„์š” ํ›„ํฌ ๋ฐ ์›นํŒฉ ๋กœ๋”๊ฐ€ ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ์ด๋Ÿฐ ์ผ์ด? ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋Œ€์ƒ ์ถœ๋ ฅ์ด JS ํŒŒ์ผ์ด๋ผ๋Š” ๊ฒƒ์„ _์•Œ๊ณ _ ์žˆ์Šต๋‹ˆ๋‹ค. 15๋ถ„ ๋™์•ˆ ์ด ์Šค๋ ˆ๋“œ๋ฅผ ํƒ์ƒ‰ํ–ˆ์ง€๋งŒ ํ™•์žฅ์ž๊ฐ€ ์ƒ๋žต๋œ ์ด์œ ๋ฅผ ์—ฌ์ „ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™•์žฅ ๊ธฐ๋Šฅ์ด ์—†์–ด ์ธํ”„๋ผ๊ฐ€ ๋” ์œ ์—ฐํ•ด์ง‘๋‹ˆ๋‹ค. ๋…ธ๋“œ ํ•„์š” ํ›„ํฌ ๋ฐ ์›นํŒฉ ๋กœ๋”๊ฐ€ ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ € ๋ชจ๋“ˆ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

.js ํ™•์žฅ์ž๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ์˜ตํŠธ์ธ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด typescript ํŒ€์„ ์ฃฝ์ด๊ฒ ์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์„œ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์—ฌ์ „ํžˆ ์‘๋‹ต๊ณผ ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ์งˆ๋ฌธ์„ ๋ฐ›๊ณ  ์žˆ๋Š” 12๊ฐœ์˜ ์Šค๋ ˆ๋“œ(๊ณต๊ฐœ ๋ฐ ๋น„๊ณต๊ฐœ)๊ฐ€ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์ด TS์˜ ๊ฒฐํ•จ์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€๋งŒ TS๊ฐ€ JS ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์— ์žˆ๋‹ค๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

๋ถ€์ธ ์„ฑ๋ช…:

์˜ˆ, ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์—ฌ๊ธฐ์— "์›นํŒฉ์„ ๋ง์ณค์Šต๋‹ˆ๋‹ค"๋ผ๋Š” ๋ฌธ์ œ๋ฅผ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๊ทธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ํž˜๋“  ๊ฐ€์Šด์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ์˜ตํŠธ์ธ ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Btw, TypeScript ์†Œ์Šค๋ฅผ ํŒŒํ—ค์ณ ๋ณด๋‹ˆ importModuleSpecifierEnding -- ์ด๋ฏธํ„ฐ๊ฐ€ .js ์—”๋”ฉ์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๋Š” ๋ฐ (ab) ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ์ œ์•ˆ์„ tsconfig ์Šคํ‚ค๋งˆ๋กœ ๋ญ‰๊ฐœ๋ฒ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? https://github.com/domenic/package-name-maps

์ด ์‹œ์ ์—์„œ TypeScript๊ฐ€ tsconfig์— ์ง€์ •๋œ paths ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ˆ˜๋งŒ ์žˆ๋‹ค๋ฉด ๊ธฐ์  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ์ง€์›์ด ์—†์–ด๋„ ๋Œ€๋ถ€๋ถ„์˜ ๊ณ ์ถฉ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ์‹œ๋„๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ es ๋ชจ๋“ˆ์„ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ์ฃผ์š” ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์ด์— ๋Œ€ํ•œ ํ‘œ์ค€์—๋Š” ํ™•์žฅ์ด ํ•„์š” ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ณ  tsc๊ฐ€ ๊ทธ๊ฒƒ์„ ์ดํ•ดํ•  ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ํ•„์ˆ˜๋Š” ์•„๋‹ˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์™œ ๊ทธ๋ƒฅ ์ž‘๋™ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?
์ง•์ง•๊ฑฐ๋ ค์„œ ์ฃ„์†กํ•˜์ง€๋งŒ ์ด ๋ฌธ์ œ๋Š” ์ด์ œ ๋งค์šฐ ์˜ค๋ž˜๋˜์—ˆ๊ณ  ์•„์ง ์ˆ˜ํ–‰๋œ ์ž‘์—…์ด ์—†์Šต๋‹ˆ๋‹ค...

์–ด๋–ป๊ฒŒ ์ด๋Ÿฐ ์ผ์ด? ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋Œ€์ƒ ์ถœ๋ ฅ์ด JS ํŒŒ์ผ์ด๋ผ๋Š” ๊ฒƒ์„ _์•Œ๊ณ _ ์žˆ์Šต๋‹ˆ๋‹ค. 15๋ถ„ ๋™์•ˆ ์ด ์Šค๋ ˆ๋“œ๋ฅผ ํƒ์ƒ‰ํ–ˆ์ง€๋งŒ ํ™•์žฅ์ž๊ฐ€ ์ƒ๋žต๋œ ์ด์œ ๋ฅผ ์—ฌ์ „ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™•์žฅ ๊ธฐ๋Šฅ์ด ์—†์–ด ์ธํ”„๋ผ๊ฐ€ ๋” ์œ ์—ฐํ•ด์ง‘๋‹ˆ๋‹ค. ๋…ธ๋“œ ํ•„์š” ํ›„ํฌ ๋ฐ ์›นํŒฉ ๋กœ๋”๊ฐ€ ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด Typescript ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ™•์žฅ์„ ์ถ”๊ฐ€ํ• ์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ์˜ต์…˜์„ ์ˆ˜๋ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํฌํ•จ ์˜ต์…˜(https://www.typescriptlang.org/docs/handbook/tsconfig-json.html)๊ณผ ๊ฐ™์ด ํ™•์žฅ์„ ์ถ”๊ฐ€(๋˜๋Š” ์ œ์™ธ)ํ•˜๊ธฐ ์œ„ํ•ด ์ •๊ทœ์‹ ์ง‘ํ•ฉ์„ ํ—ˆ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์ด๋ฏธ ํ•œ ๋ฒˆ ์ด์ƒ ์ œ์•ˆ๋œ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? TS์—๋Š” ๋ธŒ๋ผ์šฐ์ €์— ๊ตฌํ˜„๋œ ํ›„์— ๋ฏธ๋ž˜์— ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋Š” ์‹คํ—˜ ๊ธฐ๋Šฅ์ด ์ด๋ฏธ ๊ฑฐ์˜ ์—†์ง€๋งŒ TS์—๋Š” ์ด๋Ÿฌํ•œ ๋ถˆ์•ˆ์ •ํ•œ ์‚ฌ์–‘์— ๋Œ€ํ•œ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ด๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค. module += '.js' ๋งŒ ์ˆ˜ํ–‰ํ•˜๋Š” ์‹คํ—˜ ํ”Œ๋ž˜๊ทธ addImportsExtensions ๋งŒ ์žˆ์œผ๋ฉด ๋˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒŒ ์ „๋ถ€์ž…๋‹ˆ๋‹ค! ํŽ‘ํ‚คํ•œ ๋…ผ๋ฆฌ๋‚˜ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ๋Œ€์ƒ์œผ๋กœ ์œ ์ง€ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋‹ค๋ฅธ ๋Œ€์ƒ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์™ธ์—๋„ ์œ„์˜ ๋‚ด์šฉ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ˆ˜๋ฝํ•˜๋ฉด ๊ฐœ์ธ์ ์œผ๋กœ tsc ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๊ณ  ์ด์— ๋Œ€ํ•œ PR์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์ˆ˜๋ฝ๋˜์ง€ ์•Š์œผ๋ฉด ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ ๋ณ€ํ™˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด๋ณด๋‚ธ ์ฝ”๋“œ์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค('.js' ์ถ”๊ฐ€ ๋˜๋Š” ๋ชจ๋“ˆ ๊ฐ€์ ธ์˜ค๊ธฐ์˜ ํ™•์ธ๋œ ๊ฒฝ๋กœ ์‚ฌ์šฉ).

TypeScript ๋ณ€ํ™˜์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•
ttypescript: ์ปดํŒŒ์ผ ์ค‘ ๋ณ€ํ™˜์„ ์ ์šฉํ•˜๋Š” tsc ์šฉ ๋ž˜ํผ

ํ•„์š”ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ์กด ๋ณ€ํ™˜์ด ์ด๋ฏธ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ปดํŒŒ์ผ๋Ÿฌ API๋ฅผ ๊ฝค ๋งŽ์ด ๊ฐ€์ง€๊ณ  ๋†€์•˜์Šต๋‹ˆ๋‹ค(์›ํ•˜๋Š” ๋งŒํผ์€ ์•„๋‹ˆ์ง€๋งŒ). ๋ฌธ์ œ๋Š” ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€ ๋„๊ตฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ถ”๊ฐ€ ๋„๊ตฌ์—๋Š” ๋ฌธ์ œ์— ์ถฉ๋ถ„ํžˆ ๋น ๋ฅด๊ฒŒ ์‘๋‹ตํ•  ์ˆ˜๋„ ์žˆ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋Š” ์ถ”๊ฐ€ ์œ ์ง€ ๊ด€๋ฆฌ์ž๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ข…์ข… ๊ทธ๋“ค์˜ ์ž˜๋ชป์ด ์•„๋‹ˆ๋ผ ์šฐ๋ฆฌ ๋ชจ๋‘๋Š” ์ƒ๋ช…๊ณผ ์ผ์ด ์žˆ์Œ). ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋Š” ์ข…์ข… ํฌ๊ธฐ๋˜๊ณ  ๋ชจ๋“  ๊ฒƒ์„ ์Šค์Šค๋กœ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋น„์ฆˆ๋‹ˆ์Šค ์ฝ”๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋Œ€์‹  ๋„๊ตฌ์— ์‹œ๊ฐ„์„ ํ• ์• ํ•˜๋Š” ์ฑ…์ž„์ด ์šฐ๋ฆฌ์—๊ฒŒ ์ด์ „๋ฉ๋‹ˆ๋‹ค.
์œ„์˜ ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•˜๋ฉด ๋งŽ์€ ํ”„๋กœ์ ํŠธ์—์„œ ์ด๋ฅผ ์†”๋ฃจ์…˜์œผ๋กœ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  ๋กค์—… ๋“ฑ๊ณผ ๊ฐ™์€ ์ถ”๊ฐ€ ๋นŒ๋“œ ๋‹จ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ถ”๊ฐ€ ๊ตฌ์„ฑ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ถ”๊ฐ€ ์œ ์ง€ ๊ด€๋ฆฌ ๋น„์šฉ์œผ๋กœ ๋Œ์•„๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
์š”์•ฝํ•˜์ž๋ฉด, ์ €๋Š” (์‹œ๊ฐ„์ด ์—†๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๋งŽ์€ ์ด์œ ๋กœ ์ธํ•ด) ๊ฒฐ๊ตญ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ์†”๋ฃจ์…˜์— ์‹œ๊ฐ„์„ ๋ณด๋‚ด๋Š” ๊ฒƒ๋ณด๋‹ค ๊ณต์‹ TS์— ๋Œ€ํ•œ PR์— ์‹œ๊ฐ„์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ), ๋˜๋Š” ์„ธ๊ณ„์˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ajafff โ€‹โ€‹ํ•ด๊ฒฐ์ฑ…์ด ๋  ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Typescript ๋ณ€ํ™˜๊ธฐ๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž˜๋ชป๋œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ณ€ํ˜•์ด ์žˆ๋Š” ๊ฒƒ์€ ์ข‹์ง€๋งŒ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ณ€ํ™˜ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์‹ ๊ฒฝ์„ ์จ์•ผ ํ•˜๊ณ  ์ž์ฒด ๋ณ€ํ™˜์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š”์ง€ ์•„๋‹ˆ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๋ณ€ํ™˜์€ ์ •๋ง ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๋ณ€ํ™˜์œผ๋กœ ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๊ฒƒ์€ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ์ด๋ฏธ ํ•œ ๋ฒˆ ์ด์ƒ ์ œ์•ˆ๋œ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? TS์—๋Š” ์ด๋ฏธ ์‹คํ—˜์ ์ธ ๊ธฐ๋Šฅ์ด ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค.

TypeScript์—๋Š” 3๋…„ ์ „์— ์ถ”๊ฐ€๋œ ์ •ํ™•ํžˆ ํ•˜๋‚˜์˜ ์‹คํ—˜ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ์œผ๋ฉฐ ํ˜„์žฌ ์ œ์•ˆ๊ณผ ๋” ์ด์ƒ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ECMAScript ์ œ์•ˆ์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Typescript ๋ณ€ํ™˜๊ธฐ๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž˜๋ชป๋œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์˜ ๊ธฐ๋Œ€๋ฅผ ์ดํ•ดํ•˜์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋‹น์‹ ์ด ์“ด ๊ฒฝ๋กœ๋ฅผ ๋‹ค์‹œ ์“ฐ์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ๋‹น์‹ ์ด ์ž์‹ ์˜ ์ฝ”๋“œ์˜ ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ "์ž˜๋ชป๋œ" ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์— ๋†€๋ž์Šต๋‹ˆ๋‹ค. ๐Ÿ˜‰

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค @DanielRosenwasser , npm์ด๋ผ๋Š” ๊ฒƒ์„ ๋“ค์–ด ๋ณด์…จ์Šต๋‹ˆ๊นŒ? ์‚ฌ๋žŒ๋“ค์€ ๊ทธ๊ณณ์— ํŒจํ‚ค์ง€๋ฅผ ๊ฒŒ์‹œํ•˜์—ฌ ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ๋‚˜๋ฅผ ๋งค์šฐ ๋†’๊ฒŒ ์ƒ๊ฐํ•  ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€๋งŒ ์Šฌํ”„๊ฒŒ๋„ ๋‚˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ €์ž๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ™•์žฅ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํŽธ์ง‘ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๋‚ด ํ”„๋กœ์ ํŠธ์—์„œ ๋‚ด ์ฝ”๋“œ๋งŒ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด, (WebStorm์€ ์ œ์™ธํ•˜๊ณ ) ์ฝ”๋”ฉ์—์„œ ์ง„์ •ํ•œ ๋‚ด ์˜ค๋ฅธ์†์ด๊ธฐ ๋•Œ๋ฌธ์— typescript๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋” ๊ฐ์‚ฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์šฐ๋ฆฌ ๋Œ€๋ถ€๋ถ„์ด ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํƒ€์‚ฌ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋ฐ˜๋“œ์‹œ ํ™•์žฅ์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. rxjs์™€ ๊ฐ™์€ ์ผ๋ถ€ ํ”„๋กœ์ ํŠธ๋Š” typescript๊ฐ€ ํ™•์žฅ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•  ๊ฒƒ์ด๋ผ๋Š” ํฌ๋ง์„ ํ’ˆ๊ณ  ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ „์ฒด ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ œํ’ˆ ๋Œ€์‹  ๋„๊ตฌ์— ์ถ”๊ฐ€ ์‹œ๊ฐ„์„ ํ• ์• ํ•ฉ๋‹ˆ๋‹ค.
์ด์ œ 3๊ฐ€์ง€ ์งˆ๋ฌธ์— ๋‹ต๋ณ€ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

  1. ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ ํŒ€์—์„œ ์ด ๊ธฐ๋Šฅ์„ ๊ธฐ๊บผ์ด ์ œ๊ณตํ•  ์˜ํ–ฅ์ด ์žˆ์Šต๋‹ˆ๊นŒ?
  2. ๊ทธ๋ ‡๋‹ค๋ฉด PR์„ ์ˆ˜๋ฝํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
  3. ์•„๋‹ˆ๋ผ๋ฉด ์–ธ์ œ ์ถœ์‹œํ•  ์˜ˆ์ •์ธ๊ฐ€์š”?

์ฒซ ๋ฒˆ์งธ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋Œ€๋‹ต์ด '์•„๋‹ˆ์˜ค'์ธ ๊ฒฝ์šฐ ์ด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•  ์˜์‚ฌ๊ฐ€ ์—†์Œ์„ ๊ณต์‹์ ์œผ๋กœ ์„ ์–ธํ•˜๊ณ  ์ด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์„ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ํ•˜์ง€ ์•Š์Œ์„ ๊ณต์‹์ ์œผ๋กœ ์„ ์–ธํ•˜๋ฉด์„œ ์ด ๋ฌธ์ œ๋ฅผ ๋‹ซ์œผ์‹ญ์‹œ์˜ค.

์˜ˆ, ์ด๋ฏธ ํ•œ ๋ฒˆ ์ด์ƒ ์ œ์•ˆ๋œ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? TS์—๋Š” ์ด๋ฏธ ์‹คํ—˜์ ์ธ ๊ธฐ๋Šฅ์ด ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค.

TypeScript์—๋Š” 3๋…„ ์ „์— ์ถ”๊ฐ€๋œ ์ •ํ™•ํžˆ ํ•˜๋‚˜์˜ ์‹คํ—˜ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ์œผ๋ฉฐ ํ˜„์žฌ ์ œ์•ˆ๊ณผ ๋” ์ด์ƒ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ECMAScript ์ œ์•ˆ์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Typescript ๋ณ€ํ™˜๊ธฐ๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž˜๋ชป๋œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์˜ ๊ธฐ๋Œ€๋ฅผ ์ดํ•ดํ•˜์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋‹น์‹ ์ด ์“ด ๊ฒฝ๋กœ๋ฅผ ๋‹ค์‹œ ์“ฐ์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ๋‹น์‹ ์ด ์ž์‹ ์˜ ์ฝ”๋“œ์˜ ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ "์ž˜๋ชป๋œ" ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์— ๋†€๋ž์Šต๋‹ˆ๋‹ค. ๐Ÿ˜‰

@DanielRosenwasser ์˜ ์ข‹์€ ์ง€์ ์ž…๋‹ˆ๋‹ค. Typescript ์‚ฌ์–‘ (https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#11.3)์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฝ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ œ ์ฝ”๋“œ๊ฐ€ ๋งž๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

ECMAScript ์‚ฌ์–‘์„ ์ฝ์—ˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์–‘์—์„œ ๋ชจ๋“ˆ์ด ํ™•์žฅ์ž๋กœ ๋๋‚˜์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋Š” ๊ฒฐ์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์–‘์—์„œ ๋ชจ๋“ˆ ๊ฐ€์ ธ์˜ค๊ธฐ๋Š” HostResolveImportedModule ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐ๋˜์ง€๋งŒ ์ •์˜๊ฐ€ ๋ชจํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ECMAScript ์‚ฌ์–‘์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์‚ฌ์–‘์— ์ •์˜๋œ [ModuleRequest]๊ฐ€ ๋ฆฌ์†Œ์Šค ๊ฒฝ๋กœ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ชจ๋“ˆ์„ ํ•ด๊ฒฐํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ์—ผ๋‘์— ๋‘๊ณ  ํ•ด๋‹น ์–ธ์–ด์˜ ํ™ˆ ํŽ˜์ด์ง€( https://www.typescriptlang.org/ )๋กœ ์ด๋™ํ•˜์‹ญ์‹œ์˜ค.

ํŽ˜์ด์ง€ ๋ฐ”๋‹ฅ๊ธ€์—์„œ ๋‹ค์Œ ํ–‰์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

JavaScript๋กœ ์‹œ์ž‘ํ•˜๊ณ  ๋๋‚จ

TypeScript๋Š” ์˜ค๋Š˜๋‚  ์ˆ˜๋ฐฑ๋งŒ ๋ช…์˜ JavaScript ๊ฐœ๋ฐœ์ž๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๊ตฌ๋ฌธ ๋ฐ ์˜๋ฏธ์—์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด JavaScript ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ธ๊ธฐ ์žˆ๋Š” JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ฉํ•˜๊ณ  JavaScript์—์„œ TypeScript ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

TypeScript ๋Š” ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €, Node.js ๋˜๋Š” ECMAScript 3(๋˜๋Š” ๊ทธ ์ด์ƒ)์„ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  JavaScript ์—”์ง„์—์„œ ์‹คํ–‰๋˜๋Š” ๊นจ๋—ํ•˜๊ณ  ๊ฐ„๋‹จํ•œ JavaScript ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.


๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์•ฝ์†ํ•˜์ง€๋งŒ ์‚ฌ์‹ค์ด ์•„๋‹Œ ๊ฒƒ ๊ฐ™์•„์„œ ์ด ๋ฌธ์ œ๊ฐ€ 1๋…„ ์ด์ƒ ์ง€์†๋ฉ๋‹ˆ๋‹ค.

@Draccoz ๊ฐ€ ์ง€์ ํ–ˆ๋“ฏ์ด ์šฐ๋ฆฌ๋Š” ์ด ๋ฌธ์ œ๋กœ ๋ฌด์—‡์„ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์„ ๋ฟ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฒˆ ํ˜ธ์—์„œ๋Š” ํ™ˆํŽ˜์ด์ง€์—์„œ ํ•œ ๊ฐ€์ง€๋ฅผ ์ฝ๊ณ  ๊ทธ ๋ฐ˜๋Œ€๋ฅผ ์ฝ๋Š” ๊ฒƒ์ด ์กฐ๊ธˆ ๋‹ต๋‹ตํ•ฉ๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, ์šฐ๋ฆฌ๋Š” Node์˜ ES interop๊ณผ ์ฒ˜์Œ์— npm์—์„œ ์‚ฌ์šฉํ•  ์ „์ด์  ์ข…์†์„ฑ์„ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ ํ•ฉ๋ฆฌ์ ์ธ ์ „๋žต๊ณผ ๊ฐ™์€ ๊ฒƒ์— ๋Œ€ํ•œ ๋ช…ํ™•์„ฑ์ด ์žˆ์„ ๋•Œ๊นŒ์ง€ ์ด์™€ ๊ด€๋ จ๋œ ์–ด๋–ค ๊ฒƒ๋„ ๊ธฐ๊บผ์ด ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. TypeScript๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ข…์†์„ฑ ๊ด€๋ฆฌ ๋ฐ ํ•ด๊ฒฐ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ JS ์—์ฝ”์‹œ์Šคํ…œ ์ „์ฒด์—์„œ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ์ƒ๊ฐํ•ด๋‚ด๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค ํ•˜๋”๋ผ๋„ ์ด ๊ธฐ๊ฐ„ ๋™์•ˆ ๋ณ€๊ฒฝ์ด ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ๋ณด์žฅํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์•ฝ์†ํ•˜์ง€๋งŒ ์‚ฌ์‹ค์ด ์•„๋‹Œ ๊ฒƒ ๊ฐ™์•„์„œ ์ด ๋ฌธ์ œ๊ฐ€ 1๋…„ ์ด์ƒ ์ง€์†๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด ํ•ด์„์ด ๋„ˆ๋ฌด ์ง์„ค์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. var fs = require('fs') ๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰ํ•˜๋ฉด ์ž‘๋™ํ•˜์ง€ ์•Š๊ณ  HTMLDivElement ๋Š” Node์— ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉฐ String.prototype.startsWith ๋Š” ์ด์ „ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ๋žŒ๋“ค์€ ๋” ๊ด‘๋ฒ”์œ„ํ•œ JavaScript ์ƒํƒœ๊ณ„์— ์ ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— TypeScript ์™ธ๋ถ€์— ๋„๊ตฌ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ/ํด๋ฆฌํ•„์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ๋‹ซ์•„์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ TS๊ฐ€ ํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ ๊ฑฐ๋‚˜ ๋‹น์‹ ์ด ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์„ ์–ธํ•˜๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ์ฐจ๋‹จ๊ธฐ์ž…๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•˜๊ณ  ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๊ท€ํ•˜์˜ ๊ฒฐ์ •์„ ์•Œ๋ฆฌ์‹ญ์‹œ์˜ค.

@DanielRosenwass ๋น ๋ฅธ ์‘๋‹ต์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ˜„๋ช…ํ•œ ์„ ํƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด ํ•ด์„์ด ๋„ˆ๋ฌด ์ง์„ค์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. var fs = require('fs')๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰ํ•  ๋•Œ ์ž‘๋™ํ•˜์ง€ ์•Š๊ณ  HTMLDivElement๋Š” Node์— ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉฐ String.prototype.startsWith๋Š” ์ด์ „ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ๋žŒ๋“ค์€ ๋” ๊ด‘๋ฒ”์œ„ํ•œ JavaScript ์ƒํƒœ๊ณ„์— ์ ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— TypeScript ์™ธ๋ถ€์— ๋„๊ตฌ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ/ํด๋ฆฌํ•„์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Typescript์— ๋Œ€ํ•ด ์•„๋ฌด๊ฒƒ๋„ ๋ชจ๋ฅด๋Š” ์‚ฌ๋žŒ์ด ๋‹ค๋ฅธ ๋ฌด์—‡์„ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋‚ด ํ•ด์„์ด ๋„ˆ๋ฌด ์ง์„ค์ ์ด๋ผ๋Š” ์‚ฌ์‹ค์€ ์ด ํ…์ŠคํŠธ๊ฐ€ Typescript์— ๋Œ€ํ•ด ์•„๋ฌด๊ฒƒ๋„ ๋ชจ๋ฅด๋Š” ์‚ฌ๋žŒ์„ "ํ˜ผ๋™์‹œํ‚ฌ" ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค๋งŒํผ์ด๋‚˜ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค ๐Ÿ˜‰.

์‹ค์ œ ๋™์ž‘์„ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด ๋ฌธ์„œ (https://www.typescriptlang.org/docs/handbook/modules.html) ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@DanielRosenwass ๊ท€ํ•˜์˜ ์‘๋‹ต์— ๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋‚˜๋Š” 1๋…„ ๋™์•ˆ ๋น„์Šทํ•œ ๊ฒƒ์„ ๊ธฐ๋‹ค๋ ค์™”๋‹ค.

์ด ๊ธฐ๋Šฅ์„ ์›ํ–ˆ๋˜ ์ด์œ ๋Š” ๋นŒ๋“œ ๋„๊ตฌ ์—†์ด ์–ด๋–ค ์ข…๋ฅ˜์˜ ์›น ์•ฑ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•จ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋•Œ๊นŒ์ง€๋Š” ๋‚ด๊ฐ€ ์ด์ „์— ์ž‘์„ฑํ•œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜๋‚  ๋ธŒ๋ผ์šฐ์ €์—์„œ ES ๋ชจ๋“ˆ๊ณผ TypeScript๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์†”๋ฃจ์…˜์„ ์ฐพ๊ณ  ์žˆ๋Š” ๋‚˜์™€ ๊ฐ™์€ ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด https://github.com/guybedford/es-module-shims๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ์‚ฌ์–‘ ํ™•์ • ๋ฐ ๋ธŒ๋ผ์šฐ์ € ๊ตฌํ˜„์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ํŒจํ‚ค์ง€ ์ด๋ฆ„ ๋งต์— ๋Œ€ํ•œ ์ผ์ข…์˜ ํด๋ฆฌํ•„ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. TypeScript(TS ์ปดํŒŒ์ผ๋Ÿฌ ์ œ์™ธ)์—์„œ ๊ฐ„๋‹จํ•œ ์›น ์•ฑ์„ ์ž‘์„ฑํ•  ๋•Œ ๋นŒ๋“œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ ค๋Š” @QuantumInformation ์˜ ๋ฌธ์ œ(๋‚ด ๋ฌธ์ œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€)๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

import 'knockout'

export class MyViewModel {
    greeting: KnockoutObservable<string>
    target: KnockoutObservable<string>
    constructor() {
        this.greeting = ko.observable('hello')
        this.target = ko.observable('world')
    }
}
<!DOCTYPE html>


md5-f28d4b503a1603c40bfeb342f341bfbe


<main>
    <span data-bind='text: `${greeting()} ${target()}`'></span>
    <script type='module-shim'>
        import 'knockout'
        import { MyViewModel } from 'index'
        ko.applyBindings(new MyViewModel())
    </script>
</main>

์ด๋ก ์ ์œผ๋กœ, ์ผ๋‹จ ํŒจํ‚ค์ง€ ์ด๋ฆ„ ๋งต์ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง€์›๋˜๋ฉด HTML ํŒŒ์ผ์—์„œ type='module-shim' ๋ฅผ type='module' ๋กœ ์ฐพ๊ฑฐ๋‚˜ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๊ณ  packagemap ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ตœ์ข…์ ์œผ๋กœ packagemap ํฌํ•จ์„ ์œ„ํ•ด ์ตœ์ข…์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํˆฌ๊ธฐ.

.js ํ™•์žฅ์ž๋Š” ๋ธŒ๋ผ์šฐ์ €๋‚˜ ๊ทธ ๋ฐ–์˜ ๋‹ค๋ฅธ ๊ฒƒ๋“ค์— ์˜ํ•ด ์š”๊ตฌ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ๋„ ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์›น์„œ๋ฒ„๋ฅผ unpkg ์ด์ƒ์œผ๋กœ ๊ตฌ์„ฑํ•˜๊ณ  .js ํŒŒ์ผ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™•์žฅ ์—†๋Š” ์š”์ฒญ URL. ์›น ์„œ๋ฒ„ ์ธก์—์„œ ๋ชจ๋‘ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@weswigham ๋งค์šฐ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด tsc(๋ฐ ํด๋ž˜์‹ ๋…ธ๋“œ ๋ชจ๋“ˆ ํ•ด์ƒ๋„)๋Š” ./foo ๋ฐ ./foo.js ๊ฐ€ ๋™์ผํ•œ ํŒŒ์ผ์„ ์ฐธ์กฐํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์›น์„œ๋ฒ„ ๋ฆฌ๋””๋ ‰์…˜. ๊ฐ€์ ธ์˜ฌ ๋•Œ๋งˆ๋‹ค ์ •ํ™•ํžˆ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํŒŒ์ผ์„ ์ฐธ์กฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ์ด ๋ฌธ์ œ๋Š” TypeScript ์ƒ์„ฑ ๋ชจ๋“ˆ์ด ์˜ค๋Š˜๋‚  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์„ ๋ง‰์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ํ•ญ์ƒ .js ํ™•์žฅ์ž๋ฅผ ๊ฐ€์ง„ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค์‹ญ์‹œ์˜ค. tsc๋Š” ์˜ฌ๋ฐ”๋ฅธ ์ผ์„ ํ•˜๊ณ  .ts ํŒŒ์ผ์—์„œ ์œ ํ˜•์„ ํ™•์ธํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ์„ ์–ป์Šต๋‹ˆ๋‹ค.

@weswigham ์›น ์„œ๋ฒ„์— ์•ก์„ธ์Šคํ•˜์ง€ ์•Š๊ณ  ํŒŒ์ผ์„ ์ œ๊ณตํ•˜๋Š” ์ƒํ™ฉ์ด ์žˆ์Œ์„ ๋ช…์‹ฌํ•˜์‹ญ์‹œ์˜ค. GitHub Pages, IPFS, S3 ๋“ฑ. ๋‹จ์ผ ํŽ˜์ด์ง€ ์•ฑ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ถœํ˜„์œผ๋กœ "์„œ๋ฒ„๋ฆฌ์Šค"๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ ์  ๋” ์ผ๋ฐ˜ํ™”๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(์—ฌ๊ธฐ์„œ ์„œ๋ฒ„๋ฆฌ์Šค๋Š” ์ž์‚ฐ ์ œ๊ณต์„ ์ œ์–ด/๊ตฌ์„ฑํ•˜๋Š” ์„œ๋ฒ„ ์—†์ด ์˜๋ฏธํ•จ). apple ์— ๋Œ€ํ•œ ์š”์ฒญ์ด ์žˆ์„ ๋•Œ apple.js ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋ฒ„ ์ธก ํ•„ํ„ฐ์— ์˜์กดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ฐ€์ ธ์˜ฌ ๋•Œ๋งˆ๋‹ค ์ •ํ™•ํžˆ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํŒŒ์ผ์„ ์ฐธ์กฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ž‘์„ฑ ๊ธฐ๋ณธ ์„ค์ •์— ๋”ฐ๋ผ ํ•ญ์ƒ ํ•˜๋‚˜ ๋˜๋Š” ๋‹ค๋ฅธ 404๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•ด์•ผ ํ•˜๋Š” ์œ ์‚ฌํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ํ•ญ์ƒ .js ํ™•์žฅ์ž๋ฅผ ๊ฐ€์ง„ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ, ๊ทธ๊ฒƒ๋„ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@QuantumInformation ์—ฌ๊ธฐ์— ์‚ฌ์šฉ๋œ ์Šค๋‹ˆํŽซ์ด ๊ณต๊ฐœ์šฉ์ธ๊ฐ€์š”? ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๐Ÿ˜ƒ

@distante ๋„ค ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

์ฐธ๊ณ ๋กœ Jest๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†Œ์Šค์—์„œ .js์— ๋Œ€ํ•œ ํ™•์žฅ์„ ํ…Œ์ŠคํŠธํ•˜๊ณ  ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ - ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ jest ๊ตฌ์„ฑ์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  "jest": {
    ...
    "moduleNameMapper": {
      "(.*)\\.js": "$1"
    }
  }

์•ˆ๋…•ํ•˜์„ธ์š” @MrAntix ,

๋‚˜๋Š” jest๊ฐ€ TypeScript์— ์ ์‘ํ•ด์•ผ ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด์ง€ ๊ทธ ๋ฐ˜๋Œ€๊ฐ€ ์•„๋‹Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋นŒ๋“œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ ค๋Š” ๋‹ค๋ฅธ ์‚ฌ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์šฐ๋ฆฌ์˜ ์ตœ๊ณ ์ž…๋‹ˆ๊นŒ?

https://github.com/microsoft/TypeScript/issues/16577#issuecomment -452312753

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค(js๊ฐ€ ์•„๋‹Œ ts ํŒŒ์ผ์ด๋”๋ผ๋„) ๐Ÿ˜ข

Screenshot 2019-06-05 at 22 47 49

๋ˆ„๊ตฐ๊ฐ€ ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด:
https://github.com/QuantumInformation/web-gen-bot

๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ tsconfig์—์„œ ์ž‘๋™ํ•˜๋„๋ก ์†Œ์Šค ๋””๋ฒ„๊น…์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์œผ๋ฉฐ ๋‹ค์‹œ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ๋‚˜๋Š” webpack์œผ๋กœ ๋Œ์•„๊ฐ”๊ณ  node_modules๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ๋นŒ๋“œ ๋„๊ตฌ์—์„œ ๋ฒ—์–ด๋‚˜๋ ค๊ณ  ํ•  ๋•Œ ํ‚ฌ๋Ÿฌ์˜€์Šต๋‹ˆ๋‹ค.

Jest ๋ฟ๋งŒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ฒŒ์‹œํ•˜๊ธฐ ์ „์— TypeScript๋ฅผ ์ปดํŒŒ์ผํ•˜๊ธฐ ์œ„ํ•ด tsc ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ฒฐ๊ณผ ํŒจํ‚ค์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ชจ๋“  JS ๋ชจ๋“ˆ์€ ๋ชจ๋“ˆ ํ•ด์ƒ๋„์˜ ์ฐจ์ด๋กœ ์ธํ•ด ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋…ผ์˜๋Š” ๋‘ ๊ฐ€์ง€ ๊ด€๋ จ๋˜์ง€๋งŒ ๊ถ๊ทน์ ์œผ๋กœ ๋ณ„๊ฐœ์˜ ๋ฌธ์ œ๋กœ ์•ฝ๊ฐ„ ๊ฐˆ๋ผ์ง„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • Typescript๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Typescript๋Š” ๋…ธ๋“œ ๋ชจ๋“ˆ ๊ฒฝ๋กœ๊ฐ€ ํ•ญ์ƒ ์œ ํšจํ•œ URL์ด ์•„๋‹ˆ๋ผ๋Š” ์‚ฌ์‹ค์„ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ๋ฌธ์ œ๋Š” ๋ถ„๋ช…ํžˆ typescript๋งŒ์œผ๋กœ๋Š” ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ์ด๋ฏ€๋กœ ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ œ์— ์ง‘์ค‘ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ œ๋Š” Typescript๊ฐ€ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ณ  ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. Typescript๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ์›น์•ฑ์„ ๊ตฌ์ถ•ํ•˜๋ ค๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ฃผ์š” ์ฐจ๋‹จ๊ธฐ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ œ ์ƒ๊ฐ์— ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์š”์•ฝ๋ฉ๋‹ˆ๋‹ค.

tsc ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ํ™•์žฅ์ž๊ฐ€ .js ์ธ ํŒŒ์ผ ํ•˜๋‚˜๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์ฒซ ๋ฒˆ์งธ .js ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋‹ค๋ฅธ ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜๋ฉด ์‚ฌ์šฉํ•  ํ™•์žฅ๋ช…์ด ๋ชจํ˜ธํ•˜์ง€ ์•Š์œผ๋ฉฐ ํ™•์žฅ์ž๋ฅผ ํฌํ•จํ•˜๋Š” ์˜ต์…˜์ž…๋‹ˆ๋‹ค.

Typescript๊ฐ€ ์ƒ์„ฑํ•˜๋Š” ํŒŒ์ผ ์ด์™ธ ์˜ ํŒŒ์ผ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ชจ๋“  import ๋ฌธ์— ๋Œ€ํ•ด (Typescript๊ฐ€ ์˜ค๋Š˜๋‚  ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ) ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋‘๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ์˜ต์…˜์— ๋”ฐ๋ฅด๋ฉด ๋ช…๋ น์ค„ arg๊ฐ€ ๊ฐ€์žฅ ์ข‹๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ ๊บผ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ webpack์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ webpack์ด ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋ง์„ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ์— .js๊ฐ€ ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ง์„ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–ด์จŒ๋“  node_modules๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ ๋ธŒ๋ผ์šฐ์ € ์•ฑ์— ๋Œ€ํ•œ ํ•ดํ‚น ์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•œ ํ‚ฌ๋Ÿฌ์˜€์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ webpack์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ webpack์ด ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋ง์„ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ์— .js๊ฐ€ ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ง์„ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Webpack์€ .js ํ™•์žฅ์ž๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ์ฐจ์ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ Webpack๊ณผ ํ•จ๊ป˜ .js ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(์ด๋ฆ„์€ ๊ฐ™์ง€๋งŒ ํ™•์žฅ์ž๊ฐ€ ๋‹ค๋ฅธ ํŒŒ์ผ์ด ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋Š” ๊ฒฝ์šฐ).

Webpack์œผ๋กœ .js ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์›ํ•˜์ง€ ์•Š๋Š” ์ด์œ ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ I don't want ๋ผ๊ณ  ๋งํ•  ๋•Œ ๋‚˜๋Š” ๋‚ด ์œ ์Šค ์ผ€์ด์Šค์— ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๋™์ž‘์ด ๋˜์–ด์„œ๋Š” ์•ˆ ๋˜๋Š” ๊ฐ•๋ ฅํ•œ ์ด์œ ๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค(ํ•ญ์ƒ ๋‹ค๋ฅธ ๊ตฌ์„ฑ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๊บผ๋ คํ•ฉ๋‹ˆ๋‹ค...)

๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ .js ๋กœ ์„ค์ •ํ•˜๋ฉด ts-node๊ฐ€ ํŒŒ์ผ์— ๋Œ€ํ•ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ts-node๊ฐ€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํŒŒ์ผ๋งŒ ์ปดํŒŒ์ผํ•˜๊ณ  ๋ฐฉ์ถœ๋œ ํŒŒ์ผ ๋‚ด์šฉ์ด require('./foo.js') ๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ nodejs๊ฐ€ ํ•ด๋‹น ํŒŒ์ผ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ./foo.js ๋กœ๋“œ๋ฅผ ์‹œ๋„ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋””์Šคํฌ์˜ ๋ชจ๋“  ์œ„์น˜์— ์žˆ์œผ๋ฏ€๋กœ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ์ฝ”๋“œ๊ฐ€ require( ./foo )๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์œผ๋ฉด ts-node์˜ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ./foo.ts ๋ฅผ JS๋กœ ์ปดํŒŒ์ผํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

TypeScript๊ฐ€ ๋ชจ๋“  ๊ฒฝ์šฐ์— .js ํ™•์žฅ์„ ๋‚ด๋ณด๋‚ด๋ฉด ts-node์—์„œ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ™•์žฅ์ด ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ† ๊ธ€ํ•˜๋Š” ์˜ต์…˜์ด ์žˆ๋Š” ๊ฒฝ์šฐ ts-node๋Š” ํ•ด๋‹น ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์„ ํ•ด์ œํ•˜์—ฌ ํ˜„์žฌ ์‹œ์Šคํ…œ์ด ๊ณ„์† ์ž‘๋™ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Node.js --experimental-modules ์—๋Š” ํ•„์ˆ˜ ํŒŒ์ผ ํ™•์žฅ์ž๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ์ด์— ๋Œ€ํ•œ API๋Š” ์ข…์†์„ฑ ๋ถ„์„ ์—†์ด ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค --jsext ์™€ ๊ฐ™์€ ์˜ต์…˜์€ $ .ts ํ™•์žฅ์ž๋ฅผ .js ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. import 'npmpkg.ts' .ts ๋กœ ๋๋‚˜๋Š” ํŒจํ‚ค์ง€ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ๋Š” ๊ทนํžˆ ๋“œ๋ฌผ์ง€๋งŒ ํ•ด๊ฒฐ์—์„œ ํฌ๊ด„์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ๋‹ค์Œ ํ–‰์„ ๋”ฐ๋ผ _bare specifiers_์— ๋Œ€ํ•œ ์˜ˆ์™ธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๊ทœ์น™์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - ๋งŒ์•ฝ ๋ฒ ์–ด ์ง€์ •์ž(URL ๋˜๋Š” ์ƒ๋Œ€ ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹˜)๊ฐ€ ์œ ํšจํ•œ npm ํŒจํ‚ค์ง€ ์ด๋ฆ„( ์ผ์น˜ํ•˜๋Š” /^(@[-_\.a-zA-Z\d]+\/)?[-_\.a-zA-Z\d]+$/ , from https://github.com/npm/validate-npm-package-name) ๊ทธ๋Ÿฐ ๋‹ค์Œ ์žฌ์ž‘์„ฑ์—์„œ .ts ํ™•์žฅ์„ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

.js ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ์ƒ๋Œ€ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฒฝ๋กœ์— ์ถ”๊ฐ€ํ•˜๋Š” TypeScript ์ปดํŒŒ์ผ๋Ÿฌ ๋ณ€ํ™˜๊ธฐ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, .ts ํŒŒ์ผ์— import { Foo } from './foo' ๊ฐ€ ์žˆ์œผ๋ฉด import { Foo } from './foo.js' ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. NPM์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ง€์นจ์€ ํ”„๋กœ์ ํŠธ ์ถ”๊ฐ€ ์ •๋ณด์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/Zoltu/typescript-transformer-append-js-extension

์ด์™€ ๊ฐ™์€ ๊ฒƒ์ด TypeScript ์ปดํŒŒ์ผ๋Ÿฌ์— ํ†ตํ•ฉ๋œ๋‹ค๋ฉด(์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์œผ๋กœ) .js ํ™•์žฅ์ž๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ์™€ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์„ ๋•Œ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ๋” ํ˜„๋ช…ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ./ ๋˜๋Š” ../ ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ๋กœ๋ฅผ ์ฐพ๊ณ  ๊ฒฝ๋กœ์˜ ๋‹ค๋ฅธ ๊ณณ์—๋Š” . ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ _์‹ค์ œ๋กœ_ ๊ทธ๋Ÿฌํ•œ ๊ทน๋‹จ์ ์ธ ๊ฒฝ์šฐ์— ๋ถ€๋”ชํž์ง€ ์—ฌ๋ถ€์— ์˜๋ฌธ์„ ์ œ๊ธฐํ•˜์ง€๋งŒ, ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๊ทน๋‹จ์ ์ธ ๊ฒฝ์šฐ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์˜ฌ๋ฐ”๋ฅธ ์ผ์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

@MicahZoltu ์ด์— ๋Œ€ํ•œ userland ์†”๋ฃจ์…˜์„ ๋ณด๋‹ˆ ๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค. TypeScript ํ™•์žฅ ์˜ต์…˜์ด _์ปดํŒŒ์ผ ์‹œ .ts ํ™•์žฅ์„ .js ํ™•์žฅ์œผ๋กœ ์ „ํ™˜_ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฉ˜ํƒˆ ๋ชจ๋ธ์ด ํ•ญ์ƒ ํŒŒ์ผ ํ™•์žฅ์„ ํฌํ•จ ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ•ด๊ฒฐ ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ณ  ".ts"๋กœ ๋๋‚˜๋Š” npm ํŒจํ‚ค์ง€ ์ด๋ฆ„์˜ ๊ฒฝ์šฐ๋งŒ ๋‚จ๊ฒŒ ๋˜๋ฉฐ, ์ด๋Š” ์ด์ „ ์˜๊ฒฌ์—์„œ ๋…ผ์˜ํ•œ ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@guybedford .ts ํŒŒ์ผ์— .js ํ™•์žฅ์ž๋ฅผ ํฌํ•จํ•˜๋ฉด ts-node์—์„œ ํŒŒ์ผ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ts-node์—์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์€ NodeJS๊ฐ€ ํŒŒ์ผ ํ™•์ธ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ธํ•ด ๊ฒฐ์ฝ” ๊ฐ„๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํ•˜๋“œ ์ฝ”๋”ฉ๋œ .js ํ™•์žฅ์ž๊ฐ€ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฒŒ์‹œํ•˜๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ts-node๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. https://github.com/TypeStrong/ts-node/issues/783์—์„œ ์ด์— ๋Œ€ํ•œ ํ† ๋ก ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

@MicahZoltu ๋‚ด ๋ง์€ .ts ํŒŒ์ผ์— .ts ํ™•์žฅ์ž๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@guybedford .ts ํŒŒ์ผ์— .js ํ™•์žฅ์ž๋ฅผ ํฌํ•จํ•˜๋ฉด ts-node์—์„œ ํŒŒ์ผ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋…ธ๋“œ์™€ ๋ธŒ๋ผ์šฐ์ €์—์„œ TypeScript๋ฅผ ์ž๋™ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋‚˜์œ ์ƒ๊ฐ์ธ ๋˜ ๋‹ค๋ฅธ ์ด์œ ์ž…๋‹ˆ๋‹ค.

@MicahZoltu .ts ํŒŒ์ผ์— .ts ํ™•์žฅ์ž๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์˜ ๋ฌธ์ œ๊ฐ€ .ts ํŒŒ์ผ๊ณผ .js / .d.ts ์Œ ์‚ฌ์ด์˜ ๋™๋“ฑ์„ฑ์„ ๊นจ๋œจ๋ฆฐ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํ˜„์žฌ ํ”„๋กœ์ ํŠธ๋กœ ์ปดํŒŒ์ผ๋œ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ .ts ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํŒŒ์ผ์„ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ .js ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. .

์ด๊ฒƒ์€ ๋˜ํ•œ ์ถœ๋ ฅ์ด ๋ณ€์••๊ธฐ ์—†์ด ํ‘œ์ค€ ํ™˜๊ฒฝ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. .tsconfig ํŒŒ์ผ์—์„œ ๋ณ€ํ™˜๊ธฐ๋ฅผ ์„ค์น˜ํ•  ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ํ•ญ์ƒ ์‚ฌ์šฉ์ž ์ •์˜ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. .js .ts ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ž‘์€ ์ด์ ์„ ์œ„ํ•ด ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์€ ๊ฝค ํฐ ์žฅ๋ฒฝ์ž…๋‹ˆ๋‹ค.

์ฆ‰, ํ˜„์žฌ ํ”„๋กœ์ ํŠธ๋กœ ์ปดํŒŒ์ผ๋œ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ .ts๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํŒŒ์ผ์„ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ .js๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์™ธ๋ถ€/๋‚ด๋ถ€ ์ˆ˜์ž… ๊ฒฝ๊ณ„๋Š” ์ž˜ ์ •์˜๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ข…์†์„ฑ์ด ํ˜„์žฌ ๋™์ผํ•œ ๋นŒ๋“œ์˜ ๋‚ด๋ถ€ .ts ํŒŒ์ผ์—์„œ ๋ณ„๋„์˜ ๋นŒ๋“œ๊ฐ€ ์žˆ๊ฑฐ๋‚˜ TypeScript๊ฐ€ ์•„๋‹ ์ˆ˜๋„ ์žˆ๋Š” ๋‹ค๋ฅธ ํŒจํ‚ค์ง€ ๊ฐ€์ ธ์˜ค๊ธฐ์˜ ์™ธ๋ถ€ .js ํŒŒ์ผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ , ๊ทธ๋Ÿฌ๋ฉด ๋„ค, ์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ฐœ๋…์ด๋ฏ€๋กœ ํ™•์žฅ์ž๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋˜ํ•œ ์ถœ๋ ฅ์ด ๋ณ€์••๊ธฐ ์—†์ด ํ‘œ์ค€ ํ™˜๊ฒฝ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋ณ€ํ™˜๊ธฐ๊ฐ€ ์ด๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ --ts-to-js ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ/์˜ต์…˜์€ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋งค์šฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@guybedford .ts ๋ฅผ ๋„ฃ๋Š” ๊ฒƒ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๋Œ€ํ•ด ์˜ฌ๋ฐ”๋ฅธ ์ผ์ด๋ผ๊ณ  ์ €๋ฅผ ์„ค๋“ํ•˜์…จ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ–ˆ์„ ๋•Œ TypeScript๊ฐ€ ์‹ค์ œ๋กœ ๊ทธ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค!

// foo.ts
export function foo() { console.log('foo') }
// bar.ts
import { foo } from './foo.ts' // Error: An import path cannot end with a '.ts' extension. Consider importing './foo' instead
foo()

์•ˆ๋…•ํ•˜์„ธ์š”, ์ด๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?


์ž…๋ ฅ:

// src/lib.js.ts
export const result = 42;
// src/index.js.ts
import { result } from "./lib.js";

console.log(result);

์‚ฐ์ถœ:

// build/lib.js
export const result = 42;
// build/index.js
import { result } from "./lib.js";

console.log(result);

๋ฌธ์ œ #30076

TypeScript ํŒŒ์ผ์˜ ์œ ์ผํ•œ .ts ํ™•์žฅ์ž๊ฐ€ ๋‚˜์—๊ฒŒ ๊ฐ€์žฅ ์ ํ•ฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ข…์ข… ์ปดํŒŒ์ผ ์‹œ๊ฐ„๊นŒ์ง€ ๋Œ€์ƒ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ”„๋กœ์ ํŠธ์—๋Š” .js ํŒŒ์ผ์„ ๋‚ด๋ณด๋‚ด๊ณ  ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฒฝ๋กœ๋ฅผ .js ์— ๋งคํ•‘ํ•ด์•ผ ํ•˜๋Š” ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ์—ฌ๋Ÿฌ tsconfig.json ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” .mjs ํŒŒ์ผ์„ ๋‚ด๋ณด๋‚ด๊ณ  ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฒฝ๋กœ๋ฅผ .mjs ์— ๋งคํ•‘ํ•ด์•ผ ํ•˜๋Š” ์ตœ์‹  ๋…ธ๋“œ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

.ts ๋กœ ๋๋‚˜๋Š” ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์˜ค๋ฅ˜๋ผ๋Š” @MicahZoltu ๋Š” ์‹ค์ œ๋กœ ์šฐ๋ฆฌ์—๊ฒŒ ์ด์ต์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ”Œ๋ž˜๊ทธ ์—†์ด .ts ํ™•์žฅ์„ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ์ปดํŒŒ์ผ ์‹œ .ts ~ .js ํ™•์žฅ ์žฌ์ž‘์„ฑ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. :)

ํ›„ํ–‰ .ts ํ™•์žฅ์„ ์ง€์›ํ•˜๊ณ  .js ํ™•์žฅ์œผ๋กœ ๋‹ค์‹œ ์“ฐ๋Š” PR(์ด ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ํ”Œ๋ž˜๊ทธ ์•„๋ž˜ ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” ํ”Œ๋ž˜๊ทธ)์ด ์ข‹์€ ๋ฐฉ๋ฒ•์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

//cc @DanielRosenwasser

์ด ๋ฌธ์ œ๋Š” ์ด๋ฏธ ๋„ˆ๋ฌด ๊ธธ๊ธฐ ๋•Œ๋ฌธ์— ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด๋ฏธ ์ด๊ฒƒ์„ ๋งํ–ˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฏธ ๋งํ•œ ๊ฒƒ์„ ๋ฐ˜๋ณตํ•  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

TypeScript๋Š” ์œ ํšจํ•œ JavaScript์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๊ฐ€ import ์— ํ™•์žฅ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ JS/TS ํ™•์žฅ์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค! ESM์—์„œ๋Š” MIME ์œ ํ˜•์ด ์ •ํ™•ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ชจ๋“  ํ™•์žฅ์ด ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

import actuallyCode from './lookLikeAnImage.png';

...์„œ๋ฒ„๊ฐ€ ํ•ด๋‹น ํŒŒ์ผ์—์„œ ์œ ํšจํ•œ JavaScript๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅธ MIME ์œ ํ˜•์„ ์„ค์ •ํ•˜๋Š” ํ•œ ์œ ํšจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ TS์— ๋Œ€ํ•ด์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋” ๋‚˜์•„๊ฐ‘๋‹ˆ๋‹ค! TS ํŒŒ์ผ์€ JS MIME ์œ ํ˜•๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” JS ์†Œ์Šค ์ฝ”๋“œ์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ESM ๋ชจ๋“ˆ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์œ„ํ•œ ์œ ํšจํ•œ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค.

IMO TypeScript๋Š” (์˜ค๋Š˜๋‚  ์›ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ) ํ™•์žฅ์ž๊ฐ€ ์—†๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ๋งŒ ๊ณ ๋ คํ•˜๊ณ  ์˜ค๋ฅ˜, ๊ฒฝ๊ณ  ๋“ฑ์ด ์—†๋Š” ํ™•์žฅ์ž๋ฅผ ๊ทธ๋Œ€๋กœ ๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด JS์˜ ์ƒ์œ„ ์ง‘ํ•ฉ์ด๋ผ๊ณ  ์ฃผ์žฅํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ฝค ๋ถˆํ–‰ํ•œ ์œ ํšจํ•œ JavaScript ์ฝ”๋“œ๋ฅผ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์ด๊ฒƒ์„ ์ œ๊ธฐํ•˜๊ธฐ์— ์ ํ•ฉํ•œ ์žฅ์†Œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ๋ณด์•˜์Šต๋‹ˆ๋‹ค: #18971, #16640, #16640 ๊ทธ๋Ÿฌ๋‚˜ ์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ๋ฌธ์ œ๋Š” ์ขŒ์šฐ๋กœ ๋‹ซํ˜€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์œผ๋ฏ€๋กœ ์ด๊ฒƒ์ด "์ฃผ์š”" ๋ฌธ์ œ๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์—ด๋ฆฐ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋„๋ก ํ—ˆ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

NodeJS v12.7.0 ์‚ฌ์šฉํ•˜๊ธฐ

salathiel@salathiel-genese-pc:~/${PATH_TO_PROJECT}$ node --experimental-modules dist/spec/src/ioc
(node:15907) ExperimentalWarning: The ESM module loader is experimental.
internal/modules/esm/default_resolve.js:59
  let url = moduleWrapResolve(specifier, parentURL);
            ^

Error: Cannot find module '${PROJECT_ROOT}/dist/spec/src/ioc' imported from ${PROJECT_ROOT}/
    at Loader.resolve [as _resolve] (internal/modules/esm/default_resolve.js:59:13)
    at Loader.resolve (internal/modules/esm/loader.js:73:33)
    at Loader.getModuleJob (internal/modules/esm/loader.js:149:40)
    at Loader.import (internal/modules/esm/loader.js:133:28)
    at internal/modules/cjs/loader.js:830:27
    at processTicksAndRejections (internal/process/task_queues.js:85:5) {
  code: 'ERR_MODULE_NOT_FOUND'
}
salathiel@salathiel-genese-pc:~/${PATH_TO_PROJECT}$ node --experimental-modules dist/spec/src/ioc.js
(node:16155) ExperimentalWarning: The ESM module loader is experimental.
internal/modules/esm/default_resolve.js:59
  let url = moduleWrapResolve(specifier, parentURL);
            ^

Error: Cannot find module '${PROJECT_ROOT}/dist/spec/src/observe' imported from ${PROJECT_ROOT}/dist/spec/src/ioc.js
    at Loader.resolve [as _resolve] (internal/modules/esm/default_resolve.js:59:13)
    at Loader.resolve (internal/modules/esm/loader.js:73:33)
    at Loader.getModuleJob (internal/modules/esm/loader.js:149:40)
    at ModuleWrap.<anonymous> (internal/modules/esm/module_job.js:43:40)
    at link (internal/modules/esm/module_job.js:42:36) {
  code: 'ERR_MODULE_NOT_FOUND'
}

์ด์ œ ์ด๊ฒŒ ์™œ ์งœ์ฆ๋‚˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ๋„ค์š”...

ํ˜„์žฌ TypeScript๋Š” ๊ฒฝ๋กœ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ์งœ์ฆ๋‚˜์ง€๋งŒ ํ˜„์žฌ .js ํ™•์žฅ์ž๋ฅผ ์ง์ ‘ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@DanielRosenwasser https://github.com/microsoft/TypeScript/issues/16577#issuecomment -309169829

์˜ต์…˜ ๋’ค์— ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? --rewrite-paths ( rewritePaths: true ) ?

@viT-1 ๋‹น๋ถ„๊ฐ„ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://github.com/microsoft/TypeScript/issues/16577#issuecomment -507504210

@MicahZoltu SystemJS ๋ฒˆ๋“ค๋ง(tsconfig outFile ์˜ต์…˜)์œผ๋กœ ๋‚ด ์œ ์Šค์ผ€์ด์Šค ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ด๊ฒƒ์— ๋Œ€ํ•ด ์“ด ๋ชจ๋“  ๋Œ“๊ธ€์„ ์ฝ์ง€๋Š” ์•Š์•˜์ง€๋งŒ ์™œ ๋‚ด๊ฐ€ .js ๋ฅผ ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ์ด ์จ์•ผ ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ปดํ“จํ„ฐ๊ฐ€ ๋‚˜๋ฅผ ์œ„ํ•ด ๊ทธ๊ฒƒ์„ ํ•ด์ฃผ๊ธฐ๋ฅผ ์›ํ•œ๋‹ค.

@richardkazuomiller ์šฐ๋ฆฌ ๋ชจ๋‘ ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ณ  ์žˆ์ง€๋งŒ @DanielRosenwasser ๋Š” https://github.com/microsoft/TypeScript/issues/16577#issuecomment -448747209์—์„œ ๊ทธ๋“ค์ด ์ง€๊ธˆ ๋‹น์žฅ์€ ๊ทธ๋ ‡๊ฒŒ ํ•  ์˜ํ–ฅ์ด ์—†๋‹ค๊ณ  ๋ฐํ˜”์Šต๋‹ˆ๋‹ค(์ด ๋ฌธ์ œ๊ฐ€ ์—ฌ์ „ํžˆ ์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€ ์žˆ๊ฒŒ ์—ด๋ ค ์žˆ๋‹ค๋Š” ์ ์— ๋†€๋ž์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์ง„์ˆ  ์ดํ›„ ์˜ค๋žซ๋™์•ˆ). ์ปดํ“จํ„ฐ๊ฐ€ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•˜๋ ค๋ฉด ๋ฒˆ๋“ค๋Ÿฌ ๋˜๋Š” ํƒ€์‚ฌ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฒฝ๋กœ ์žฌ์ž‘์„ฑ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๊นŒ?

๋‹ซ์ง€ ๋งˆ์‹ญ์‹œ์˜ค. TypeScript ํŒ€์ด ํ™•์žฅ์„ ์‚ฌ์šฉํ•˜๊ณ  ๋Œ€์‹  MIME ์œ ํ˜•์— ์˜์กดํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ESM ๊ฐ€์ ธ์˜ค๊ธฐ์— ์–ด๋–ป๊ฒŒ ์ ‘๊ทผํ• ์ง€์— ๋Œ€ํ•ด ์—ฌ์ „ํžˆ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ด๊ฒƒ์€ JavaScript์—์„œ๋Š” ๊ฐ€๋Šฅํ•˜์ง€๋งŒ TypeScript์—์„œ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. (์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ด์ „ ๋Œ“๊ธ€์„ ์ฐธ์กฐํ•˜์„ธ์š”.)

@TomasHubelbauer ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ๊ตฌ์„ฑ ํŒŒ์ผ์— ํ”Œ๋ž˜๊ทธ๋ฅผ ์ œ์•ˆํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋ชจ๋“  ํ™•์žฅ์ž๊ฐ€ ์—†๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ์— .js(๋˜๋Š” ๊ธฐํƒ€ ๊ตฌ์„ฑ๋œ) ํ™•์žฅ์ž๊ฐ€ ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•จ์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์˜ตํŠธ์ธ(opt-in)์ด๋ฏ€๋กœ ๊ธฐ๋ณธ๊ฐ’์ด false์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ธฐ์กด ํ”„๋กœ์ ํŠธ ๋˜๋Š” ์š”๊ตฌ ์‚ฌํ•ญ์ด ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ด์ „์— ๋งํ–ˆ๋“ฏ์ด:

์–ด๋–ค ๋ฒ„์ „์˜ TS๊ฐ€ ์ถ”๊ฐ€ํ–ˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ' ./file.js' ์™€ ๊ฐ™์€ ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ์ด์ œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค(ํŒŒ์ผ์ด ์‹ค์ œ๋กœ file.ts์ธ ๊ฒฝ์šฐ์—๋„).
TypeScript๋Š” ํŒŒ์ผ์„ ์ž˜ ํ•ด์„ํ•˜๊ณ  ์™„์ „ํ•œ .js ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

์œ ํšจํ•œ JavaScript๊ฐ€ ์œ ํšจํ•œ TypeScript์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—:

import foo from './bar.js'

...JS์—์„œ๋Š” TS์—์„œ๋„ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ํ™•์žฅ์ด ์ •ํ™•ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ ES6 ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋˜ํ•œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ./foo/bar ์— ๋Œ€ํ•œ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๋ณผ ๋•Œ ์‹ค์ œ๋กœ ์š”์ฒญํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์•„๋ฌด๊ฒƒ๋„ ์ œ๊ณต๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ์‚ฌ์‹ค์€ ์„œ๋ฒ„ ๋•Œ๋ฌธ์ด์—ˆ์Šต๋‹ˆ๋‹ค. /foo/bar /foo/bar.js ๋งŒ์กฑ๋˜๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ข‹์€ ์†”๋ฃจ์…˜์ด๊ฑฐ๋‚˜ ์ข‹์€ ์•„์ด๋””์–ด๋ผ๊ณ  ๋งํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๊ธฐ์ˆ ์ ์œผ๋กœ ์ž‘๋™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ํŒŒ์ผ์— ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ์œผ๋ฉด ๋ชจ๋“  ํ™•์žฅ์ž๊ฐ€ ์—†๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ์— .js(๋˜๋Š” ๊ธฐํƒ€ ๊ตฌ์„ฑ๋œ) ํ™•์žฅ์ž๊ฐ€ ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•จ์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ๋ฅผ ํ•ด๊ฒฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. TypeScript ํŒ€์ด ์ด ๊ตฌ์„ฑ ์˜ต์…˜์— ๋Œ€ํ•ด PR์„ ๊ณ ๋ คํ•  ์˜ํ–ฅ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

NodeJS๋Š” ์ด์ œ _๊ธฐ๋ณธ์ ์œผ๋กœ_ ์ƒ๋Œ€ ๊ฒฝ๋กœ ๋ชจ๋“ˆ ํ™•์ธ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์™€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋” ์ด์ƒ ๊ธฐ๋ณธ์ ์œผ๋กœ .js ํ™•์žฅ์ž๋ฅผ ์œ ์ถ”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” TSC์˜ ํ˜„์žฌ ๋™์ž‘์œผ๋กœ ์ธํ•ด ๋ชจ๋“  ๋Ÿฐํƒ€์ž„ ์ปจํ…์ŠคํŠธ์—์„œ ์œ ํšจํ•˜์ง€ ์•Š์€ JS๊ฐ€ ๋ฐฉ์ถœ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ESM์— ๋Œ€ํ•œ ๋ธŒ๋ผ์šฐ์ € ๋ฐ NodeJS ๋™์ž‘ ๋ชจ๋‘์— ๋Œ€ํ•œ ๋ช…ํ™•์„ฑ์ด ์žˆ์œผ๋ฏ€๋กœ ์ด ๋ฌธ์ œ๋ฅผ ์ด์ œ ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

https://nodejs.org/api/esm.html#esm_customizing_esm_specifier_resolution_algorithm

esm์šฉ ์ƒˆ ํ•ด์„๊ธฐ๋Š” ์ƒˆ๋กœ์šด ํ•ด์„ ๋ชจ๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. moduleResolution: node ๋Š” ์‹ค์ œ๋กœ "์ด์ „ ๋ฒ„์ „์˜ ๋…ธ๋“œ"๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๋Š” cjs ํ•ด์„๊ธฐ์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด esm ๋ฆฌ์กธ๋ฒ„๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋ณด๋‹ค ์ ์ ˆํ•˜๊ฒŒ ์ผ์น˜ํ•˜๋Š” ์ƒˆ๋กœ์šด ํ•ด๊ฒฐ ๋ชจ๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ๋…ธ๋“œ๋Š” ๋ชจ๋“  ๊ธฐ์กด ๊ตฌ์„ฑ์—์„œ ์ด์ „ ๋ฆฌ์กธ๋ฒ„๋ฅผ ์™„์ „ํžˆ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŠนํžˆ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. (์ฐธ๊ณ : ๊ทธ๋Ÿฌํ•œ ์ƒˆ๋กœ์šด ๋ฆฌ์กธ๋ฒ„๋ฅผ _์šฐ๋ฆฌ์˜ ๊ธฐ๋ณธ๊ฐ’_์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์–ด๋ ค์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค)

๊ทธ๋Ÿฌ๋‚˜! ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด _๋™์˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ _์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์€ ์˜๊ฒฌ์„ ์‚ฌ์‹ค๋กœ ์ง„์ˆ ํ•˜๊ธฐ๋กœ ์„ ํƒํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค_, ์˜ˆ์ƒ๋˜๋Š” ํ™•์žฅ ๋™์ž‘์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์—ฌ์ „ํžˆ ๊ธฐ๋ณธ๊ฐ’์ด ๋  ์ˆ˜ ์žˆ๋Š” --es-module-specifier-resolution=node ํ”Œ๋ž˜๊ทธ๊ฐ€ ์—ฌ์ „ํžˆ ์žˆ์Šต๋‹ˆ๋‹ค. , es ๋…ธ๋“œ์˜ ๋ชจ๋“ˆ์€ _์—ฌ์ „ํžˆ ์‹คํ—˜์ ์ž…๋‹ˆ๋‹ค_.

๋˜ํ•œ ์›๋ž˜ ์š”์ฒญ์— ๋Œ€ํ•œ ์•Œ๋ฆผ์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ. ์กฐ๊ธˆ๋„. ์ง€์ •์ž ์ž…๋ ฅ === ์ง€์ •์ž ์ถœ๋ ฅ. ์ง€์ •์ž๋Š” ๊ตฌ์กฐ์  ์˜๋„๋ฅผ ์„ค๋ช…ํ•˜๋ฉฐ ์˜๋„๋œ ๊ตฌ์กฐ์—์„œ ๋‹ค๋ฅธ ๊ตฌ์กฐ๋กœ ์•”์‹œ์ ์œผ๋กœ ๋งคํ•‘ํ•˜๋Š” ๊ฒƒ์ด ์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ๊ฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. const varFoo = "./Foo"; import(varFoo) ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค๋ฉด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ™•์žฅ์ž๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ์˜ค - ๋ง๋„ ์•ˆ๋˜๋Š” ์†Œ๋ฆฌ์ž…๋‹ˆ๋‹ค - ๋ชจ๋“  ํ˜•ํƒœ์˜ ๋™์  ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ๋Ÿฐํƒ€์ž„์— ๋™์  ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๋ž˜ํ•‘ํ•ด์•ผ ํ•˜๋ฉฐ ๊ฐ‘์ž๊ธฐ ๋‚ด์žฅ ํ”Œ๋žซํผ ๋กœ๋”์˜ ์ตœ์ƒ์œ„ ๊ณ„์ธต์ธ ์ž์ฒด ๋ชจ๋“ˆ ๋กœ๋”๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ ์— ํ™•์žฅ์„ ์ƒ๋žตํ•˜๋ฉด ์ ์ ˆํ•˜๊ฒŒ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ฆฌ์กธ๋ฒ„ ๋ชจ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค(์ด๋Š” ์˜์‹ฌํ•  ์—ฌ์ง€ ์—†์ด ์ด๋ฏธ ๋ฆฐํŠธ ๊ทœ์น™์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ).

์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ฐพ์•˜๊ณ  ์ž…๋ ฅ ์†Œ์Šค์— ํ™•์žฅ ๊ธฐ๋Šฅ์ด ์—†๋Š” ๊ฒƒ์„ _์ •๋ง ์›_ํ•˜๊ณ , (๋…ธ๋“œ es) ๋ชจ๋“ˆ์„ ๋Œ€์ƒ์œผ๋กœ ํ•  ๋•Œ ์ถœ๋ ฅ์ด ๊ณ„์† ์ž‘๋™ํ•˜๋„๋ก _์ •๋ง ํ•„์š”_ํ•˜๋‹ค๋ฉด, https://github.com/ ์—์„œ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ‘์ž๊ธฐ ์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ ์ž์‹ ์˜ ๋ชจ๋“ˆ ๋กœ๋”๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค

tsc ๋Š” ๋ฌด์Šจ ์ผ์ด ์žˆ์–ด๋„ ๊ธฐ๋Šฅ์  ๋ชจ๋“ˆ ๋กœ๋”์—ฌ์•ผ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๊ฐ€์ ธ์˜จ ๋ชจ๋“ˆ์„ ์ฐพ์„ ์ˆ˜ ์—†์œผ๋ฉด ๊ฐ€์ ธ์˜ค๊ธฐ์— ๋Œ€ํ•ด ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ๋ชจ๋“ˆ ๋กœ๋”๊ฐ€ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ํ˜ธํ™˜๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ๋˜๋Š” ์ตœ์†Œํ•œ ์ˆ˜์šฉํ•˜๊ธฐ์— ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๊ณ ํ†ต์Šค๋Ÿฝ์ง€ ์•Š์€ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด์ œ NodeJS๋Š” ์ƒ๋Œ€ ๊ฒฝ๋กœ ๋ชจ๋“ˆ ํ™•์ธ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €์™€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋” ์ด์ƒ ๊ธฐ๋ณธ์ ์œผ๋กœ .js ํ™•์žฅ์ž๋ฅผ ์œ ์ถ”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” TSC์˜ ํ˜„์žฌ ๋™์ž‘์œผ๋กœ ์ธํ•ด ๋ชจ๋“  ๋Ÿฐํƒ€์ž„ ์ปจํ…์ŠคํŠธ์—์„œ ์œ ํšจํ•˜์ง€ ์•Š์€ JS๊ฐ€ ๋ฐฉ์ถœ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด TypeScript์™€ ๊ฐ™์€ ์ง€์ •์ž์—์„œ .js ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ด์œ ๊ฐ€ ์•„๋‹™๋‹ˆ๊นŒ? ๊ทธ๋Ÿฌ๋ฉด ํ™•์žฅ ์—†๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ์—์„œ tsc ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

tsc๋Š” ๋ฌด์Šจ ์ผ์ด ์žˆ์–ด๋„ ๊ธฐ๋Šฅ์  ๋ชจ๋“ˆ ๋กœ๋”์—ฌ์•ผ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๊ฐ€์ ธ์˜จ ๋ชจ๋“ˆ์„ ์ฐพ์„ ์ˆ˜ ์—†์œผ๋ฉด ๊ฐ€์ ธ์˜ค๊ธฐ์— ๋Œ€ํ•ด ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ๋ชจ๋“ˆ ๋กœ๋”๊ฐ€ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ํ˜ธํ™˜๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ๋˜๋Š” ์ตœ์†Œํ•œ ์ˆ˜์šฉํ•˜๊ธฐ์— ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๊ณ ํ†ต์Šค๋Ÿฝ์ง€ ์•Š์€ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋Ÿฐํƒ€์ž„ ๋กœ๋” ๊ตฌํ˜„์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ๋กœ๋”๊ฐ€ ๋ฌด์—‡์ด๋“  ๋ฐ˜์˜ํ•˜๋Š” ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ๋ถ„์„์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋„, ๊ฐ–๊ณ  ์‹ถ์ง€๋„ ์•Š์€ ๋Ÿฐํƒ€์ž„ ๊ตฌ์„ฑ ์š”์†Œ ์—†์ด ๋ชจ๋“  ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๋‹ค์‹œ ๋งคํ•‘ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

tsc๋Š” ๋ฌด์Šจ ์ผ์ด ์žˆ์–ด๋„ ๊ธฐ๋Šฅ์  ๋ชจ๋“ˆ ๋กœ๋”์—ฌ์•ผ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋Ÿฐํƒ€์ž„์—๋Š” ์—†์Šต๋‹ˆ๋‹ค. tsc ๋Š” ์„ ํƒํ•œ ๋Ÿฐํƒ€์ž„์ด ์ง€์ •์ž๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ๋นŒ๋“œ ์‹œ ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•ด์•ผ ํ•˜์ง€๋งŒ ๋Ÿฐํƒ€์ž„์€ ์ˆœ์ „ํžˆ ํ™˜๊ฒฝ์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ๊ฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. const varFoo = "./Foo"; import(varFoo) ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ™•์žฅ์ž๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@weswigham ์ด๊ฒƒ์€ ๋™์  ๊ฐ€์ ธ์˜ค๊ธฐ์— ๊ด€ํ•œ ๊ฐ•๋ ฅํ•œ ์ฃผ์žฅ์ด์ง€๋งŒ ์ •์  ๊ฐ€์ ธ์˜ค๊ธฐ๋กœ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  _์ƒ๊ฐ_ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ „๋žต์ด ๋‘˜ ๋‹ค ๋™์ผํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ฃผ์žฅ์€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ •์  ๊ฐ€์ ธ์˜ค๊ธฐ๋Š” ๋™์  ๊ฐ€์ ธ์˜ค๊ธฐ์™€ ๋งค์šฐ ๋‹ค๋ฅธ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ์ ์„ ์–ธ๊ธ‰ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์œผ๋ฉฐ ์ •์  ๊ฐ€์ ธ์˜ค๊ธฐ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ์ „๋žต์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด _๋ถˆํ•ฉ๋ฆฌํ•œ_ ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์ ธ์˜ค๊ธฐ ๋‹ค์‹œ ์“ฐ๊ธฐ ๋ฐ ๋™์  ๊ฐ€์ ธ์˜ค๊ธฐ ๋‹ค์‹œ ์“ฐ๊ธฐ.

์ด๊ฒƒ์ด TypeScript์™€ ๊ฐ™์€ ์ง€์ •์ž์—์„œ .js ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ์ด๋ฏธ ์ง€์›ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ด์œ ๊ฐ€ ์•„๋‹™๋‹ˆ๊นŒ? ํ™•์žฅ ์—†๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ์—์„œ tsc์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ชจ๋“  ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

@justinfagnani ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๊ฐ€์ ธ์˜ค๊ธฐ์— .js ํ™•์žฅ์„ ์ง€์ •ํ•˜๋ฉด TS๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ๋Ÿฐํƒ€์ž„(์˜ˆ: TS-Node)์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  2. ๊ฐ€์ ธ์˜ค๊ธฐ์— .js ํ™•์žฅ์ž๋ฅผ ํฌํ•จํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ(IMO)์— ๊ฑฐ์ง“๋ง์„ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

(2)์™€ ๊ด€๋ จํ•˜์—ฌ ๋‘ ๊ฐœ์˜ TS ํŒŒ์ผ a.ts ๋ฐ b.ts ๋ฐ a.ts ๊ฐ€ import ... from './b.js' ํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ "๋‚˜๋Š” ํ˜•์ œ ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„์ด b.js ์ž…๋‹ˆ๋‹ค. ์ด ์ง„์ˆ ์€ ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค. ์„ค์ƒ๊ฐ€์ƒ์œผ๋กœ .b.ts ์™€ b.js (์‹ค์ œ๋กœ ์„œ๋กœ์˜ ํŒŒ์ƒ๋ฌผ์ด ์•„๋‹ ์ˆ˜๋„ ์žˆ์Œ)๊ฐ€ ๋ชจ๋‘ ์žˆ๋Š” ๊ฒฝ์šฐ ์ด์ œ _๋ช…์‹œ์ ์œผ๋กœ ํ™•์žฅ์„ ํฌํ•จํ–ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์–ด๋Š ๊ฒƒ์„ ์ฐธ์กฐํ•˜๋Š”์ง€ ๋ชจํ˜ธํ•ด์ง‘๋‹ˆ๋‹ค.

๋‚˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ (์‚ฌ์šฉ์ž๋กœ์„œ) ์‹ค์ œ๋กœ ๋ฌด์—‡์„ ์›ํ•˜๋Š”์ง€ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ๋งํ•ด์•ผ ํ•˜๊ณ  "X ์ด๋ฆ„๊ณผ ํ™•์žฅ์ž๋ฅผ ๊ฐ€์ง„ ๋ชจ๋“  ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ"( import ... from './foo' ์˜ ๊ฒฝ์šฐ)์„ ์•Œ๋ ค์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ) ๋˜๋Š” "์ด ํŒŒ์ผ์„ ๊ตฌ์ฒด์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ"( import ... from './foo.ext' ์˜ ๊ฒฝ์šฐ). ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ TS ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ ๊ฐ์ง€ํ•˜๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ .js ํŒŒ์ผ์„ ๊ณ„์† ๋‚ด๋ณด๋‚ด๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ ์ ˆํ•œ ํŒŒ์ผ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ฐ€์ ธ์˜ค๋„๋ก ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ import ๋ฌธ์—์„œ .ts ๋ฅผ .js ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@justinfagnani ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. TS๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ๋Ÿฐํƒ€์ž„(์˜ˆ: TS-Node)์€ ๊ฐ€์ ธ์˜ค๊ธฐ์— .js ํ™•์žฅ์ž๋ฅผ ์ง€์ •ํ•˜๋ฉด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ TS-Node์˜ ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค. tsc ์˜ ๋™์ž‘๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  1. ๊ฐ€์ ธ์˜ค๊ธฐ์— .js ํ™•์žฅ์ž๋ฅผ ํฌํ•จํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ(IMO)์— ๊ฑฐ์ง“๋ง์„ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ๋Š” ๊ทธ ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๊ฐ€์ ธ์˜ฌ ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ง„์‹ค์„ ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. .ts ํŒŒ์ผ์ด ์•„๋‹ˆ๋ผ .js ํŒŒ์ผ์„ _๊ฐ€์ ธ์˜ค์ง€_ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ .d.ts / .js ์Œ๊ณผ .ts ํŒŒ์ผ ๊ฐ„์— ๋ˆˆ์— ๋„๋Š” ์ฐจ์ด๊ฐ€ ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์œ ์ผํ•œ ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์€ .js ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. .ts ํŒŒ์ผ์€ ์ปดํŒŒ์ผ ํ›„ ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

@justinfagnani

๋˜ํ•œ .d.ts/.js ์Œ๊ณผ .ts ํŒŒ์ผ ๊ฐ„์— ๋ˆˆ์— ๋„๋Š” ์ฐจ์ด๊ฐ€ ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํ•ญ์ƒ ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค. JS MIME ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  JS, TS ๋ฐ DTS๋ฅผ ์ œ๊ณตํ•˜๋„๋ก ์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑํ•œ ๋‹ค์Œ JavaScript์—์„œ ๋ชจ๋‘ ๊ฐœ๋ณ„์ ์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋Ÿฐํƒ€์ž„์€ ์ด๋ฅผ ๋ชจ๋‘ JS๋กœ ์ถฉ์‹คํžˆ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ESM์€ ํ™•์žฅ์— ๋Œ€ํ•ด ์ „ํ˜€ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— TS ์‚ฌ์šฉ์ž๋Š” ์‹ค์ œ๋กœ .ts ํ™•์žฅ์ž๋ฅผ ํฌํ•จํ•ด์•ผ ํ•˜๊ณ  ํ™•์žฅ์ž๊ฐ€ ์—†๋Š” ํŒŒ์ผ์ด๋‚˜ ๊ทธ ์ด๋ฆ„์„ ์‹ค์ œ๋กœ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๋Š” ํ•œ ํ™•์žฅ์ž๊ฐ€ ์˜ค๋ฅ˜๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  TS๋Š” ์ถœ๋ ฅ์—์„œ โ€‹โ€‹๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ .js ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  JS ํŒŒ์ผ์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ(TS์— ์˜ํ•ด ์ƒ์„ฑ๋œ ํŒŒ์ผ์ด ์•„๋‹˜) ์ด๊ฒƒ๋„ ์˜ค๋ฅ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ TS-Node์˜ ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค. tsc์˜ ๋™์ž‘๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

TS-Node์˜ ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ NodeJS ๋กœ๋”์˜ ์ œํ•œ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. https://github.com/TypeStrong/ts-node/issues/783#issuecomment -507437929

์ด๊ฒƒ์€ ํ•ญ์ƒ ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค. JS MIME ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  JS, TS ๋ฐ DTS๋ฅผ ์ œ๊ณตํ•˜๋„๋ก ์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑํ•œ ๋‹ค์Œ JavaScript์—์„œ ๋ชจ๋‘ ๊ฐœ๋ณ„์ ์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋Ÿฐํƒ€์ž„์€ ์ด๋ฅผ ๋ชจ๋‘ JS๋กœ ์ถฉ์‹คํžˆ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ESM์€ ํ™•์žฅ์— ๋Œ€ํ•ด ์ „ํ˜€ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ž˜ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ €๋„ TypeScript๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ™˜๊ฒฝ์—์„œ ์‹ค์ œ๋กœ ๋กœ๋“œํ•˜๋Š” ํŒŒ์ผ์ด JavaScript ํŒŒ์ผ์ด๋ผ๋Š” ๊ฒƒ์€ ๊ฑฐ์˜ ๋ณดํŽธ์ ์ธ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค.

์ œ ์š”์ ์€ .js / .d.ts ์Œ์ด ์ด๋ฏธ ์žˆ๊ณ  ํƒ€์‚ฌ ํŒจํ‚ค์ง€์—์„œ .js ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋ฉด tsc ๊ฐ€ .d.ts ํŒŒ์ผ์„ ๋ณด๊ณ  ์œ ํ˜•์„ ๋กœ๋“œํ•˜์‹ญ์‹œ์˜ค. ์ฆ‰, .js / .d.ts ์Œ์€ .ts ํŒŒ์ผ๊ณผ ๊ฐ™์ด _acts_ํ•˜๋ฉฐ ์ด๊ฒƒ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ณ  JavaScript์—์„œ TypeScript๋กœ ํˆฌ๋ช…ํ•˜๊ฒŒ ์ด์‹ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด๋ฏ€๋กœ ์ด๋ ‡๊ฒŒ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์‹๋œ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ TS-Node์˜ ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค. tsc์˜ ๋™์ž‘๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

TS-Node์˜ ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ NodeJS ๋กœ๋”์˜ ์ œํ•œ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. TypeStrong/ts-node#783(comment)

TS-Node๊ฐ€ tsc ๋™์ž‘์—์„œ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค. .ts ํŒŒ์ผ์€ tsc ์™€ TS-Node ๋ชจ๋‘์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ €๋Š” tsc ๋ฅผ TS-Node๊ฐ€ ๋”ฐ๋ผ์•ผ ํ•˜๋Š” ํ‘œ์ค€ ์„ค์ •์ž๋กœ ๊ฐ•๋ ฅํžˆ ๊ณ ๋ คํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. .

์ œ ์š”์ ์€ ์ œ 3์ž ํŒจํ‚ค์ง€์—์„œ ์ด๋ฏธ .js/.d.ts ์Œ์ด ์žˆ๊ณ  .js ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋ฉด tsc๊ฐ€ .d.ts ํŒŒ์ผ์„ ๋ณด๊ณ  ์œ ํ˜•์„ ๋กœ๋“œํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, .js/.d.ts ์Œ์€ .ts ํŒŒ์ผ์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ํฌํŒ…๋˜๋Š” ํŒŒ์ผ์˜ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  JavaScript์—์„œ TypeScript๋กœ ํˆฌ๋ช…ํ•˜๊ฒŒ ํฌํŒ…ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ž˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์™ธ๋ถ€ _ํŒจํ‚ค์ง€_๋ฅผ ๋กœ๋“œํ•˜๋Š” ๊ฒฝ์šฐ ๋ช…๋ช…๋œ ๋ชจ๋“ˆ์„ ์ง„์ž…์  ํŒŒ์ผ์— ๋งคํ•‘ํ•˜๋Š” ์ผ์ข…์˜ ๋Ÿฐํƒ€์ž„ ํŒจํ‚ค์ง€ ๋กœ๋”(์˜ˆ: ๋ธŒ๋ผ์šฐ์ €์˜ ๋ช…๋ช…๋œ ๊ฐ€์ ธ์˜ค๊ธฐ ๋งต)๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ƒ๋Œ€์ ์ธ .js/.d.ts ์Œ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๊ท€ํ•˜์˜ ์š”์ ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์œ ํšจํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ๊ฒฝ์šฐ์— import ... from './foo.d.ts' ๋˜๋Š” import ... from './foo.js' ๋ฅผ ํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

.d.ts ํŒŒ์ผ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์–ด๋–ค ํ™•์žฅ์ž์—์„œ ๋งคํ•‘๋˜๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์€ ๊ตฌ์กฐ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ํ—ค๋”์ž…๋‹ˆ๋‹ค(์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ™์€ ์œ„์น˜์— ์ด๋ฆ„์€ ๊ฐ™์ง€๋งŒ ํ™•์žฅ์ž๊ฐ€ ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ํŒŒ์ผ์ด ์žˆ์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ , ๋นŒ๋“œ ์‹œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ) - ์˜ค๋Š˜๋‚ ์—๋„ ๊ด€๋ จ ๋Ÿฐํƒ€์ž„ "์†Œ์Šค"๋Š” .js ๋˜๋Š” .jsx ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค( jsx: preserve ์‚ฌ์šฉ). ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐฉ์ถœ ์‹œ ๊ฐ€์ ธ์˜ค๊ธฐ์—์„œ .d.ts ์ฐธ์กฐ๋ฅผ .js ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†์œผ๋ฉฐ ์ž‘๋™ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค...

tsc๊ฐ€ ๋” ๋„“์€ ๋ฒ”์œ„์— ๋Œ€ํ•ด ๋„ˆ๋ฌด ๋…๋‹จ์ ์ด์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
๋นŒ๋“œ ๋ฐ ํ•ด๊ฒฐ ๊ฐ€์ •.

๋ณต์žกํ•œ ๊ฒฝ๊ณ„์˜ ๋‹ค์ค‘ ๋„๊ตฌ๋ผ๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์˜ˆ์ƒ๋˜๋Š”
ํ•ด๋‹น ๊ตฌ์„ฑ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ด์ƒ๋„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋…ธ์ถœํ•˜์ง€ ์•Š์œผ๋ ค๋Š” ๋งค์šฐ ์˜๋„์ ์ธ ๋…ธ๋ ฅ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
tsc ์ปดํŒŒ์ผ ํ”„๋กœ์„ธ์Šค์˜ ์ผ๋ถ€ - ๊ทธ ์ž์ฒด๋กœ ์˜๊ฒฌ์ด ๋ถ„๋ถ„ํ•ฉ๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž์˜ ์›Œํฌํ”Œ๋กœ์— ๋งˆ์ฐฐ์„ ์ผ์œผํ‚ต๋‹ˆ๋‹ค.

2019๋…„ 11์›” 27์ผ ์ˆ˜์š”์ผ 16:48 Wesley Wigham [email protected]
์ผ๋‹ค:

.d.ts ํŒŒ์ผ์€ ๋ณธ์งˆ์ ์œผ๋กœ ๋‹ค์Œ์„ ํฌํ•จํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ํ—ค๋”์ž…๋‹ˆ๋‹ค.
์–ด๋–ค ํ™•์žฅ์ž์—์„œ ๋งคํ•‘๋˜๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค(๊ฐ€์ •์€
์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ™์€ ์ด๋ฆ„์˜ ํŒŒ์ผ์ด ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์–ด์„œ๋Š” ์•ˆ ๋˜์ง€๋งŒ
๊ฐ™์€ ์žฅ์†Œ์— ๋‹ค๋ฅธ ํ™•์žฅ์ž) - ์˜ค๋Š˜๋‚ ์—๋„ ์—ฐ๊ฒฐ๋œ
๋Ÿฐํƒ€์ž„ "์†Œ์Šค"๋Š” .js ๋˜๋Š” .jsx(jsx ์‚ฌ์šฉ: ๋ณด์กด)์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ํ•  ์ˆ˜
์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐฉ์ถœ ์‹œ ๊ฐ€์ ธ์˜ค๊ธฐ์—์„œ .d.ts ์ฐธ์กฐ๋ฅผ .js๋กœ ๋ฐ”๊พธ์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์ด ์ž‘๋™ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์‹ญ์‹œ์˜ค ...

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/microsoft/TypeScript/issues/16577?email_source=notifications&email_token=AAESFSQS2DQ23RR5KN3RTZ3QV3TLXA5CNFSM4DPRQTY2YY3PNVWWK3TUL52HS4DFVEXG43VMXHJKTDNMV
๋˜๋Š” ๊ตฌ๋… ์ทจ์†Œ
https://github.com/notifications/unsubscribe-auth/AAESFSUAP2YO23ZFHCOWVQLQV3TLXANCNFSM4DPRQTYQ
.

์ด ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ๊ฐ™์€ ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ์˜์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด html ํŒŒ์ผ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ€์ ธ์˜ค๊ธฐ ๋งต์ด ์žˆ์Šต๋‹ˆ๋‹ค.

<script type="importmap-shim">
      {
        "imports": {
          "@root/":"../../../",
         }
      }
</script>

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ฌ ts ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

import '@root/components/page-main/page-main.js';

์ด์ œ ์ด ์„ค์ •์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ VSCode์—์„œ ์–ด๋–ป๊ฒŒ ํƒ์ƒ‰/์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚ด ๋ง์€, ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ctrl+ํด๋ฆญํ•˜๊ณ  ํŒŒ์ผ๋กœ ์ด๋™ํ•˜๊ณ , ์ž๋™ ์™„์„ฑ์„ ์–ป๊ณ , def ๋“ฑ์„ ์ž…๋ ฅํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ tsc๊ฐ€ .ts์—์„œ .js๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ ํ™•์žฅ์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋ฉด ๋นŒ๋“œ ์‹œ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๊ถŒ์žฅ ๋„๊ตฌ/ํŒจํ‚ค์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ์‚ฌ ํ•ด์š”.

(ES ๋ชจ๋“ˆ ๋ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ๋งต์— https://github.com/guybedford/es-module-shims๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค)

๊ทธ๋Ÿฌ๋‚˜ VSCode์—์„œ ์–ด๋–ป๊ฒŒ ํƒ์ƒ‰/์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

paths ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ tsc๊ฐ€ .ts์—์„œ .js๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ ํ™•์žฅ์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋ฉด ๋นŒ๋“œ ์‹œ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๊ถŒ์žฅ ๋„๊ตฌ/ํŒจํ‚ค์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ์‚ฌ ํ•ด์š”.

.js ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ๋นŒ๋“œ ์‹œ .ts ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜๋”๋ผ๋„ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@tvvignesh https://github.com/Zoltu/typescript-transformer-append-js-extension/ ์ปดํŒŒ์ผ ์‹œ ํ™•์žฅ ์—†๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ .js๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ".js๋ฅผ TS ํŒŒ์ผ์— ๋„ฃ์œผ์„ธ์š”"๋ฅผ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ts-node์—์„œ ์‹คํ–‰๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ts-node์—์„œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด .js๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ VSCode์—์„œ ์–ด๋–ป๊ฒŒ ํƒ์ƒ‰/์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

paths ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ tsc๊ฐ€ .ts์—์„œ .js๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ ํ™•์žฅ์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋ฉด ๋นŒ๋“œ ์‹œ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๊ถŒ์žฅ ๋„๊ตฌ/ํŒจํ‚ค์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ์‚ฌ ํ•ด์š”.

.js ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ๋นŒ๋“œ ์‹œ .ts ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜๋”๋ผ๋„ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋น ๋ฅธ ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. tsconfig.json์—์„œ ์ด๋ฏธ ๊ฒฝ๋กœ ์˜ต์…˜์„ ์„ค์ •ํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ Ctrl+ํด๋ฆญ์œผ๋กœ ํƒ์ƒ‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ tsconfig.json์˜ ๋‚ด ๊ฒฝ๋กœ ์˜ต์…˜์ž…๋‹ˆ๋‹ค.

"paths": {
            "*": ["www/node_modules/*"],
            "@modules/*": ["www/node_modules/*"],
            "@root/*": ["www/*"]
        }

.js ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ๋นŒ๋“œ ์‹œ .ts ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜๋”๋ผ๋„ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜์ฒœ ๊ฐœ์˜ ์ˆ˜์ž…ํ’ˆ์ด ์žˆ์„ ๋•Œ ์ด๊ฒƒ์€ ๋งค์šฐ ๋น„์‹ค์šฉ์ ์ž…๋‹ˆ๋‹ค.

" .js ๋งŒ ์‚ฌ์šฉ"์˜ ๋ฌธ์ œ๋Š” TypeScript๊ฐ€ .mjs ํŒŒ์ผ์„ ๋‚ด๋ณด๋‚ด๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฒฐ๊ตญ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž‘๋™ํ•˜๋Š” _๋˜๋Š”_ NodeJS์—์„œ ์ž‘๋™ํ•˜๋Š” TypeScript๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์ƒํ™ฉ์— ์ด๋ฅด๊ฒŒ ๋จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋” ์ด์ƒ ๋‘ ๊ฐ€์ง€ ๋ชจ๋‘์—์„œ ์ž‘๋™ํ•˜๋Š” TypeScript๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ๊ธฐ์„œ ์ฃผ์žฅํ•˜๋Š” ๊ฒƒ์ด "TypeScript์˜ ์ž˜๋ชป์ด ์•„๋‹ˆ๋ผ ๋ธŒ๋ผ์šฐ์ €์™€ NodeJS๊ฐ€ ๊ฐˆ๋ผ์ง€๋Š” ๊ฒƒ"์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Node 13.2๋Š” .js ํ™•์žฅ์ž๋ฅผ ์ž˜ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

@justinfagnani ES ๋ชจ๋“ˆ์šฉ? NodeJS๋Š” ํ™•์žฅ์ž๊ฐ€ .mjs ์ธ ๊ฒฝ์šฐ์—๋งŒ ES ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํŒŒ์ผ์ด CommonJS๋กœ ์ฒ˜๋ฆฌ๋˜์—ˆ๋‚˜์š”?

์ด ์ „์ฒด ์Šค๋ ˆ๋“œ๊ฐ€ ์•ฝ๊ฐ„ ์ž˜๋ชป ์•ˆ๋‚ด๋˜์–ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ž‘์„ฑํ•˜๋ฉด ์ด ์ „์ฒด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. JavaScript ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ .js ํ™•์žฅ์ž๋ฅผ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค. TypeScript ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ .ts ํ™•์žฅ์ž๋ฅผ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ ํ‘œ์ค€์—์„œ ํ—ˆ์šฉ๋˜๋ฉฐ TypeScript ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด๋ฅผ ๋ชจ๋‘ ๋™๋“ฑํ•˜๊ฒŒ ์ž˜ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ์œ ์ผํ•œ ๋ฌธ์ œ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ .ts ํ™•์žฅ์ž๊ฐ€ ์˜ค๋ฅ˜๋ผ๊ณ  ๋ช…์‹œํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ˆœ์ˆ˜ํ•œ ๋ณ€ํ™˜์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์ง€๋งŒ ์œ ํ˜• ์˜ค๋ฅ˜์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. TypeScript๋Š” ์šฐ๋ฆฌ๊ฐ€ TypeScript๋กœ ์ž‘์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถ„๋ช…ํžˆ .ts ํŒŒ์ผ ํ™•์žฅ์ž๊ฐ€ ์œ ํšจํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Deno.js์—๋Š” VS Code ํ™•์žฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. https://marketplace.visualstudio.com/items?itemName=justjavac.vscode-deno

WebAssembly์˜ ์ถœํ˜„์œผ๋กœ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ ์  ๋” ๋งŽ์€ ํŒŒ์ผ ํ˜•์‹์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์‹œ์ž‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. .wasm, .js, .ts, .rs, .c ๋“ฑ์˜ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ ๋ช…์‹œ์ ์œผ๋กœ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์ด ์ ์  ๋” ์ค‘์š”ํ•ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•œ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

https://github.com/microsoft/TypeScript/issues/16577#issuecomment -310426634

๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ค ํ”ผ๋“œ๋ฐฑ?

@QuantumInformation ๊ท€ํ•˜์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ์ œ๊ฐ€ ์ž‘์„ฑํ•œ TypeScript ๋ณ€ํ™˜๊ธฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ˜Š https://github.com/Zoltu/typescript-transformer-append-js-extension/

์šฐ์„ , ๋‚˜๋Š” typescript๊ฐ€ ๊ทธ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋„๋ก ๋‹ค์‹œ ์‹œ๋„ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๊ทธ๋ ‡๊ฒŒํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๋Œ“๊ธ€์„ ์ฝ๊ณ  ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. .js ๋ฅผ ๊ฒฝ๋กœ์— ์ถ”๊ฐ€ํ•˜๋ฉด ๋ชจ๋“  ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋  ๊ฒƒ์ด๋ผ๊ณ  ๋งํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค - ์ •๋ง ํƒ€์‚ฌ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? node_modules์— ์žˆ๋Š” ๋‚ด์šฉ์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ์— ํ™•์žฅ์„ ์–ด๋–ป๊ฒŒ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๊นŒ?

@MicahZoltu ์˜ค ๋ฉ‹์ง€๋‹ค

๋ฌด์Šจ ๋œป์ด์—์š”? ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ node_modules์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ํŒŒ์ผ์˜ ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์–ด์จŒ๋“  ๊ทธ๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฒŒ๊ฑฐ ๋ฒ—์€ ์ˆ˜์ž…ํ’ˆ์ด ์•„๋‹ˆ๊ฒ ์Šต๋‹ˆ๊นŒ?

์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜๋ฉด ๋ฒ ์–ด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ€์ ธ์˜ค๋Š” ํŒจํ‚ค์ง€์˜ ๋‚ด๋ถ€ ๊ฐ€์ ธ์˜ค๊ธฐ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด rxjs๋ฅผ ์‚ดํŽด๋ณด์„ธ์š”.

@Draccoz ๋‚˜๋Š” import { ... } from './foo' ์™€ ๊ฐ™์€ TypeScript๋ฅผ ์ž‘์„ฑํ•œ ๋‹ค์Œ NPM ํŒจํ‚ค์ง€๋กœ ๊ฒŒ์‹œํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ES ๋ชจ๋“ˆ์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด ์š”์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ์˜ ์ฃผ์žฅ์€ ํŒจํ‚ค์ง€๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž‘๋™ํ•  ๊ฒƒ์ด๋ผ๋Š” ๊ธฐ๋Œ€์™€ ํ•จ๊ป˜ ๊ทธ๋Ÿฌํ•œ ์ฝ”๋“œ๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๊ฒฝ์šฐ ํŒจํ‚ค์ง€๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

node_modules์— ์žˆ๋Š” ํŒŒ์ผ์˜ ํ™•์žฅ์ž๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. JavaScript ํŒŒ์ผ์ธ ๊ฒฝ์šฐ import * as stuff from 'rxjs/path/to/file.js'; , TypeScript ํŒŒ์ผ์„ ๋ฐฐํฌํ•œ ๊ฒฝ์šฐ import * as stuff from 'rxjs/path/to/file.ts'; ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ํ‹€๋ฆฌ์ง€ ์•Š์œผ๋ฉด ์ด๊ฒƒ์€ ์ง€๊ธˆ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@lastmjs ์˜ˆ, ํ•˜์ง€๋งŒ rxjs/path/to/file.ts ์— import foo from './bar' $๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ํŒŒ์ผ์€ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋ฏ€๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ๋ชจ๋“  ๊ณณ์—์„œ ๋ช…์‹œ์  ํ™•์žฅ์„ ์‚ฌ์šฉํ•˜๋„๋ก ๋ฐ€์–ด๋ถ™์—ฌ์•ผ ํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋„ค ์š”์ ์€ ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚ด ๋„๊ตฌ(https://github.com/lastmjs/zwitterion)๋Š” ํ™•์žฅ์ž๊ฐ€ ์—†๋Š” ํŒŒ์ผ์— ๋Œ€ํ•œ ์ž„์‹œ ํ•ด๊ฒฐ์ฑ…์œผ๋กœ ์ด ๋‹ค์‹œ ์ž‘์„ฑ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋„ค, ์ œ ์š”์ ์€ ๋ฐ”๋กœ ๊ทธ ์ ์ž…๋‹ˆ๋‹ค. ํ™•์žฅ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋Š” ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” Microsoft ์š”์ ๋„ ์–ป์—ˆ์œผ๋ฏ€๋กœ ๋” ์ด์ƒ ๋ฏธ๋ฃจ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ด ๋ฌธ์ œ๋ฅผ ์—ด์–ด ๋‘๋Š” ๊ฒƒ์€ ํŒจํ‚ค์ง€ ์œ ์ง€ ๊ด€๋ฆฌ์ž๊ฐ€ TS๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋Œ€์‹  ๋นŒ๋“œ๋ฅผ ์กฐ์ •ํ•˜๋Š” ๊ฒƒ์„ ์ฐจ๋‹จํ•˜๋Š” ๋ถˆํ•„์š”ํ•œ ํฌ๋ง์„ ์ค€๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ œ์™ธํ•˜๊ณ ), ๋นŒ๋“œ ๋„๊ตฌ๋กœ typescript๋งŒ ์žˆ๊ณ  ๋‹ค๋ฅธ ์ข…์†์„ฑ์€ ์—†๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋„ค, ํ•˜์ง€๋งŒ ๋ถ„๋ช…ํžˆ ํฌ๋ง์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ข‹์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค

image

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๊ทธ ์˜๊ฒฌ์„ ํ†ตํ•ด ๋ช‡ ๋ฒˆ์ด๋‚˜ ๊ตฌํ˜„๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์–ธ๊ธ‰ํ–ˆ๋Š”๋ฐ ์™œ ๊ณ„์† ์—ด์–ด ๋‘๋Š”๊ฐ€?

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ './foo'์—์„œ import { ... }์™€ ๊ฐ™์€ TypeScript๋ฅผ ์ž‘์„ฑํ•œ ๋‹ค์Œ NPM ํŒจํ‚ค์ง€๋กœ ๊ฒŒ์‹œํ•˜๋Š” ๊ฒฝ์šฐ

๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์€ TS๋ฅผ NPM ํŒจํ‚ค์ง€๋กœ ๊ฒŒ์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚ด ์ž์‹ ์˜ ๋‚ด๋ถ€ ์‚ฌ์šฉ์„ ์œ„ํ•ด ์ด๊ฒƒ์„ ์ฐพ๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ํ”„๋กœ์ ํŠธ ๊ฐ„์— ๊ณต์œ ๋˜๋Š” ๊ณตํ†ต ์ฝ”๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ์œผ๋ฉฐ NPM์ด ํŒจํ‚ค์ง€๋ฅผ ํŒจํ‚ค์ง•ํ•˜๋Š” ํ•ฉ๋ฆฌ์ ์ธ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ํŒ€์€ ๋…์ ์ ์œผ๋กœ TS๋กœ ์ด๋™ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— deps๋ฅผ ์ปดํŒŒ์ผํ•˜์ง€ ์•Š์•„๋„ ๋˜์–ด์„œ ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋ณ„๋„์˜ ํƒ€์ดํ•‘์œผ๋กœ JS์— ํŒจํ‚ค์ง€๋ฅผ ๋นŒ๋“œํ•œ ๋‹ค์Œ modules ๋˜๋Š” main ๋ฅผ JS๋กœ ๊ฐ€๋ฆฌํ‚ค๊ณ  types ๋ฅผ ํƒ€์ดํ•‘ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ๋˜์ง€ ์•Š์€ TS๋ฅผ NPM์— ๊ฒŒ์‹œํ•˜๋Š” ๊ทœ์น™์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋”˜๊ฐ€์— ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์ด ์›๋ž˜ ๋ฌธ์ œ์—์„œ OT๋ฅผ ๋– ๋Œ๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์ง€๋งŒ "ํƒ€์‚ฌ TypeScript"(ํŒจํ‚ค์ง€)๊ฐ€ ์ง€์›๋˜๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€/๋ชฉํ‘œ์ธ์ง€ ์•Œ์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ต๋ณ€๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@thw0rted ๋ช…ํ™•ํ•˜์ง€ ์•Š์•„ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

...๋ˆ„๊ตฐ๊ฐ€ import { ... } from './foo' ์™€ ๊ฐ™์€ TypeScript๋ฅผ ์ž‘์„ฑํ•œ ๋‹ค์Œ ์˜ค๋Š˜๋‚  TSC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ JS๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ํ•ด๋‹น JS๋ฅผ NPM ํŒจํ‚ค์ง€๋กœ ๊ฒŒ์‹œํ•˜๋ฉด...

๊ตฌํ˜„๋˜์ง€ ์•Š์œผ๋ฉด ์ง€๊ธˆ ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•˜๋„๋ก MS์— ๋งก๊ธฐ๊ฒ ์Šต๋‹ˆ๋‹ค.

์•„, ์ด์ œ ์•Œ์•˜๋‹ค. ์˜ˆ, ( target: ES2018 ์‚ฌ์šฉ) ํŠธ๋žœ์ŠคํŒŒ์ผํ•  ๋•Œ ๋ฐฉ์ถœ๋œ JS๋Š” import ๋ฌธ์—์„œ ํ™•์žฅ์„ ์ƒ๋žตํ•˜์ง€๋งŒ ์†Œ๋น„์ž๊ฐ€ webpack/babel์„ ํ†ตํ•ด ๋ชจ๋“  ๊ฒƒ์„ ์ž…๋ ฅํ•˜๊ณ  ๋ˆ„๋ฝ๋œ ํ™•์žฅ์„ ์ฑ„์›Œ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค. ๋‚˜๋ฅผ์œ„ํ•œ. ์ด์ œ ์†๋„๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด "ํŒจํ‚ค์ง€"๊ฐ€ ๋จผ์ € webpack์„ ํ†ตํ•œ ์—ฌํ–‰ ์—†์ด๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๋Š” ์ƒ๊ฐ์กฐ์ฐจ ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

๋„ค, ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

@thw0rted webpack/babel์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ƒ์ž์—์„œ .js๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
์ผ๋ถ€ ์†”๋ฃจ์…˜/ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๊ธฐ๋ณธ ํ™•์ธ ์†Œ์Šค ์— ๋Œ€ํ•ด ์›น ์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๋งํ•œ ๊ฒƒ์„ ๋ฐ˜๋ณตํ•œ๋‹ค๋ฉด ๋ฏธ์•ˆํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ๋งค์ผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ผ์ด๋ฏ€๋กœ ์š”์ฒญํ•˜์ง€ ์•Š์€ 2์„ผํŠธ ์ค‘ ๋˜ ๋‹ค๋ฅธ ๊ฒƒ์„ ๋˜์ง€๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

TypeScript๊ฐ€ ํŠน์ • ํ™˜๊ฒฝ(Node.js, Webpack ๋“ฑ)์„ ์ˆ˜์šฉํ•  ํ•„์š”๋Š” ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์‚ฌ์‹ค ํŠน๋ณ„ํžˆ ๊ตฌ์„ฑํ•˜์ง€ ์•Š๋Š” ํ•œ ํ™•์žฅ์ด ํ•ญ์ƒ ํ•„์š”ํ•œ ํ™˜๊ฒฝ์ด ๋งŽ์ด ์žˆ์œผ๋ฏ€๋กœ ์ €๋Š” ' ๋ฌด์‹œํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์ ธ์˜ค๊ธฐ๋Š” ๋” ์ด์ƒ Node์˜ ํ”Œ๋ž˜๊ทธ ๋’ค์— ์žˆ์ง€ ์•Š์œผ๋ฉฐ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฒฝ๋กœ๋Š” ์›น์˜ URL ๊ฒฝ๋กœ ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. URL ๋์— .js ๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ธฐ์ˆ ์ ์ธ ํ•„์š”์„ฑ์€ ์—†์ง€๋งŒ ์ด๊ฒƒ์ด ์‚ฌ์‹ค์ƒ์˜ ํ‘œ์ค€์ž…๋‹ˆ๋‹ค.

Microsoft์˜ ํ›Œ๋ฅญํ•œ ์‚ฌ๋žŒ๋“ค์ด ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ์ •๋ง๋กœ ์›ํ•œ๋‹ค๋ฉด ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋…ผ์Ÿํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์•„๋งˆ๋„ ๋‚˜๋ณด๋‹ค ๋˜‘๋˜‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋™์ผํ•œ ํŒŒ์ผ์˜ ๋‹ค๋ฅธ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ™•์žฅ์ด ํ•„์š”ํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ์œ ์ถ”ํ•˜๋Š” ๋Œ€์‹  ํ”„๋กœ์ ํŠธ ์ „์ฒด์—์„œ ์„ค์ •ํ•˜์—ฌ Intellisense ์ž๋™ ์™„์„ฑ์—์„œ ์ฒ˜์Œ์œผ๋กœ ์ž‘๋™ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ™•์‹คํžˆ ๋” ํ–‰๋ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ์— ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

๊ทธ๋™์•ˆ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” VSCode ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? eslint์— ๊ฐ€์ ธ์˜ค๊ธฐ/ํ™•์žฅ ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ด ๋ฌธ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์„ ์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ .js ํ™•์žฅ์ž๊ฐ€ ์—†๋Š” import ํ–‰์„ ์ž‘์„ฑํ•œ ๋‹ค์Œ sed ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถœ๋ ฅ ํŒŒ์ผ์— .js ํ™•์žฅ์ž๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
https://github.com/yoursunny/NDNts/blob/9f50fcec245b33c7649fa815bbb3dd404eee160e/mk/build.sh#L12 -L14
์ถœ๋ ฅ ํŒŒ์ผ์ด ์ˆ˜์ •๋œ ํ›„ ๋” ์ด์ƒ ์ผ์น˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ ์ค‘์— SourceMaps๋ฅผ ์‚ญ์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ts-jest ๋ฅผ ๊นจ๊ธฐ ๋•Œ๋ฌธ์— .ts ์†Œ์Šค ํŒŒ์ผ์— .js ํ™•์žฅ์ž๋ฅผ ์“ธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
์ปดํŒŒ์ผ๋œ .js ํŒŒ์ผ์—์„œ Jest๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ Coveralls ๊ฐ€ ์†์ƒ๋ฉ๋‹ˆ๋‹ค.

@yoursunny ์˜ˆ, sed๋Š” ์ƒ์„ฑ๋œ js ํŒŒ์ผ์—์„œ ๋ฌธ์ž์—ด์„ ๊ต์ฒดํ•˜๊ธฐ ์œ„ํ•ด ๋ณ€ํ˜•(์ €๋„ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ importmap ํŒŒ์ผ ๋งคํ•‘์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์„ฑ ๋•Œ๋ฌธ์— ํŒŒ์ผ ๋‚ด ๊ต์ฒด๋ฅผ ์„ ํ˜ธํ•จ)์ด์ง€๋งŒ ๋ƒ„์ƒˆ๊ฐ€ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค =) ํ™•์žฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๋ณ€ํ™˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์žˆ๋Š” ttypescript์— ์œ ์šฉํ•œ ๊ธฐ๋Šฅ/์˜ต์…˜์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค(์˜ˆ: @MicahZoltu ์˜ typescript-transform-paths ).

@richardkazuomiller ์ด ๋ถ€๋ถ„์€ ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค:

Microsoft์˜ ์ข‹์€ ์‚ฌ๋žŒ๋“ค์ด ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ํ•˜์ง€ ์•Š์œผ๋ ค๋Š” ๊ฒฝ์šฐ

TypeScript ์ „์šฉ:

  1. ๋…ธ๋“œ ์š”๊ตฌ ์Šคํƒ€์ผ ๋ชจ๋“ˆ ํ™•์ธ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค(ํŒŒ์ผ ํ™•์žฅ์ž๊ฐ€ ํ•„์š”ํ•œ ๋…ธ๋“œ ๊ฐ€์ ธ์˜ค๊ธฐ ์Šคํƒ€์ผ ํ™•์ธ์„ ํ—ˆ์šฉํ•˜๋ ค๋ฉด ์ด๋ฅผ ํ™•์žฅํ•ด์•ผ ํ•จ).
  2. ๋™์ผํ•œ ์ปดํŒŒ์ผ ๋‹จ์œ„์—์„œ .js ํŒŒ์ผ์ด ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์ƒ์„ฑ๋˜๊ธฐ ์ „์—๋„ .js/.d.ts ์Œ์œผ๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ฐ€์ ธ์˜ค๊ธฐ ์ง€์ •์ž๋ฅผ _์ „ํ˜€_ ์ˆ˜์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์€ ๋‹จ์ˆœํžˆ .js ํ™•์žฅ์ž๋ฅผ ๊ฐ€์ง„ .js ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. TypeScript๋Š” ์˜ฌ๋ฐ”๋ฅธ .ts ํŒŒ์ผ๋กœ ํ•ด์„๋˜๊ณ  ๊ฐ€์ ธ์˜ค๊ธฐ ์ง€์ •์ž๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ธŒ๋ผ์šฐ์ €์™€ Node >= 13.2์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@yoursunny ts-jest ์— ๋Œ€ํ•ด ๋ฒ„๊ทธ๋ฅผ ์‹ ๊ณ ํ–ˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋“ค์€ ์—ฌ๊ธฐ์—์„œ ์‚ฌ์‹ค์ƒ์˜ TypeScript ํ‘œ์ค€์—์„œ ๋ฒ—์–ด๋‚˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ .js ํŒŒ์ผ์˜ ์†Œ์Šค ๋งต์„ ํ™œ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์ž‘์—…๋ณต์˜ ๋ฒ„๊ทธ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

ts-jest ์— ๋Œ€ํ•œ ๋ฒ„๊ทธ๋ฅผ ์‹ ๊ณ ํ•˜์…จ์Šต๋‹ˆ๊นŒ? ๊ทธ๋“ค์€ ์—ฌ๊ธฐ์—์„œ ์‚ฌ์‹ค์ƒ์˜ TypeScript ํ‘œ์ค€์—์„œ ๋ฒ—์–ด๋‚˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, ts-jest ํ•ด์ƒ๋„๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์™„์ „ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ .js ํŒŒ์ผ์˜ ์†Œ์Šค ๋งต์„ ํ™œ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์ž‘์—…๋ณต์˜ ๋ฒ„๊ทธ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

Coveralls๋Š” ๋‚ด ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค์—์„œ lcov ๋ณด๊ณ ์„œ๋ฅผ ๋ฐ›์€ ๋‹ค์Œ GitHub์— ์ปค๋ฐ‹๋œ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ ์ ์šฉ ๋ฒ”์œ„๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
์ถœ๋ ฅ .js ํŒŒ์ผ์„ GitHub์— ์ปค๋ฐ‹ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. .js ํŒŒ์ผ์—์„œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด lcov ๋ณด๊ณ ์„œ๋Š” GitHub์— ์—†๋Š” .js ํŒŒ์ผ์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ์ž‘์—…๋ณต์€ ์›๋ณธ ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ปค๋ฒ„๋ฆฌ์ง€ ๋ฐฑ๋ถ„์œจ์„ ํ‘œ์‹œํ•˜์ง€๋งŒ ์ปค๋ฒ„๋˜์ง€ ์•Š์€ ๋ผ์ธ์€ ํ‘œ์‹œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ์‹œ๋Œ€๊ฐ€ ๋„๋ž˜ํ–ˆ์Šต๋‹ˆ๋‹ค!

์ƒˆ๋กœ ์ถœ์‹œ๋œ Node.js v13๊ณผ ๋ชจ๋“  ์ฃผ์š” ๋ธŒ๋ผ์šฐ์ €๋Š” ๊ธฐ๋ณธ ES ๋ชจ๋“ˆ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•˜๋ฉฐ TypeScript๊ฐ€ ์ด๋Ÿฌํ•œ ํ™˜๊ฒฝ์„ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ง€์›ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€(๋‹จ์ˆœํ•œ ์ •์  ํŒŒ์ผ ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ์ œ๊ณต๋˜๋Š” ์›น ์‚ฌ์ดํŠธ)์— ๋Œ€ํ•œ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์€ "appendJsExtension": true ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ์ƒˆ ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@mjbvz ๋‹ซ์€ VS Code ์ €์žฅ์†Œ์˜ ๋ฌธ์ œ๋Š” ์•ฝ๊ฐ„ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ž๋™ ์™„์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ import ๋ฌธ์„ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. VS Code๊ฐ€ ์ด๊ฒƒ์„ ํ•  ๋•Œ .js ํ™•์žฅ ์—†์ด import ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๊นŒ์ง€ ์ด๊ฒƒ์„ ๊ฐ„๊ณผํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ TypeScript๊ฐ€ "appendJsExtension": true ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๋ฉด ํฌ๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์œผ๋ฉฐ ์†Œ์Šค์— .js ์—†์ด TS ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

VS Code ํ”Œ๋Ÿฌ๊ทธ์ธ์— ์ž๋™ ์™„์„ฑ๋œ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฌธ์—์„œ .js ํ™•์žฅ ์ž๋™ ์ถ”๊ฐ€๋ฅผ ํ™œ์„ฑํ™”/๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ์˜ต์…˜์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@mjbvz VS Code/Intellisense ๋ฌธ์ œ๋Š” ๊ด€๋ จ์ด ์žˆ์ง€๋งŒ ์†์ž„์ˆ˜๋กœ ๋งˆ๊ฐํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๊ฐ€ ๊ฒฐ๊ตญ WONTFIX๋กœ ์ข…๋ฃŒ๋˜๋ฉด ์‹ค์ œ๋กœ VS Code ๋ฌธ์ œ์˜ ์ค‘์š”์„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค.

๊ฐ„๊ณผ๋œ ํ•œ ๊ฐ€์ง€ ์ ์„ ๋ณด๊ณ  ์žˆ์œผ๋ฉฐ JS ํ™•์žฅ์ด ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ ์†”๋ฃจ์…˜์ด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ESM์˜ ๊ฒฝ์šฐ ํ™•์žฅ์ด ํŠน๋ณ„ํ•œ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์„œ๋ฒ„๊ฐ€ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์— ์ œ๊ณตํ•˜๋Š” ํ•œ ํ™•์žฅ์ด ์—†๋Š” ํŒŒ์ผ๋„ ์™„์ „ํžˆ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ์ ์ ˆํ•œ ํ…์ŠคํŠธ/์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ MIME ์œ ํ˜•. ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

import something from './javascript-code.png';
import something2 from './javascript-code2.js';
import something3 from './javascript-code3.ts';

ํ™•์žฅ์ž์— ๊ด€๊ณ„์—†์ด ํŒŒ์ผ์— JavaScript ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ณ  JavaScript MIME ์œ ํ˜•์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €์— ์ œ๊ณต๋˜๋Š” ํ•œ ๋ชจ๋‘ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

TypeScript๋Š” JavaScript์˜ type-safe ์ƒ์œ„ ์ง‘ํ•ฉ์ด์–ด์•ผ ํ•˜๋ฏ€๋กœ ์œ„์™€ ๊ฐ™์€ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ์œ ํšจํ•œ JavaScript์ด๊ณ  TypeScript๊ฐ€ ์ด๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋” ์ด์ƒ ์•ˆ์ „ํ•œ ์ƒ์œ„ ์ง‘ํ•ฉ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ, ๋งž๋‚˜์š”?

๋”ฐ๋ผ์„œ JS ํ™•์žฅ์ด ์•”์‹œ๋˜๊ฑฐ๋‚˜ ํ—ˆ์šฉ๋˜๋Š” ์œ ์ผํ•œ ์†”๋ฃจ์…˜์€ ์ด๊ฒƒ์„ ์ž˜๋ผ๋‚ผ ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ? ๋˜ํ•œ TS ๋ฐ DTS ํ™•์žฅ IMO๋„ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๊ทธ๋ ‡์ง€๋Š” ์•Š์ง€๋งŒ TypeScript ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ JavaScript ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๊ณ  ESM์— ๊ด€ํ•œ ํ•œ ์ „ํ˜€ ๋ฌธ์ œ ์—†์ด ๋ธŒ๋ผ์šฐ์ €์— ์„œ๋ฒ„๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. , ์˜ฌ๋ฐ”๋ฅธ MIME ์œ ํ˜•์œผ๋กœ ์ œ๊ณต๋˜๋Š” ๊ฒฝ์šฐ

์ด ์ „๋ฉด์—์„œ ๋‚ด๊ฐ€ ๋†“์น˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? TypeScript๊ฐ€ ์ฝ”๋“œ ๊ฐ€์ ธ์˜ค๊ธฐ์—์„œ ์ž„์˜(๋ˆ„๋ฝ ํฌํ•จ) ํ™•์žฅ์— ๋Œ€ํ•œ ์ง€์›์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  TypeScript๊ฐ€ file.ts ๋ฐ file ๋ฅผ ๊ฐ์•ˆํ•  ๋•Œ ๋ชจ๋“ˆ ๊ฐ€์ ธ์˜ค๊ธฐ์—์„œ TS ํ™•์žฅ์„ ๊ณ„์† ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? (ํ™•์žฅ์ž ์—†์Œ) ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ?

์›น ๋ฐ ์„œ๋น„์Šค ์ž‘์—…์ž๋Š” ES ๋ชจ๋“ˆ ๊ฐ€์ ธ์˜ค๊ธฐ/๋‚ด๋ณด๋‚ด๊ธฐ์— ๋Œ€ํ•œ ์ง€์›๋„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” @trusktr ์˜ ์•„์ด๋””์–ด๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ ค๋Š” ์•„์ด๋””์–ด๋ฅผ ์ „์ ์œผ๋กœ ์ง€์ง€ํ•˜๊ณ  ์ง€์ง€ํ•ฉ๋‹ˆ๋‹ค. ์›นํŒฉ์ด๋‚˜ ๋กค์—… ๊ฐ™์€ ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ์—†์• ๊ณ  ์‹ถ์€ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ๊ธฐ๋Šฅ์ด ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐ ๋“œ๋Š” ๋งŽ์€ ๋ฒˆ๊ฑฐ๋กœ์›€๊ณผ ์‹œ๊ฐ„์„ ์—†์•จ ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๊ฒƒ์€ ๋‹จ์ˆœํžˆ Typescript ํ”„๋กœ์ ํŠธ๋ฅผ ๋ณต์žกํ•œ ๊ณผ์ •์„ ๊ฑฐ์น˜๊ฑฐ๋‚˜ ์–ด์ƒ‰ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ Typescript ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์˜ต์…˜์œผ๋กœ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. <3

๋ชจ๋“  ์ข…๋ฅ˜์˜ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜์—ฌ webpack ๋˜๋Š” --outFile ์—†์ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ปดํŒŒ์ผ๋œ ๊ฐœ๋ณ„ js ํŒŒ์ผ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด ๋ฌธ์ œ๋Š” ์ด๊ฒƒ์ด๋‹ค: ๋‚ด๊ฐ€ ์ž‘์—…ํ•˜๊ณ  ์žˆ๋Š” ์ƒ๋‹นํžˆ ํฐ TypeScript ํ”„๋กœ์ ํŠธ๋Š” ts-loader ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒˆ๋“ค๋œ js ํŒŒ์ผ๋กœ webpack์œผ๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐ ์•ฝ 35์ดˆ๊ฐ€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.
์ด๊ฒƒ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์„ 20์ดˆ๋กœ ์ค„์ด๋Š” transpileOnly ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ ์—ฌ์ „ํžˆ ๋Š๋ฆฌ๊ณ  ์œ ํ˜• ๊ฒ€์‚ฌ๊ฐ€ ๋Š์Šจํ•ฉ๋‹ˆ๋‹ค.
webpack ์ œ๊ฑฐ outFile์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ฝ 14์ดˆ์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋„ˆ๋ฌด ๋Š๋ฆฝ๋‹ˆ๋‹ค. incremental ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์•„๋ฌด๋Ÿฐ ์ฐจ์ด๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๋ช‡ ์ดˆ์˜ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ 1ts ํŒŒ์ผ๋‹น 1๊ฐœ์˜ js ํŒŒ์ผ์„ ๋‚ด๋ณด๋‚ด๊ณ  incremental ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ts๊ฐ€ ์‹ค์ œ๋กœ ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ๋งŒ ๊ฐ์ง€ํ•˜๊ณ  ์ปดํŒŒ์ผํ•œ๋‹ค๊ณ  ์ƒ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๋‚ด๊ฐ€ ์‹œ๋„ํ•œ ๋ชจ๋“ˆ ๋Œ€์ƒ(system, amd, es6)์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ด๊ฒƒ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
tsconfig.json paths ๋งคํ•‘์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ณ  ์ปดํŒŒ์ผ๋œ js ํŒŒ์ผ์—์„œ ๋‚ด๊ฐ€ ๋ฐ›๋Š” ์˜ค๋ฅ˜๋Š” ๋Œ€๋ถ€๋ถ„ ํ•ด๋‹น ๋ณ„์นญ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ๋‹ฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@andrewvarga ํ˜„์žฌ ์ปดํŒŒ์ผ๋œ ๋ชจ๋“  TypeScript๋ฅผ ๋‹จ์ผ ํŒŒ์ผ๋กœ ๋ฌถ๊ฑฐ๋‚˜ ์ปดํŒŒ์ผํ•˜์ง€ ์•Š๊ณ  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง์ ‘ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. TypeScript ํŒŒ์ผ์˜ ๋ชจ๋“  ๊ฐ€์ ธ์˜ค๊ธฐ์— .js ํ™•์žฅ์ž๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
  2. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ข…์†์„ฑ์— ๋Œ€ํ•œ npm ํŒจํ‚ค์ง€ ์ด๋ฆ„ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. es-dev-server ๋Š” ๋‚ด๊ฐ€ ์•„๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  3. tsc --watch ์‹คํ–‰(๋ชจ๋“ˆ์ด tsconfig์—์„œ esnext ์ธ์ง€ ํ™•์ธ)

๊ทธ๊ฒŒ ๋‹ค์•ผ TypeScript์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ์šฉ .js ํ™•์žฅ์ž๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €์šฉ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@justinfagnani ์นœ๊ตฌ, ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค. ์œ ํ˜•์€ jsdoc ํ˜•์‹์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ JavaScript๋ฅผ ํ†ตํ•œ ๋ชจ๋“  ์œ ํ˜• ์Šคํฌ๋ฆฝํŠธ ์ถ”์ƒํ™”๋Š” ํŒŒ์„œ๋ฅผ ์‹คํŒจํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

@Draccoz tsc ๋Š” TypeScript๊ฐ€ ์•„๋‹Œ JavaScript๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

@andrewvarga ๋ฒˆ๋“ค๋ง ์—†์ด ํŠธ๋žœ์ŠคํŒŒ์ผํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ Zwitterion ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. ์ •์  ํŒŒ์ผ ์„œ๋ฒ„๋ฅผ ๋Œ€์ฒดํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์œผ๋ฏ€๋กœ ๊ฐœ๋ฐœ ๋ฐฉ์‹์„ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ ์š”์†Œ์—์„œ๋„ ๋ช…์‹œ์  ํŒŒ์ผ ํ™•์žฅ๋ช…(JavaScript์˜ ๊ฒฝ์šฐ .js ๋ฐ TypeScript์˜ ๊ฒฝ์šฐ .ts)์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์ ธ์˜ค๊ณ  ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งค์šฐ ์„ฑ๋Šฅ์ด ์ข‹์œผ๋ฉฐ ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋  ๋•Œ ์บ์‹ฑ ๋ฐ ์ž๋™ ๋‹ค์‹œ ๋กœ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ •์  ๋ถ„์„(์œ ํ˜• ์˜ค๋ฅ˜)์„ ์œ„ํ•ด ํŽธ์ง‘๊ธฐ์— ์˜์กดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@andrewvarga ์ €๋Š” https://github.com/Zoltu/typescript-transformer-append-js-extension/ ์„ ์‚ฌ์šฉํ•˜๊ณ  ๋ชจ๋“  ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €(์ƒˆ IE์ธ Safari ์ œ์™ธ)์—์„œ ๋กœ๋“œ๋˜๋Š” ๊ธฐ๋ณธ ES ๋ชจ๋“ˆ์„ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

๋Ÿฐํƒ€์ž„ NPM ์ข…์†์„ฑ์ด ์ƒ๋‹นํžˆ ์ œํ•œ๋œ ๊ฒฝ์šฐ ๋ฒˆ๋“ค๋ง ์—†์ด es-modules-shim์„ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ๊ฒƒ์ด ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๋Š” ๋‚ด๊ฐ€ ๋งŒ๋“  ๋ฐ˜์‘ ํ…œํ”Œ๋ฆฟ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/Zoltu/react-es2015-template

@MicahZoltu Safari๋Š” ES ๋ชจ๋“ˆ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค caniuse์™€ ๊ฐœ์ธ์ ์ธ ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค: https://caniuse.com/#search =modules

@justinfagnani awww ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. "์ปดํŒŒ์ผ๋œ TypeScript" ๋ถ€๋ถ„์„ ๋†“์ณค์Šต๋‹ˆ๋‹ค. jsdoc typescript์— ๋Œ€ํ•ด ๋ง์”€ํ•˜์‹œ๋Š” ์ค„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ํŒ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋‚ด๊ฐ€ ์ฐพ์€ ๊ฒƒ์€ webpack์— hard-source-webpack-plugin npm ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๊ณ  ts-loader ์˜ต์…˜์— transpileOnly: true ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋นŒ๋“œ ์‹œ๊ฐ„์ด ์•ฝ 4-5์ดˆ๋กœ ๋‹จ์ถ•๋ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ๋ฌผ๋ก  typescript ์˜ค๋ฅ˜๋ฅผ ๋ฌด์‹œํ•˜๋ฏ€๋กœ ๋นŒ๋“œ, ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹œ๋„ํ•˜๊ณ  ์ž ์žฌ์ ์ธ ์˜ค๋ฅ˜์— ๋Œ€ํ•ด IDE์— ์˜์กดํ•˜๋Š” ๋น ๋ฅธ ๋ฐ˜๋ณต์—๋งŒ ์œ ์šฉํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ ์ค‘์— ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

TS ์˜ค๋ฅ˜์™€ ๋น ๋ฅธ ์ปดํŒŒ์ผ์„ ๋ชจ๋‘ ์–ป์œผ๋ ค๋ฉด ์—ฌ์ „ํžˆ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ชจ๋“ˆ์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ฐ€์ ธ์˜ค๊ธฐ ๋งต ๋ฐ js ํ™•์žฅ์— ๋Œ€ํ•œ ์ง€์›์ด ๋ถ€์กฑํ•˜์—ฌ ์–ด๋ ต๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
@justinfagnani @MicahZoltu ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์˜ต์…˜์„ ์‹œ๋„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ npm ๋ชจ๋“ˆ์„ ํ•˜๋‚˜ ๋” ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜์ง€๋งŒ ๋ถˆ๊ฐ€ํ”ผํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

systemjs๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘๋™์‹œํ‚ค๋ ค๊ณ  ํ–ˆ์ง€๋งŒ ๊ฐ€์ ธ์˜ค๊ธฐ ๋งต์ด ๋ง‰ํ˜”์Šต๋‹ˆ๋‹ค.

@andrewvarga importmap์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€๋ฒผ์šด ์˜ˆ์ œ ๋กœ SystemJ๋ฅผ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‚ด ๋ฌด๊ฑฐ์šด ์˜ˆ์ œ - systemjs ๋ฐ esm ๋Œ€์•ˆ์„ ์‹œ๋„ ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ esm importmaps๋Š” ๊ธฐ๋ณธ์—์„œ ์ง€์›๋˜์ง€ ์•Š์œผ๋ฉฐ ๋ชจ๋“ˆ์„ ์ˆ˜๋™์œผ๋กœ ํ•ด๊ฒฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (gulp-replace) ๋˜๋Š” es-module-shims ๋ฅผ ์‹œ๋„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ tsc ๋ฅผ ์œ ์ผํ•œ ์ปดํŒŒ์ผ๋Ÿฌ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ esnext ๋˜๋Š” es2015 ๋ฅผ ๋ชจ๋“ˆ ์œ ํ˜•์œผ๋กœ ํƒ€๊ฒŸํŒ…ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง์ ‘ ์ถœ๋ ฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

https://github.com/alshdavid-sandbox/typescript-only-compiler

์ด ์Šค๋ ˆ๋“œ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ–ˆ๋‹ค๋ฉด ์ด ์ค„ ์„ from "./module.js" ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด Typescript๊ฐ€ ์ฝ”๋“œ๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ปดํŒŒ์ผ๋œ index.js ์— ์œ ํšจํ•œ ES6 ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฌธ์ด ์žˆ๊ณ  ๋ชจ๋‘ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ES ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฑฐ๋‚˜ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๋Š” ํ•œ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด .js ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” Gulp์šฉ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. (๋˜ํ•œ ๋ณด๋„ˆ์Šค ts ๊ฒฝ๋กœ ํ•ด์ƒ๋„).

๋‚˜๋Š” Gulp๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ๋ณธ์งˆ์ ์œผ๋กœ ๊ฐ„๋‹จํ•œ ํ›„์ฒ˜๋ฆฌ ๋‹จ๊ณ„๋ฅผ tsc ์ปดํŒŒ์ผ๋Ÿฌ(๊ฐ์‹œ ๋ชจ๋“œ์™€ ์ผ๋ฐ˜ ๋ชจ๋“œ ๋ชจ๋‘)์— ์ฒจ๋ถ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ์ž‘์—… ์‹คํ–‰์ž๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. Webpack๊ณผ ๋กค์—…์€ ๋ชจ๋‘ ๋…์ ์ ์œผ๋กœ ๋ฒˆ๋“ค๋กœ ์ œ๊ณต๋˜๋ฉฐ es ๋ชจ๋“ˆ์„ ๋‚ด๋ณด๋‚ด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ž‘๋™ํ•˜์ง€๋งŒ ์ „์ฒด๋ฅผ ์žฌ๊ฑดํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฏ€๋กœ ๋ณด๋Š” ๊ฒƒ์ด ๋Š๋ฆฝ๋‹ˆ๋‹ค.

https://github.com/alshdavid-sandbox/typescript-only-compiler/tree/gulp

๋…ธ๋“œ ํŒ€์ด ํ™•์žฅ ์—†๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ์— ๋ฐ˜๋Œ€ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•จ์— ๋”ฐ๋ผ ์ด๊ฒƒ์€ ๋”์šฑ ์ค‘์š”ํ•ด์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/nodejs/modules/issues/444

ํ™•์žฅ ์—†๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ์— ๋Œ€ํ•ด์„œ๋„ ๊ฒฐ์ •๋œ ๊ฐ€์ ธ์˜ค๊ธฐ ๋งต ์ถ”๊ฐ€
https://github.com/WICG/import-maps/issues/194

๋ธŒ๋ผ์šฐ์ €๋‚˜ ๋…ธ๋“œ์—์„œ typescript๋กœ ์ปดํŒŒ์ผ๋œ es ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด typescript๋กœ ํ™•์žฅ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? (๋‚ด๋ถ€ ๋ชจ๋“ˆ์˜ ๊ฒฝ์šฐ) ์™ธ๋ถ€ ๋ชจ๋“ˆ์˜ ๊ฒฝ์šฐ ์ˆ˜๋™์œผ๋กœ? @weswigham

@chyzwar ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ TypeScript ์†Œ์Šค์— .js ํ™•์žฅ์„ ์ž‘์„ฑํ•˜๋ฉด ์ปดํŒŒ์ผ๋œ ์ถœ๋ ฅ์— ์˜ฌ๋ฐ”๋ฅธ ํ™•์žฅ์ด ํฌํ•จ๋˜๊ณ  ๋ชจ๋“ˆ์ด ๋ธŒ๋ผ์šฐ์ €์™€ Node.js์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ๋ณ€ํ™˜ ๋„๊ตฌ๋‚˜ tsc ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž๊ฐ€ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. TypeScript ์†Œ์Šค ํŒŒ์ผ์ธ ๊ฒฝ์šฐ .ts ํ™•์žฅ์ž๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. JavaScript ์†Œ์Šค ํŒŒ์ผ์ธ ๊ฒฝ์šฐ .js ํ™•์žฅ์ž๋ฅผ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค. ๋˜ํ•œ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ปดํŒŒ์ผ ๋ฐ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค(.ts์—๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜/์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ MIME ์œ ํ˜•์ด ํ•„์š”ํ•จ). ํ™•์žฅ์ž๋Š” ์†Œ์Šค ํŒŒ์ผ ํ˜•์‹๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. tsc ๋ฐ ES ๋ชจ๋“ˆ์€ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ตœ์†Œํ•œ ๋ธŒ๋ผ์šฐ์ €์˜ ES ๋ชจ๋“ˆ, Node.js๋„ ๋™์ผํ•˜๊ฒŒ ๋”ฐ๋ฅด๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค)

@justinfagnani tsc ๋Š” ์ด์— ๋Œ€ํ•ด ์ƒ๋‹นํžˆ ๋งŒ์กฑํ•˜๋ฉฐ ์—ฌ๊ธฐ์—์„œ "์šฐ๋ฆฌ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ๊ณตํ‰ํ•˜์ง€๋งŒ ๋ฌด์—‡์ด ์˜ณ์€์ง€์— ๋Œ€ํ•œ ํ•ฉ์˜๊ฐ€ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

tsc, vscode, webpack ๋ฐ ts-node ์‚ฌ์ด์—์„œ ์ด์ œ ๋ง‰ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ํ‘œ์ค€(ํ˜„์žฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ธŒ๋ผ์šฐ์ € ๋ฐ ๋…ธ๋“œ)์— ๋Œ€ํ•ด ์ž˜ ๋™์˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์‹ค์‹œ์˜ˆ 1

์ตœ์‹  ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ํŒจํ‚ค์ง€๋ฅผ ์ž‘์„ฑํ•˜๊ณ  typescript๋กœ ์ž‘์„ฑํ•˜๊ณ  emascript ๋ชจ๋“ˆ๋กœ ๋ฐฐํฌํ•  ์œ ํ˜•์„ ์ œ๊ฑฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค(๊ฐ€์ ธ์˜ค๊ธฐ ๋ฐ ๋‚ด๋ณด๋‚ด๊ธฐ ๋ฌธ ์œ ์ง€).

์‹ค์‹œ์˜ˆ 2

์ €๋Š” vscode์˜ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •์  ์›น์‚ฌ์ดํŠธ๋ฅผ ๊ตฌ์ถ• ์ค‘์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ ์ฒซ ๋ฒˆ์งธ ๊ฐ€์ ธ์˜ค๊ธฐ์— ๋Œ€ํ•ด ํ™•์žฅ ์—†์ด ์ž๋™ ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ์ˆ˜ํ–‰๋˜๋ฉฐ ์ด๋ฅผ ์ˆ˜๋™์œผ๋กœ ์กฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ tsc๋Š” ์ด๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ „์ฒด ํƒ€์ดํ•‘์œผ๋กœ typescript์—์„œ es ๋ชจ๋“ˆ ๋ฐฐํฌ๋ฅผ ์†Œ๋น„ํ•˜๋Š” ๊ฒƒ์„ ์ง€์›ํ•˜๋Š” ์„ค๋ช…์ž ํŒŒ์ผ์„ ๋”ฐ๋กœ ๋‚ด๋ณด๋‚ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(๊ต‰์žฅํ•ฉ๋‹ˆ๋‹ค).

๊ทธ๋Ÿฌ๋‚˜ ์†Œ์Šค์— ๋Œ€ํ•ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด ts-node๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฌ๊ธฐ์„œ๋Š” ts-node๊ฐ€ ๋งŒ์กฑ์Šค๋Ÿฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์œ ์‚ฌํ•˜๊ฒŒ, tsc, vscode ๋ฐ webpack์ด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์ง„ํ™”ํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค:

  1. ํ™•์žฅ์ž๊ฐ€ ์—†๋Š” vscode ์ž๋™ ๊ฐ€์ ธ์˜ค๊ธฐ
  2. tsc๋Š” ts ํŒŒ์ผ์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ js ํŒŒ์ผ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
  3. webpack์€ ์—ฌ๊ธฐ์—์„œ ๊ฒ€์ƒ‰ํ•  ๊ธฐ๋ณธ ํ™•์žฅ์— ๋Œ€ํ•ด ๋‹ค์–‘ํ•œ ๋งˆ๋ฒ•์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋„ค ๊ฐ€์ง€ ๊ตฌํ˜„(chrome, firefox, safari, node)์ด ๋ชจ๋‘ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฒฝ๋กœ๊ฐ€ ํŒŒ์ผ๋กœ ์ง์ ‘ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ๊ฐ€๋ฆฌ์ผœ์•ผ ํ•œ๋‹ค๊ณ  ์˜ˆ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด์ œ ์˜๋ฌธ์„ ์ œ๊ธฐํ•ด์•ผ ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ€์ ธ์˜ค๊ธฐ์— .js ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ํ™•์‹คํ•œ ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹ˆ๋ผ ์ž„์‹œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ญ”๊ฐ€ ์žˆ์œผ๋ฉด ํ•ดํ‚น ๊ฐ™์€ ๋Š๋‚Œ์ด ๋“ญ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์†์ด๋Š” ๋ฐฉ๋ฒ•. ๊ทธ๋ฆฌ๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋Šฅ๊ฐ€ํ•˜๋ ค๋Š” ์‹œ๋„๋Š” imho๋ฅผ ๋”ฐ๋ฅด๋Š” ๋”์ฐํ•œ ์ด๋ฐ์˜ฌ๋กœ๊ธฐ์ž…๋‹ˆ๋‹ค. Typescript๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ด๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ํ˜ผ๋ž€์Šค๋Ÿฌ์šธ์ง€ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์„ ๋ฟ์ž…๋‹ˆ๋‹ค. Javascript ๊ฐœ๋ฐœ์ž๊ฐ€ _better_ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ์–ธ์–ด์ž…๋‹ˆ๋‹ค.

์ด๋ฏธ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๊ฐ€์ ธ์˜ค๊ธฐ์— .js๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด TypeScript๊ฐ€ ์ด๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ๋ชจ๋“  ๊ฒƒ์ด (์ ์–ด๋„ ์ฝ”๋“œ ๋‚ด์—์„œ) ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— tsc์—์„œ ํ™•์žฅ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” TypeScript์— ๊ฐœ๋ฐœ์ž์— ์˜ํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•˜๋„๋ก ์š”์ฒญํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
์˜คํ•ดํ•˜์ง€ ๋งˆ์„ธ์š”. ์ €๋Š” tsc๊ฐ€ ์œ ์ผํ•œ ๊ฐœ๋ฐœ์ž ์ข…์†์„ฑ์ด๊ธฐ๋ฅผ ์›ํ•˜์ง€๋งŒ ์–ด๋–ค ์ผ์€ ์ผ์–ด๋‚˜์ง€ ์•Š๊ณ  ๊ฟˆ์œผ๋กœ ๋‚จ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” tsc๊ฐ€ ๋‚˜์˜ ์œ ์ผํ•œ dev ์˜์กด์„ฑ์ด๊ธฐ๋ฅผ ์›ํ•˜์ง€๋งŒ ์–ด๋–ค ์ผ์€ ์ผ์–ด๋‚˜์ง€ ์•Š๊ณ  ๊ฟˆ์œผ๋กœ ๋‚จ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Typescript ํŒ€์˜ ์ผ๋ถ€๋ฅผ ํฌํ•จํ•˜์—ฌ #3469์—์„œ ๋ช‡ ๋…„์— ๊ฑธ์ณ ๊ฑฐ์˜ ๋™์ผํ•œ ๋Œ“๊ธ€์„ ์ˆ˜์‹ญ ๋ฒˆ ๋ณด์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. "์œ ํ˜• ๊ฒ€์‚ฌ๊ธฐ์ž…๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ์ผ์„ ์ž˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ๋„๊ตฌ ๋ชจ์Œ์„ ๋Œ€์ฒดํ•  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•˜์ง€ ๋งˆ์„ธ์š”..." 3๋…„์ด ๊ฑธ๋ ธ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋นŒ๋“œ ๋ชจ๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ.

Webpack๊ณผ ๋กค์—…์€ ๋ชจ๋‘ ๋…์ ์ ์œผ๋กœ ๋ฒˆ๋“ค๋กœ ์ œ๊ณต๋˜๋ฉฐ es ๋ชจ๋“ˆ์„ ๋‚ด๋ณด๋‚ด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@alshdavid Rollup์€ ์ถœ๋ ฅ ํ˜•์‹์„ esm ๋กœ ์„ค์ •ํ•˜๊ณ  preserveModules ๋ฅผ true ๋กœ ์„ค์ •ํ•˜๋ฉด ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://rollupjs.org/guide/en/#preservemodules

์•„๋งˆ๋„ "ํ™•์žฅ ์—†๋Š”" ๊ฐ€์ ธ์˜ค๊ธฐ๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ์›์ฃ„์˜€์Šต๋‹ˆ๋‹ค.

์ด์ œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  .js ํ™•์žฅ์„ ํฌํ•จํ•  ๋•Œ์ž…๋‹ˆ๋‹ค. ์˜ค๋Š˜ ์†Œ์Šค ์ฝ”๋“œ์— .js ํ™•์žฅ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋งŒ์กฑ์Šค๋Ÿฝ๊ณ  typescript๊ฐ€ ๋ถˆ๊ฐ€์ง€๋ก ์ ์ด๋ฉฐ, ๋ฒˆ๋“ค๋Ÿฌ๋Š” ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š”๋‹ค

๊ทธ๋ž˜์„œ ์•„๋งˆ๋„ extensionless๋Š” ์šฐ๋ฆฌ์˜ ์˜ค๋ž˜๋œ ๋„๊ตฌ๊ฐ€ ๋ณด์™„ํ–ˆ๋˜ ์†Œ์Šค ์ฝ”๋“œ์˜ ๊ฒฐํ•จ์ด์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

typescript ์†Œ์Šค ์ฝ”๋“œ์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ์— .js ํ™•์žฅ์ž๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์™„์ „ํžˆ ๋„Œ์„ผ์Šค์ž…๋‹ˆ๋‹ค. ์ž‘๋™ ์ค‘์ด๋ฉฐ ์ถœ๋ ฅ์˜ ํ™•์žฅ์ž๋ฅผ ์œ ์ง€ํ•˜์ง€๋งŒ VSCode ๋˜๋Š” ์‚ฌ์šฉ ์ค‘์ธ ํŽธ์ง‘๊ธฐ์˜ ESLint ๊ทœ์น™(๋˜๋Š” TypeScript)์—์„œ "ํŒŒ์ผ์„ ํ™•์ธํ•  ์ˆ˜ ์—†์Œ" ์˜ค๋ฅ˜๋กœ ์ธํ•ด ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น typescript ์†Œ์Šค ์ฝ”๋“œ์— ๋Œ€ํ•ด ํ…Œ์ŠคํŠธํ•  ๋•Œ๋Š” ๋งํ•  ๊ฒƒ๋„ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ…Œ์ŠคํŠธ ๋„๊ตฌ๋Š” ๊ทธ ๋ฉ์ฒญํ•œ ํ–‰๋™์— ๋Œ€ํ•ด์„œ๋„ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋ผ๊ณ  ๊ฑฐ์˜ ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์˜ˆ

src/index.ts
src/foo.ts
test/index.ts

src/foo.ts

export default (a: number) => a + 100;

src/index.ts

// okay, editor (without ESLint) doesn't report error here
import foo from './foo.js';

export default () => {
  console.log(foo(123));
}

ํ…Œ์ŠคํŠธ/์ธ๋ฑ์Šค.ts

// errm... ts or js ext?! .ts should be the one that make sense
// and that's how the testing too will expect it to be, otherwise will throw
// but then it will detect some weird `.js` ext in the source files...
// which again won't be able to resolve... complete bullshit. 
import main from '../src/index.ts';
import foo from '../src/foo.ts';

test('some boolshit', () => {
  main();
});

test('about foo', () => {
  foo(20);
});

"ํ—›์†Œ๋ฆฌ" ์‚ฌ์šฉ์— ๋Œ€ํ•ด ์œ ๊ฐ์Šค๋Ÿฝ๊ฒŒ ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์ด ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ฐ€์ ธ์˜ค๊ธฐ์—์„œ ํ™•์žฅ์ž( .ts )๋ฅผ ๋ณด๊ณ  .js ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ธฐ๋ณธ ์˜ต์…˜์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋ฆฌ ์–ด๋ ต์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋‹ค). ํ™•์žฅ์ด ์—†์„ ๋•Œ ํ™•์žฅ์„ ์œ ์ง€ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค(์ค€์ „๋ฅ˜ ๋™์ž‘?).

typescript ์†Œ์Šค ์ฝ”๋“œ์˜ imports์—์„œ .js ํ™•์žฅ์ž๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์™„์ „ํžˆ ๋ง๋„ ์•ˆ๋˜๋Š” ์†Œ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์ž‘๋™ ์ค‘์ด๋ฉฐ ์ถœ๋ ฅ์˜ ํ™•์žฅ์ž๋ฅผ ์œ ์ง€ํ•˜์ง€๋งŒ VSCode ๋˜๋Š” ์‚ฌ์šฉ ์ค‘์ธ ํŽธ์ง‘๊ธฐ์˜ ESLint ๊ทœ์น™(๋˜๋Š” TypeScript)์—์„œ "ํŒŒ์ผ์„ ํ™•์ธํ•  ์ˆ˜ ์—†์Œ" ์˜ค๋ฅ˜๋กœ ์ธํ•ด ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค. ESLint, TypeScript, VS Code ๋ฐ ๊ธฐํƒ€ ๋ชจ๋“  TypeScript ๊ด€๋ จ ๋„๊ตฌ๋Š” ์ด ๋ฐฉ๋ฒ•์œผ๋กœ _๊ทธ๋ƒฅ ์ž‘๋™_ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ•ดํ‚น์ด ์•„๋‹ˆ๋ฉฐ ๋งค์šฐ ํ•ฉ๋ฆฌ์ ์ธ ๊ทผ๊ฑฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์ ธ์˜ค๋Š” ํŒŒ์ผ์€ ์‹ค์ œ๋กœ .js ํŒŒ์ผ์ด๋ฉฐ ๊ฐ€์ ธ์˜จ ํŒŒ์ผ์ด ๋กœ์ปฌ ํŒŒ์ผ์˜ ์ผ๋ถ€์ด๊ธฐ ๋•Œ๋ฌธ์— ํ™•์žฅ์ž๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ๋˜๋Š” ํƒ€์‚ฌ ํŒจํ‚ค์ง€์˜ ์ผ๋ถ€๋กœ ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ €๋Š” ๋ชจ๋“  TypeScript ์ฝ”๋“œ๋ฅผ ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑํ•˜๊ณ  ์ด ์Šค๋ ˆ๋“œ์—์„œ ์ œ๊ธฐ๋œ ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ถœ๋ ฅ์€ ๋ธŒ๋ผ์šฐ์ €์™€ Node.js์—์„œ ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ—›์†Œ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ผ _์˜ค๋Š˜_ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์•„๋‹ˆ, ๊ทธ๋ ‡์ง€ ์•Š๋‹ค. ์ตœ์†Œํ•œ ์ถœ๋ ฅ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ dist ๋˜๋Š” build ๋˜๋Š” lib ๋“ฑ์ธ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋œ ํŒŒ์ผ์€ ๋™์ผํ•œ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ์ง€ ์•Š์œผ๋ฉฐ ์ ˆ๋Œ€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ ( src/ ) - ํ…Œ์ŠคํŠธ ์ค‘์ด๊ฑฐ๋‚˜ ํŽธ์ง‘๊ธฐ์—์„œ ์ฝ”๋”ฉ ์ค‘์ด ์•„๋‹™๋‹ˆ๋‹ค.

์œ„์˜ src/index.ts ./foo.js ๋ฅผ ๊ฐ–๊ณ /๋ณด๊ณ  ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์•„๋ฌด๋Ÿฐ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  js/json ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋ ค๋Š” ์˜๋„๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์™„์ „ํžˆ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ typescript ์†Œ์Šค ํŒŒ์ผ( ./foo.ts )์„ ์˜๋ฏธํ•  ๋•Œ ./foo.js ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€... ์ž”์ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€ ์žˆ๊ณ  ํ˜ผ๋ž€์Šค๋Ÿฝ๊ณ  ํ™•์‹คํžˆ ์ž˜๋ชป๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Jest๋กœ ์œ„์˜ test/index.ts ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ./foo.ts ๋งŒ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ./foo.js ๋ฅผ ์ฐพ๊ฑฐ๋‚˜ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜ ์‹คํŒจํ•  ๊ฒƒ์ด๋ผ๊ณ  ๊ฑฐ์˜ ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ฒƒ์„ ์ œ์ณ๋‘๊ณ  .js ํ™•์žฅ์ž๋Š” ํ—ˆ์šฉ๋˜์ง€๋งŒ .ts $ ํ™•์žฅ์ž๋Š” ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ(ts report error in the editor)? ๊ทธ๊ฒƒ์€ ๊ธฐ๋ณธ์ ์ด๊ณ  ๋‹จ์ˆœํ•˜๋ฉฐ ์–ด๋ฆฌ์„์€ ๋ชจ์ˆœ์ž…๋‹ˆ๋‹ค. TypeScript์˜ ๋‹ค๋ฅธ ๋งŽ์€ "๊ทธ๋ƒฅ ๋•Œ๋ฌธ์—" ๋ฌธ์ œ.

์‹ค์ œ๋กœ .js ํ™•์žฅ์ž๋กœ ๋๋‚˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ๋ฐ ์™œ ์ด ๋ฌธ์ œ์˜ ์ด๋ฆ„์ด ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ๋ช…๋ช…๋˜์—ˆ๋Š”์ง€์— ๋Œ€ํ•œ ๋…ผ๋ฆฌ๋ฅผ ์žƒ์–ด๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ฌธ์ œ๊ฐ€ ์™„์ „ํžˆ ๋ฐ˜๋Œ€๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค .ts (3.7+ ๊ธฐ์ค€)๋กœ ๋๋‚  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ˆ˜์ž…์—์„œ .ts ํ™•์žฅ์ด ์™„์ „ํžˆ ๊ธˆ์ง€ ๋œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?!

๊ทธ๋ฆฌ๊ณ  ๋ช…ํ™•ํžˆ ํ•ฉ์‹œ๋‹ค. ๋‚˜๋Š” ๊ฐœ๋ฐœ ์‹œ๊ฐ„๊ณผ ๊ฒฝํ—˜์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋œ ์ถœ๋ ฅ์—์„œ .js ํ™•์žฅ์ž๋ฅผ ๋ณด์กดํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ์™€ ๋ณด๊ณ  ์˜ค๋ฅ˜ ์—†์ด .ts ํŒŒ์ผ์˜ ๊ฐ€์ ธ์˜ค๊ธฐ์— .js $ ํ™•์žฅ์ž๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋ฅผ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

TypeScript๋Š” JavaScript์˜ ์ƒ์œ„ ์ง‘ํ•ฉ์ด์ง€๋งŒ JavaScript๋Š” ์•„๋‹™๋‹ˆ๋‹ค. JavaScript๋Š” TypeScript์˜ ์ปดํŒŒ์ผ ๋Œ€์ƒ์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ์—ผ๋‘์— ๋‘๊ณ  TS๊ฐ€ JS๋กœ ์ปดํŒŒ์ผ๋œ๋‹ค๋Š” ์‚ฌ์‹ค์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  TypeScript ์ฝ”๋“œ๊ฐ€ ์™„์ „ํžˆ ๋…๋ฆฝ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

.ts ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ํ•  ๋•Œ .js ์ž‘์„ฑ์€ ๋Œ€์ƒ ์ปดํŒŒ์ผ ์œ ํ˜•์— ๋Œ€ํ•œ ์ง€์‹์„ ๊ฐ€์ •ํ•˜๊ณ  ์ปดํŒŒ์ผ ๋Œ€์ƒ์ด ํ•ญ์ƒ JavaScript๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

TypeScript๋ฅผ ์›น ์–ด์…ˆ๋ธ”๋ฆฌ ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ์ปดํŒŒ์ผํ•˜๊ฑฐ๋‚˜ Deno ๋˜๋Š” ts-node์™€ ๊ฐ™์€ ๋Œ€์ฒด ๋Ÿฐํƒ€์ž„์„ ์‚ฌ์šฉํ•˜์—ฌ TypeScript ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

.js ๋กœ ๋๋‚˜๋Š” import ๋ฌธ์€ ์ด๋Ÿฌํ•œ ์ปจํ…์ŠคํŠธ์—์„œ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋‚ด ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฒฝ๋กœ์— .ts ๋ฅผ ์ž…๋ ฅํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜ TypeScript ์†Œ์Šค ํŒŒ์ผ์„ ๊ฐ€์ •ํ•˜๋Š” ์ง€์ •๋œ ํ™•์žฅ์ž๊ฐ€ ์—†๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

typescript๊ฐ€ ํ๋ฆ„๊ณผ ๊ฐ™์€ ๊ตฌ๋ฌธ ์„คํƒ•์ด ์•„๋‹Œ ์ž์ฒด ํ™•์žฅ์„ ๋ฐœ๋ช…ํ–ˆ๋‹ค๋Š” ๊ฒƒ์€ ์Šฌํ”ˆ ์ผ์ž…๋‹ˆ๋‹ค.

@phaux ์†Œ์Šค ํŒŒ์ผ๊ณผ dist ํŒŒ์ผ์ด ๋‹ค๋ฅธ ํด๋”์— ์žˆ๋”๋ผ๋„ ๋™์ผํ•œ ํ™•์žฅ๋ช…์œผ๋กœ ํ˜ผํ•ฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ž‘์—…ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํด๋”์— ์‚ด๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ํŒŒ์ผ์˜ ์ด๋ฆ„์„ index.js ๋กœ ์ง€์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ(TypeScript๋ณด๋‹ค ํผ)๋Š” Visual Studio Code์˜ IntelliSense๊ฐ€ ์›น ๋ธŒ๋ผ์šฐ์ € ๋ฐ ๋…ธ๋“œ์—์„œ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ์ฐจ๋‹จํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ ์ง€์ •์ž์— ์ „์ฒด(์ƒ๋Œ€) ํŒŒ์ผ ๊ฒฝ๋กœ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์—†์œผ๋ฉด ์ƒ์„ฑ๋œ import ๋ฌธ์€ WebPack ๋ฐ TypeScript ์ž์ฒด์™€ ๊ฐ™์€ ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ ๋ฐ ๋ฒˆ๋“ค๋Ÿฌ์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

VSCode ํŒ€์˜ ์‘๋‹ต์€ ์ž๋™ ๊ฐ€์ ธ์˜ค๊ธฐ ์ œ์•ˆ์„ ์ œ๊ณตํ•˜๋Š” ์ฝ”๋“œ๋กœ ํ™•์žฅ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. TypeScript Language Server(์—ฌ๊ธฐ์„œ ๋…ผ์˜๋œ tsc ์•„๋‹˜)๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์•„๋Š” ์‚ฌ๋žŒ์ด VSCode๊ฐ€ TypeScript Language Server์—์„œ ์ž๋™ ๊ฐ€์ ธ์˜ค๊ธฐ ์ œ์•ˆ์„ ๋ฐ›๋Š”๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธ(๋˜๋Š” ์ˆ˜์ •)ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ƒํ™ฉ์€ ์•ฝ๊ฐ„ ๋ณต์žกํ•˜๊ณ  ๋ฏธ๋ฌ˜ํ•œ ์ฐจ์ด๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ".js" ํ™•์žฅ์ด ์ฒ˜์Œ์—๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์˜ ์šฐ์•„ํ•œ ์ง๊ด€๊ณผ ์ด์ƒ์— ๋ฐ˜๋Œ€๋˜์ง€๋งŒ, typescript๊ฐ€ ์Šน์ธ๋œ ๋ธŒ๋ผ์šฐ์ € ํ‘œ์ค€ ๋ฐ ์ถœํ•˜๋œ ๊ตฌํ˜„์—์„œ ๋งŽ์ด ๋ฒ—์–ด๋‚˜๋Š” ๊ฒƒ์€ ํ˜„๋ช…ํ•˜์ง€ ์•Š๊ณ  ํ˜ผ๋ž€์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” ํ˜„์žฌ์˜ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค:
typescript ๊ฐ€์ ธ์˜ค๊ธฐ๋Š” ๋Ÿฐํƒ€์ž„ ์— ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค . ์ฆ‰, ๊ฐ€์ ธ์˜ค๊ธฐ๋Š” fetch ํ˜ธ์ถœ ๋ฐ ๋‚˜๋จธ์ง€์™€ ๊ฐ™์ด "src"๊ฐ€ ์•„๋‹Œ "dist" ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด ์•„์ด๋””์–ด๋ฅผ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋‚˜๋จธ์ง€๋Š” ๊ฐ„๋‹จํ•˜๊ณ  ์ผ๊ด€๋œ

node๊ฐ€ commonjs์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํ™•์žฅ ์—†๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ์— typescript๊ฐ€ ๋งน๋ชฉ์ ์œผ๋กœ ".js"๋ฅผ ์ฒจ๋ถ€ํ•˜๋Š” ๊ฒƒ์€ ํ™•์‹คํžˆ ๋‚˜์œ ์ƒ๊ฐ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค (node โ€‹โ€‹esm ์ง€์›์—๋Š” ์˜ค๋Š˜๋‚  typescript์™€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ".js"๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ์ ์— ์œ ์˜ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค) โ€“ ".js"๋ฅผ ๋งน๋ชฉ์ ์œผ๋กœ ์ฒจ๋ถ€ ์ง„์ •ํ•œ ํ™•์žฅ์ž๊ฐ€ ์—†๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ ๋˜๋Š” css ๋˜๋Š” json๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ํŒŒ์ผ ์œ ํ˜•์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ™•์žฅ์ž๋ฅผ ์˜๋ฏธ ์žˆ๊ฒŒ ๋งŒ๋“ค๊ณ  ํŠน๋ณ„ํ•œ ๊ตฌ๋ฌธ ๋ถ„์„ ๋…ผ๋ฆฌ๋ฅผ ํ•„์š”๋กœ ํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์™€ typescript ์˜๋ฏธ๋ก  ์‚ฌ์ด์— ๋šœ๋ ทํ•œ ์ฐจ์ด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ๋ถ„๋ช…ํžˆ ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. fetch ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํ˜ธ์ถœํ•˜๋ฏ€๋กœ import ๊ฐ€ ๋น„์Šทํ•˜๊ฒŒ ์œ ์ง€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. typescript๊ฐ€ ".t" ํ™•์žฅ์ž๋ฅผ ".js"๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์ƒ๋Œ€์ ์œผ๋กœ ๋ฌดํ•ดํ•œ๊ฐ€์š”?

๋ฌผ๋ก  ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ".t" ํ™•์žฅ์ž๋ฅผ ๊ฐ€์ง„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ๊ฒฌ๋”œ ์ˆ˜ ์žˆ๋Š” ์•ฝ๊ฐ„ ์˜ ํŽ‘ํ‚คํ•œ ๋งˆ๋ฒ•์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ•œํŽธ์œผ๋กœ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฐฐ์šฐ๊ณ  ์ดํ•ดํ•ด์•ผ ํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ €์™€ ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ ์‹œ๋งจํ‹ฑ ์‚ฌ์ด์˜ ํŽ‘ํ‚คํ•˜๊ณ  ๋งˆ๋ฒ• ๊ฐ™์€ ํŠน์ดํ•œ ์ฐจ์ด์ ์ž…๋‹ˆ๋‹ค(๋ถ„๋ช…ํžˆ ์ด์ƒํ•œ ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค์–ด ๋ƒ„). ๊ทธ๋ž˜์„œ ์ œ ๋ณธ๋Šฅ์€ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๊ทธ๋Œ€๋กœ ๋‘๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋ฉด ๋งˆ๋ฒ•์ด ๋‹จ์ˆœํžˆ ".js" ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ํ•ด๋‹น ".ts" ์†Œ์Šค ํŒŒ์ผ๊ณผ ์—ฐ๊ฒฐํ•ด์•ผ ํ•˜๋Š” typescript๋กœ ์žฌ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ์˜๋ฏธ๋ฅผ ์ง“๋ฐŸ๋Š” ๋Œ€์‹  typescript ๋‚ด๋ถ€์— ์žˆ๋Š” ๋งˆ๋ฒ•์„ ๋‹ด๋‹ค

๐Ÿฅƒ ์ถ”๊ฒฉ์ „

@rconnamacher , @TomasHubelbauer

์ด ๋ฌธ์ œ(TypeScript๋ณด๋‹ค ํผ)๋Š” Visual Studio Code์˜ IntelliSense๊ฐ€ ์›น ๋ธŒ๋ผ์šฐ์ € ๋ฐ ๋…ธ๋“œ์—์„œ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ์ฐจ๋‹จํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ ์ง€์ •์ž์— ์ „์ฒด(์ƒ๋Œ€) ํŒŒ์ผ ๊ฒฝ๋กœ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์—†์œผ๋ฉด ์ƒ์„ฑ๋œ import ๋ฌธ์€ WebPack ๋ฐ TypeScript ์ž์ฒด์™€ ๊ฐ™์€ ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ ๋ฐ ๋ฒˆ๋“ค๋Ÿฌ์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์•ฝ๊ฐ„์˜ ํ˜ผ๋ž€์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋Š˜๋‚  ๋ธŒ๋ผ์šฐ์ €์™€ ๋…ธ๋“œ์—์„œ ์ž‘๋™ํ•˜๊ณ  esm ๋˜๋Š” commonjs์—์„œ ์ž‘๋™ํ•˜๋Š” vscode ๋ฐ intellisense์™€ ํ•จ๊ป˜ ์ž˜ ์ž‘๋™ํ•˜๋Š” typescript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋˜๋Š” ์•ฑ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋งค์šฐ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ง„์ •ํ•œ ๋ณดํŽธ์ ์ธ ์†”๋ฃจ์…˜์€ ์˜ค๋Š˜๋‚  ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” renraku , cynic , redcrypto , ๊ถŒ์œ„์ฃผ์˜ ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์†Œ์ˆ˜์˜ ๊ณต๊ฐœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ž‘์—…ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฉ”์ผ์„ ๋ณด๋‚ด์ฃผ์‹œ๋ฉด ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

:์›จ์ด๋ธŒ: ์ถ”๊ฒฉ

๋˜ ๋‹ค๋ฅธ ์š”์ ์€ ์•ก์„ธ์Šคํ•˜๋Š” ํŒŒ์ผ์— ํ˜ผ๋ž€์„ ์ดˆ๋ž˜ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. .js ๋ฐ .ts ํŒŒ์ผ์ด ๋‚˜๋ž€ํžˆ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ชจ๋“ˆ ํ™•์ธ ํ›„ tsc ๊ฐ€ ๋ฌด์—‡์„ ๋ณด๋Š”์ง€ ์ด๋ฏธ ๋ชจํ˜ธํ•ฉ๋‹ˆ๋‹ค.

/folder
  a.ts
  a.js
  index.ts

index.ts ์ธ ๊ฒฝ์šฐ moduleResolution: 'node' ์‚ฌ์šฉ ์‹œ

// points to a.ts
import * as a from './a` 

// points to a.ts
import * as a from './a.js` 

// compiler emits error
import * as a from './a.ts` 

.js ๋ฐ .ts ํŒŒ์ผ์ด ๋‚˜๋ž€ํžˆ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ชจ๋“ˆ ํ™•์ธ ํ›„ tsc๊ฐ€ ํ™•์ธํ•˜๋Š” ๋‚ด์šฉ์ด ์ด๋ฏธ ๋ชจํ˜ธํ•ฉ๋‹ˆ๋‹ค.

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ a.js ๊ฐ€ a.ts ์˜ ํŠธ๋žœ์ŠคํŒŒ์ผ ๋ฒ„์ „์ด ์•„๋‹Œ ๊ฒฝ์šฐ ๋ฌด์–ธ๊ฐ€๊ฐ€ ์น˜๋ช…์ ์œผ๋กœ ์ž˜๋ชป๋œ ๊ฒƒ์ด๋ฉฐ TypeScript์˜ ์ž˜๋ชป์ด ์•„๋‹™๋‹ˆ๋‹ค.

@thw0rted ๋‹จ์ผ JS ๋ฒˆ๋“ค ํŒŒ์ผ๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒฝ์šฐ TypeScript๋Š” ์ž…๋ ฅ TypeScript ํŒŒ์ผ์— ๋Œ€ํ•ด JS ๋Œ€์‘ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ๋‹จ์ผ ๋ฒˆ๋“ค ํŒŒ์ผ๋งŒ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ JS ํŒŒ์ผ๊ณผ ๋™์ผํ•œ ์ด๋ฆ„์˜ TS ํŒŒ์ผ์ด ์–ด๋–ค ์‹์œผ๋กœ๋“  ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์™„์ „ํžˆ ํ•ฉ๋ฒ•์ ์ž…๋‹ˆ๋‹ค.

"๋ถˆ๋ฒ•"์€ ์•„๋‹ˆ์ง€๋งŒ ๊ทธ๊ฒƒ์ด ์ข‹์€ ์ƒ๊ฐ์ด๋ผ๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ด๊ฒƒ์„ ์›ํ•˜๋Š” ์œ„์น˜์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฒˆ๋“ค๋Ÿฌ, ๋กœ๋” ์—†์ด ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” JavaScript๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ๋ฐฉ์‹์œผ๋กœ TypeScript๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์˜ˆ๋กœ์„œ:
https://github.com/alshdavid/tsc-website

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋ฌธ์ œ์˜ ๊ณ ํ†ต์„ ๋Š๋‚€๋‹ค. TypeScript ํŒ€์€ ๋ชจ๋“ˆ ํ™•์ธ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. TypeScript ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— paths ๋ฅผ ์‹ค์ œ ์ƒ๋Œ€ ๊ฒฝ๋กœ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ด์œ ์ž…๋‹ˆ๋‹ค.

๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ .ts ์—์„œ .js ๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ํ™•์žฅ ์—†์ด ๊ฐ€์ ธ์˜ค๊ธฐ์— .js ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ TypeScript ํŒ€์ด ๋ชจ๋“ˆ ํ™•์ธ์„ ๊ตฌํ˜„ํ•˜๊ณ  ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์€ TypeScript ํŒ€์ด ํ™•์žฅ์„ ๋„์ž…ํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์€ TypeScript ํŒ€์ด ํ™•์žฅ์„ ๋„์ž…ํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋“ค์€ ๋‹จ์ง€ tsc ๋ฅผ ํ†ตํ•ด ๋…ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์ปดํŒŒ์ผ๋Ÿฌ์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹ ํ˜ธ์ถœ์„ ํ†ตํ•ด์„œ๋งŒ). ์šด ์ข‹๊ฒŒ๋„ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ตฌ์„ฑ์„ ํ†ตํ•ด ํ™•์žฅ์„ ์ง€์›ํ•œ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ  tsc ์™€ ๊ฐ™์ด _์ •ํ™•ํ•˜๊ฒŒ_ ์ž‘๋™ํ•˜๋Š” ํ•ต์‹ฌ ์ปดํŒŒ์ผ๋Ÿฌ ์ฃผ์œ„์— ๋ž˜ํผ๋ฅผ ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด tsc ๋ž˜ํผ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด https://github.com/Zoltu/typescript-transformer-append-js-extension/ ๊ณผ ๊ฐ™์€ ํ™•์žฅ์„ ์‚ฌ์šฉํ•˜์—ฌ .js ํ™•์žฅ์„ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@alshdavid GitHub์˜ ์˜ˆ์ œ๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ์— .js ํ™•์žฅ๋งŒ ํฌํ•จํ•˜๋ฉด ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ์—†๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊ณ ์น˜๊ธฐ ์œ„ํ•ด PR์„ ์ œ์ถœํ–ˆ๋‹ค.

@alshdavid ๋‚ด ์ƒ˜ํ”Œ ํ”„๋กœ์ ํŠธ (ํ˜„๋Œ€ ๋ฐ IE11 with SystemJS์šฉ esm)์— ๊ด€์‹ฌ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ esm ๋ชจ๋“ˆ์„ ์ˆ˜๋™์œผ๋กœ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค =(

๋‚ด ๋ชจ๋“  import ์— .js ๋ฅผ ๋„ฃ๋Š” ๊ฒƒ์€ ์›์น™์ ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„ ์ผ๋ถ€ ๋„๊ตฌ์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ์ด ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ts-node ์ดˆํฌ: https://github.com/TypeStrong/ts-node/issues/783. .js ํ™•์žฅ์ž๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” TypeScript ๋˜๋Š” ๋ฒˆ์—ญ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด TypeScript ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๋„๊ตฌ์— ๋Œ€ํ•œ ์ฑ…์ž„์ด ๋ˆ„๊ตฌ์—๊ฒŒ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ํ•ฉ์˜๊ฐ€ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ฑ…์ž„์„ ์ง€๋Š” ํ•œ ์‚ฌ์šฉ์ž๋Š” ๋ฌธ์„œํ™”๋˜์ง€ ์•Š์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋‚˜ ์ƒํ˜ธ ์šด์šฉ์„ฑ ๋น„ํ˜ธํ™˜์„ฑ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ถˆํŽธํ•œ ์„œ๋น„์Šค ์ž‘์—…์ž๋กœ ๊ณ ํ†ต๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? Webpack๊ณผ ๊ฐ™์€ ์™ธ๋ถ€ ๋ชจ๋“ˆ ๋กœ๋”๋‚˜ ๋ฒˆ๋“ค๋Ÿฌ ์—†์ด๋Š” ์˜ค๋Š˜๋‚  TypeScript๋ฅผ ์ •์ƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด ์†”์งํžˆ ๋ฏฟ๊ธฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๋„ˆ๋ฌด ์ด์ƒํ•˜๊ณ  ๋˜ํ•œ ์‹ค๋ง์Šค๋Ÿฝ๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค. TypeScript๊ฐ€ ์™„์ „ํžˆ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ์™ธ๋ถ€ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด Electron ์•ฑ์—์„œ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋Š”๋ฐ ์›น ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•  ์ด์œ ๊ฐ€ ์—†๊ณ  ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์™ธ๋ถ€ ๋ชจ๋“ˆ ๋กœ๋”๋ฅผ ์„ค์น˜ํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋‚˜๋ฅผ ํ™”๋‚˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ TypeScript + Electron ์„ค์ •์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜์กฐ์ฐจ ์—†์—ˆ์ง€๋งŒ ๋‘˜ ๋‹ค ์–ด๋””์—์„œ๋‚˜ ์ตœ๊ณ ์˜ ์†”๋ฃจ์…˜์œผ๋กœ ์นญ์ฐฌ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฑด ๋ฏธ์นœ ์ง“์ด์•ผ, ์†”์งํžˆ ๋งํ•ด์„œ. ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ์ง€๋งŒ ์ ์ ˆํ•œ ์†”๋ฃจ์…˜์„ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์€ ์ขŒ์ ˆ๊ฐ์„ ์ฃผ๋Š” ๊ฒƒ ์ด์ƒ์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ •๋ง ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์™œ ์ด ๋ฌธ์ œ๊ฐ€ 3๋…„ ๋™์•ˆ ์ˆ˜์ •๋˜์ง€ ์•Š์•˜๋Š”์ง€ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค...

์ตœ๊ทผ์— typescript ์ž์Šต์„œ๋ฅผ ์™„๋ฃŒํ•œ ๋‹ค์Œ ์ผ๋ถ€ ts ํŒŒ์ผ์„ ๋งŒ๋“ค๋ ค๊ณ  ํ•  ๋•Œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ด js-ts ์„ธ๊ณ„์— ์™„์ „ํžˆ ์ต์ˆ™ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ž˜๋ชป๋œ ๊ฒƒ์ด ์žˆ๊ฑฐ๋‚˜ ์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ ์ •๋ณด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ €๋ฅผ ์šฉ์„œํ•ด ์ฃผ์‹ญ์‹œ์˜ค.

๋‚ด๊ฐ€ ํ•œ ์ผ์€ ์ˆ˜์ž…ํ•˜๋Š” ๋™์•ˆ

๋ฐฉ๊ธˆ ts ํŒŒ์ผ์— .js ํ™•์žฅ์ž๋ฅผ ๋„ฃ์€ ๋‹ค์Œ Intellisense๋ฅผ ํ™•์ธํ–ˆ์„ ๋•Œ tsc๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€ํ™˜ํ–ˆ์„ ๋•Œ๋„ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒ์„ฑ๋œ ์ถœ๋ ฅ ํŒŒ์ผ์— .js ํ™•์žฅ๋ช…๋„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋‚ด๊ฐ€ ํ•œ ์ผ์ž…๋‹ˆ๋‹ค.
tsc -p tsconfig.json

{
"์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜": {
//"๋ชจ๋“ˆ": "amd",
"๋ชจ๋“ˆ": "es6",
"๋Œ€์ƒ": "es6",
"noImplicitAny": ๊ฑฐ์ง“,
"๋Œ“๊ธ€ ์ œ๊ฑฐ": ์ฐธ,
"preserveConstEnums": ๊ฑฐ์ง“,
//"outFile": "js",
"outDir": "js",
"sourceMap": ๊ฑฐ์ง“
},
"ํฌํ•จ": [
"testscript.ts"
]
}

๊ทธ๊ฒƒ์ด ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ–ˆ์ง€๋งŒ.

๋‚ด ์˜์‹ฌ์€ ๊ฐ€์ ธ์˜ฌ svgwrapper.js๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์—
์™œ/ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ–ˆ๋‚˜์š”? (๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํ™•์žฅ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค)

์ฐธ๊ณ ์šฉ์œผ๋กœ ์Šคํฌ๋ฆฐ์ƒท์„ ์ฒจ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.

ts-js-ext-issue

@yogeshjog ์ด๊ฒƒ์ด ์ •ํ™•ํžˆ tsc ์˜ ์ž‘๋™ ๋ฐฉ์‹๊ณผ ์ž‘๋™ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ƒ์„ฑ๋  ํŒŒ์ผ ์ด๋ฆ„์œผ๋กœ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๊ฐ€์ ธ์˜จ ๋ชจ๋“ˆ์ด ์›๋ž˜ .ts ํŒŒ์ผ๋กœ ์ž‘์„ฑ๋˜์—ˆ๋Š”์ง€ ์•„๋‹ˆ๋ฉด .d.ts / .js ์Œ์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ ๋ชจ๋“ˆ์—์„œ ๊ด€์ฐฐํ•  ์ˆ˜ ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@yogeshjog ์ด๊ฒƒ์ด ์ •ํ™•ํžˆ tsc ์˜ ์ž‘๋™ ๋ฐฉ์‹๊ณผ ์ž‘๋™ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ƒ์„ฑ๋  ํŒŒ์ผ ์ด๋ฆ„์œผ๋กœ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๊ฐ€์ ธ์˜จ ๋ชจ๋“ˆ์ด ์›๋ž˜ .ts ํŒŒ์ผ๋กœ ์ž‘์„ฑ๋˜์—ˆ๋Š”์ง€ ์•„๋‹ˆ๋ฉด .d.ts / .js ์Œ์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ ๋ชจ๋“ˆ์—์„œ ๊ด€์ฐฐํ•  ์ˆ˜ ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”! @justinfagnani ์„ค๋ช…์„ ์œ„ํ•ด ๐Ÿ‘

์ƒ์„ฑ๋  ํŒŒ์ผ ์ด๋ฆ„์œผ๋กœ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ TypeScript๋Š” ECMAScript์— ๋”ฐ๋ผ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ํ™•์žฅ์ž๋ฅผ ์ƒ๋žตํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. VSCode์—์„œ ๊ฐ€์žฅ ์งœ์ฆ๋‚˜๋Š” ๊ธฐ๋Šฅ์ธ ์ž๋™ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๋•Œ ํ™•์žฅ์ž๋ฅผ ์ƒ๋žตํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ JS๋ฅผ ์ž‘์„ฑํ•˜๊ณ  TS๋Š” ๊ดœ์ฐฎ๋‹ค๊ณ  ๋งํ•œ ๋‹ค์Œ ๋Ÿฐํƒ€์ž„์— ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ TypeScript๋Š” ํ™•์žฅ์ž๋ฅผ ์ƒ๋žตํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…ธ๋“œ ํ™•์ธ์„ ์‚ฌ์šฉํ•  ๋•Œ. tsconfig๋Š” ์ตœ์†Œํ•œ ์ด๊ฒƒ์— ๋Œ€ํ•ด ๊ฒฝ๊ณ ํ•˜๋Š” ๋‹ค๋ฅธ ํ•ด์ƒ๋„ ๋ชจ๋“œ๋ฅผ ํ—ˆ์šฉํ•˜๋„๋ก ์„ค์ •๋˜์–ด ์žˆ์ง€๋งŒ, ํŒ€์ด ๋” ๋งŽ์€ ๋ชจ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์— ๊ธฐ๋ณธ ๋ชจ๋“ˆ ์ง€์›์ด ์ •์ฐฉ๋˜๋„๋ก ๋‚ด๋ฒ„๋ ค ๋‘” ๊ฒƒ์œผ๋กœ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ECMAScript์— ๋”ฐ๋ผ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ECMAScript๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ ์ง€์ •์ž์— ๋Œ€ํ•ด ์•„๋ฌด ๋ง๋„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ HTML ๋ฐ Node.js์™€ ๊ฐ™์€ ํ˜ธ์ŠคํŠธ ํ™˜๊ฒฝ์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. TypeScript๋Š” ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•  ๋•Œ ๋…ธ๋“œ ํ•ด์„์„ ์ง€์›ํ•˜๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ _input_์ด ์•„๋‹Œ ์ปดํŒŒ์ผ๋Ÿฌ _output_์— ๋Œ€ํ•ด ํ•ด์„์„ ํ•ด์„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ ์ง€์ •์ž๋Š” ์ปดํŒŒ์ผ ํ›„์— ์ž‘๋™ํ•˜๋ฉฐ ์ปดํŒŒ์ผ๋œ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๋ ค๋Š” ์‹œ๋„ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

TypeScript๋Š” ๊ฒฝ๋กœ ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•˜์—ฌ './foo' info './foo.js' , './foo' ๊ฐ€ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋…ธ๋“œ ํ™•์ธ์€ './foo.ts' ์„ './foo.js' ๋กœ ๋ฐ”๊พธ์ง€ ์•Š์œผ๋ฏ€๋กœ './foo.ts' ๋Š” ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๋…ธ๋“œ ํ•ด์ƒ๋„ ๋‚ด์— ์žˆ์Šต๋‹ˆ๋‹ค. HTML ๋˜๋Š” Node์˜ ๊ธฐ๋ณธ ๋ชจ๋“ˆ ์ง€์›๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ํ™˜๊ฒฝ์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ TypeScript์™€ ํ˜ธ์ŠคํŠธ๋Š” ๋ฌด์—‡์ด ์œ ํšจํ•œ์ง€์— ๋Œ€ํ•ด ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด์ œ TypeScript๊ฐ€ ๋‹ค๋ฅธ ํ•ด์ƒ๋„ ์„ค์ •์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ ์ง€์›์ด ํ•ด๊ฒฐ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@leontepe ๋ฒˆ๋“ค๋Ÿฌ /๋กœ๋”๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. https://github.com/Zoltu/typescript-transformer-append-js-extension/ (๋‚ด๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ์†”๋ฃจ์…˜)์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ชจ๋“  ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฌธ์— .js ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ฃผ์˜: ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ts-node ์—์„œ ์ฝ”๋“œ๊ฐ€ ์‹คํŒจํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

@leontepe ๋ฒˆ๋“ค๋Ÿฌ /๋กœ๋”๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. https://github.com/Zoltu/typescript-transformer-append-js-extension/ (๋‚ด๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ์†”๋ฃจ์…˜)์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ชจ๋“  ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฌธ์— .js ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ฃผ์˜: ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ts-node ์—์„œ ์ฝ”๋“œ๊ฐ€ ์‹คํŒจํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

@MicahZoltu ๊ธ€์Ž„์š”, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ '์ฆ‰์‹œ' ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์— ์—ฌ์ „ํžˆ ์‹ค๋ง์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. @phaux ๊ฐ€ ๋งํ–ˆ๋“ฏ์ด VSCode๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ํ™•์žฅ ์—†์ด import ๋ฌธ์„ ๋งŒ๋“ค ๊ฒƒ์„ ์ œ์•ˆํ•˜๋ฉฐ ์ด๋Š” ๋‹จ์ˆœํžˆ ๋Ÿฐํƒ€์ž„์— ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ๊ธฐ์„œ TypeScript ํŒ€์˜ ๋Šฅ๋ ฅ์— ๋Œ€ํ•ด ์‹ฌ๊ฐํ•˜๊ฒŒ ์˜๋ฌธ์„ ์ œ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ˆ„๊ฐ€ ์•Œ๊ฒ ์Šต๋‹ˆ๊นŒ...

ํŽธ์ง‘: ์ด ์‹œ์ ์—์„œ JavaScript + Babel์šฉ TypeScript๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์„ ์ง„์ง€ํ•˜๊ฒŒ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” Electron ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ๊ณ ์ •๋œ ์ˆœ์„œ๋กœ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๋ฅผ ์‹œ๋„ํ•˜๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์žˆ๋Š” ๋…ธ๋“œ ์Šคํƒ€์ผ ํ•ด๊ฒฐ์„ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋ชจ๋“  ์†Œ์Šค๊ฐ€ ๋กœ์ปฌ ๋ฆฌ์†Œ์Šค์—์„œ ๋กœ๋“œ๋œ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•˜๋ฉด ๊ดœ์ฐฎ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค...

TS์— ์ƒˆ๋กœ์šด ๋ชจ๋“ˆ ํ•ด์ƒ๋„๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๊ฐ€ ๋˜์—ˆ๋‚˜์š”? Node.js๋Š” ์ด์ œ ๊ธฐ๋ณธ ESM์„ ์ง€์›ํ•˜์ง€๋งŒ ์ƒ๋Œ€ ๊ฒฝ๋กœ์— ๋ช…์‹œ์ ์ธ ํ™•์žฅ์ด ์—†์œผ๋ฉด --experimental-specifier-resolution=node ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋‹ค์†Œ ์งœ์ฆ์ด ๋‚ฉ๋‹ˆ๋‹ค. Deno์™€ ๋ธŒ๋ผ์šฐ์ €๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
tsconfig.json:

{
    "compilerOptions": {
        "moduleResolution": "explicit",
        "strict": true
    }
}

๊ทธ๋Ÿฐ ๋‹ค์Œ Typescript:

import foo from './foo.ts'; // no ts(2691) here

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ปดํŒŒ์ผ:

import foo from './foo.js';

"strict": true๋Š” ๋งŽ์€ ์ž‘์—…์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค!
2020, ์—ฌ์ „ํžˆ ์ˆ˜์ •๋˜์ง€ ์•Š์€, ์šฐ์Šค๊ฝ์Šค๋Ÿฌ์šด.

์ด ๋ฌธ์ œ๊ฐ€ ์šฐ๋ฆฌ ํŒ€๋„ ์ฐจ๋‹จํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๋งํ•˜๋ฉด์„œ ์†Œ๋ฆฌ๋ฅผ ์ง€๋ฅด์‹ญ์‹œ์˜ค ๐Ÿ˜ข

์šฐ๋ฆฌ๋Š” ๊ธฐ๋ณธ ๋ชจ๋“ˆ๋กœ ๋นŒ๋“œ๋˜๊ณ  ๋…ธ๋“œ ๋ฐ ์›นํŒฉ์—์„œ๋„ ์†Œ๋น„ ๊ฐ€๋Šฅํ•œ ๋‹จ์ผ ์†Œ์Šค๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์ •๋ง๋กœ ์›ํ•ฉ๋‹ˆ๋‹ค. TS ์ฝ”๋“œ์˜ ๊ฐ€์ ธ์˜ค๊ธฐ์— .js๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋„ฃ์œผ๋ฉด Webpack์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ€์ ธ์˜ค๊ธฐ์— .ts ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ๋„ฃ์œผ๋ฉด ์ผ์ข…์˜ ์›นํŒฉ์ด ์ž‘๋™ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฌผ๋ก  typescript๋Š” ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ํ™•์žฅ์ž๊ฐ€ ์—†์œผ๋ฉด ๊ธฐ๋ณธ ๋ชจ๋“ˆ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ธŒ๋ผ์šฐ์ €์™€ ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ๋งŒ์กฑ์‹œํ‚ค๋Š” ์กฐํ•ฉ์€ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฐ€์ ธ์˜ค๊ธฐ์— .t๋ฅผ ์“ฐ๊ณ  ์ถœ๋ ฅ์—์„œ โ€‹โ€‹.js๊ฐ€ ๋˜๋„๋ก ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. @ evg656 ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ์ž‘๋™ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@EisenbergEffect ์ด์— ๋Œ€ํ•ด WebPack์— ๋Œ€ํ•ด ๋ฒ„๊ทธ๊ฐ€ ์ œ์ถœ๋˜์—ˆ์Šต๋‹ˆ๊นŒ? ์ •๋ง ์ผ๋ฐ˜ tsc์—์„œ ๋ฐœ์‚ฐํ•˜๋Š” WebPack ๋ฌธ์ œ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

@justinfagnani ๋ฌธ์ œ๊ฐ€ webpak, ts-loader ๋˜๋Š” ๋‹ค๋ฅธ ๊ณณ์— ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ตœ์ ์˜ ๋นŒ๋“œ ์„ค์ •์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์€ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ์ง€๋งŒ ๋ชจ๋“  ํ™•์ธ๋ž€์„ ์„ ํƒํ•˜๋Š” ์†”๋ฃจ์…˜์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ปค์Šคํ…€ ํŠธ๋žœ์Šคํฌ๋จธ๋‚˜ ๋นŒ๋“œ ํ›„ ๋‹จ๊ณ„๋กœ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ด ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹ค์šด์ŠคํŠธ๋ฆผ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋น„ํ‘œ์ค€ ์„ค์ •์„ ์ฑ„ํƒํ•˜๋Š” ๊ฒƒ์„ ๊บผ๋ฆฝ๋‹ˆ๋‹ค.

@EisenbergEffect WebPack์˜ TypeScript ๋กœ๋”๊ฐ€ tsc .js ํ™•์žฅ์ž๋ฅผ ํ†ตํ•ด TypeScript ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†๋‹ค๋ฉด ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค. ๋งํ–ˆ๋“ฏ์ด ์ด ๋™์ž‘์€ WebPack ๋ฐ tsc ๋กœ ๋™์ผํ•œ ์†Œ์Šค ๋นŒ๋“œ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

TS์— ์ƒˆ๋กœ์šด ๋ชจ๋“ˆ ํ•ด์ƒ๋„๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๊ฐ€ ๋˜์—ˆ๋‚˜์š”? Node.js๋Š” ์ด์ œ ๊ธฐ๋ณธ ESM์„ ์ง€์›ํ•˜์ง€๋งŒ ์ƒ๋Œ€ ๊ฒฝ๋กœ์— ๋ช…์‹œ์ ์ธ ํ™•์žฅ์ด ์—†์œผ๋ฉด --experimental-specifier-resolution=node ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋‹ค์†Œ ์งœ์ฆ์ด ๋‚ฉ๋‹ˆ๋‹ค. Deno์™€ ๋ธŒ๋ผ์šฐ์ €๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
tsconfig.json:

{
    "compilerOptions": {
        "moduleResolution": "explicit",
        "strict": true
    }
}

๊ทธ๋Ÿฐ ๋‹ค์Œ Typescript:

import foo from './foo.ts'; // no ts(2691) here

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ปดํŒŒ์ผ:

import foo from './foo.js';

์‚ฌ๋žŒ๋“ค(์˜ˆ๋ฅผ ๋“ค์–ด, ์ €)์€ Node.js, Deno ๋ฐ ์›น์—์„œ ๋™์‹œ์— ํ•˜๋‚˜์˜ ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๊ณ  ์‹ถ์–ดํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด TypeScript/JavaScript ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํฐ ์ด์ •ํ‘œ๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

vscode๋ฅผ ์‚ฌ์šฉ ์ค‘์ด๊ณ  ์ž„์‹œ ์†”๋ฃจ์…˜์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ด๊ฒƒ์„ settings.json ์— ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

"typescript.preferences.importModuleSpecifierEnding": "js"

.js ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฒฝ๋กœ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค(์ด๋Š” ์˜ค๋ฅ˜ ์—†์ด src์˜ *.ts ํŒŒ์ผ์„ ํ•ด๊ฒฐํ•˜์ง€๋งŒ ํŠธ๋žœ์ŠคํŒŒ์ผํ•  ๋•Œ .js ๋ฅผ ์œ ์ง€ํ•จ). ๋ฒˆ๋“ค๋Ÿฌ ์—†์ด tsc ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ tsc ์†”๋ฃจ์…˜์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ์ด์— ๋Œ€ํ•œ ๋‚ฎ์€ ๊ธฐ์ˆ  ์ˆ˜์ • ์‚ฌํ•ญ์€

  1. ๋ชจ๋“  ์†Œ์Šค ํŒŒ์ผ์„ ์ž„์‹œ ํด๋”์— ๋ณต์‚ฌ
  2. ๋นŒ๋“œ ์ „์— ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฐ ๋‚ด๋ณด๋‚ด๊ธฐ์— ๋Œ€ํ•œ ํ™•์žฅ์„ ์ œ๊ฑฐํ•˜์‹ญ์‹œ์˜ค.

๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด ํ•œ ์ค„์งœ๋ฆฌ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. src/ ํด๋”๋ฅผ tmp/์— ๋ณต์‚ฌํ•˜๊ณ  ๊ฑฐ๊ธฐ์—์„œ ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

npx shx cp -r ./src/ ./tmp/ && npx rexreplace "(^ยงs*?(?:import|export).*?fromยงs+?(['\"]).*?)ยง.tsยง2" โ‚ฌ1โ‚ฌ2 './tmp/**/*.{ts,js,tsx,jsx}'

package.json์˜ ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ์˜ ์ผ๋ถ€๋กœ( yarn add --dev shx rexreplace ์ˆ˜ํ–‰ ํ›„) ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

"scripts":{
  "build": "yarn build-esm && yarn build-tsc",
  "buil-esm": "...Whatever you normally do...",
  "build-tsc": "shx mkdir -p tmp && shx cp -r ./src/* ./tmp && rexreplace \"(^ยงs*?(?:import|export).*?fromยงs+?(['\\\"]).*?)ยง.tsยง2\" โ‚ฌ1โ‚ฌ2 './tmp/**/*.{ts,js,tsx,jsx}' && tsc src/index.ts && shx rm -r ./tmp"
}

Jest๋ฅผ ํ–‰๋ณตํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ˜„์žฌ TypeScript ์†Œ์Šค์˜ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฒฝ๋กœ์—์„œ .js ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ๋‹ค์Œ .js ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์‚ฌํ›„ ์ฒ˜๋ฆฌ ๋‹จ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ๋ฐฉ๋ฒ•์—์„œ๋Š” ์†Œ์Šค ๋งต์ด ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

tsc -b tsconfig-solution.json -w --listEmittedFiles \
  | node mk/build-post.js

build-post.js ์‚ฌํ›„ ์ฒ˜๋ฆฌ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ƒ๋Œ€ ๊ฒฝ๋กœ์˜ import ๋ฐ export ์— .js ์ถ”๊ฐ€

์˜ˆ๋ฅผ ๋“ค์–ด,

export { X } from "./first";
import { Y } from "./second";

๋œ๋‹ค

export { X } from "./first.js";
import { Y } from "./second.js";

์–ด๋””์—์„œ๋‚˜ index.ts ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  Deno ๊ทœ์น™์— ๋”ฐ๋ผ mod.ts ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ /index.js ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

CommonJS ํŒจํ‚ค์ง€์— ๋Œ€ํ•ด import ๋ฅผ require ๋กœ ๋ณ€๊ฒฝ

๋‚ด ์ฝ”๋“œ๋Š” ๋…ธ๋“œ ^12.17 ๋ฐ ^14.1์—์„œ ๋ชจ๋“ˆ ๋ชจ๋“œ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ES ๋ชจ๋“ˆ๋งŒ ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋งŽ์€ ์ข…์†์„ฑ์—๋Š” "main" ํ•„๋“œ์— CommonJS๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ NodeJS ๋‚ด์žฅ ๋ชจ๋“ˆ์„ ์ œ์™ธํ•˜๊ณ  CommonJS๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด,

import { Server as WsServer } from "ws";

๋œ๋‹ค

import { createRequire } from "module";
const require = createRequire(import.meta.url);
const { __importDefault } = require("tslib");

const { Server: WsServer } = require("ws");

๊ทธ๋Ÿฌ๋‚˜ webpack์€ ์ด๋Ÿฌํ•œ require ์— ๋งŒ์กฑํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

/// #if false
import { createRequire } from "module";
const require = createRequire(import.meta.url);
const { __importDefault } = require("tslib");
/// #endif

/// #if false
const { Server: WsServer } = require("ws");
/*
/// #else
import { Server as WsServer } from "ws";
/// #endif
/// #if false
*/
/// #endif

webpack์—์„œ ๋‚ด ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ชจ๋“  ํŒจํ‚ค์ง€๋Š” ifdef-loader ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฉฐ, ๊ทธ๋Ÿฌ๋ฉด webpack์€ ์›๋ž˜ import ํ–‰์„ ๋ณด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ €ํฌ๋„ ์ด์— ํ”ผํ•ด๋ฅผ ์ž…๊ณ  ์žˆ๋Š”๋ฐ, ์‹ ๊ณ ๋œ ์ง€ 3๋…„์ด ๋„˜๋„๋ก ์ˆ˜์ •๋˜์ง€ ์•Š๋Š”์ง€ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
VSCode ํŠน์ • ์„ค์ •์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋„๋ก WebStorm์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ถœ๋ ฅ์„ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋ณ„๋„์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ฆฌ์„์€ ์ผ์ž…๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ํƒ€์‚ฌ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

+1

์ด๊ฒƒ์€ asp.net core 3.1 ์›น ์‚ฌ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค(๋‚ฎ์€ ๋ฒ„์ „์—์„œ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Œ).
startup.cs์—์„œ:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseRouting();

            var rewriteOptions = new RewriteOptions();
            rewriteOptions.AddRewrite(@"^js/(.+)", "js/$1.js", skipRemainingRules: true);

            app.UseRewriter(rewriteOptions);

            app.UseStaticFiles();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapGet("/", async context =>
                {
                    await context.Response.WriteAsync("Hello World!");
                });
            });
        }

์žฌ์ž‘์„ฑ ๋ฏธ๋“ค์›จ์–ด๋Š” /js ํด๋”๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๋ชจ๋“  ์š”์ฒญ์— โ€‹โ€‹ํ™•์žฅ์ž ".js"๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
๊ฒฝ๊ณ : ์—ฌ๊ธฐ์„œ ๋ฏธ๋“ค์›จ์–ด์˜ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. UseStaticFiles๋Š” UseRewriter ๋’ค์— ๋ฐฐ์น˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ €๋Š” ์ฆ‰์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์„ ์„ ํ˜ธํ•˜์ง€๋งŒ ๊ทธ๋•Œ๊นŒ์ง€๋Š”...

TS์— ์ƒˆ๋กœ์šด ๋ชจ๋“ˆ ํ•ด์ƒ๋„๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๊ฐ€ ๋˜์—ˆ๋‚˜์š”? Node.js๋Š” ์ด์ œ ๊ธฐ๋ณธ ESM์„ ์ง€์›ํ•˜์ง€๋งŒ ์ƒ๋Œ€ ๊ฒฝ๋กœ์— ๋ช…์‹œ์ ์ธ ํ™•์žฅ์ด ์—†์œผ๋ฉด --experimental-specifier-resolution=node ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋‹ค์†Œ ์งœ์ฆ์ด ๋‚ฉ๋‹ˆ๋‹ค. Deno์™€ ๋ธŒ๋ผ์šฐ์ €๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
tsconfig.json:

{
    "compilerOptions": {
        "moduleResolution": "explicit",
        "strict": true
    }
}

๊ทธ๋Ÿฐ ๋‹ค์Œ Typescript:

import foo from './foo.ts'; // no ts(2691) here

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ปดํŒŒ์ผ:

import foo from './foo.js';

node/file-extension-in-import ๊ทœ์น™์„ eslint-plugin-node ์—์„œ import ๋ฌธ์— ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€ํ•˜๊ณ  TypeScript์—์„œ "moduleResolution": "node" ์— ํ™•์žฅ์„ ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค๋Š” ์•„์ด๋””์–ด๋กœ linting ๊ตฌ์„ฑ์— ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑํ•˜๊ณ  ๋‚ด๊ฐ€ ๋ณผ ์ˆ˜์žˆ๋Š” ๊ฒƒ์€ ts(2691) ์ž…๋‹ˆ๋‹ค.

@evg656 ์ด ๋งํ•œ ๊ฒƒ์ด ๊ตฌํ˜„ํ• ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์—ฌ์ „ํžˆ ๋ฌธ์ œ๋ผ๋Š” ๊ฒƒ์ด ๋ฏฟ๊ธฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ์‚ฌ์šฉํ•  ๋•Œ
"baseUrl": ".", "paths": { "/*": ["./*"] },

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ ˆ๋Œ€ ๋ชจ๋“ˆ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
`"/hey/connection"์—์„œ ws ๊ฐ€์ ธ์˜ค๊ธฐ;

๊ทธ๋Ÿฌ๋‚˜ ".js" ํ™•์žฅ์ž๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ๊ฐ‘์ž๊ธฐ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋” ์ด์ƒ connection.ts ์„ ์–ธ์„ ์ฐพ์ง€ ์•Š๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•ฉ๋‹ˆ๋‹ค.

Could not find a declaration file for module '/hey/connection'. '/home/tobi/Documents/JITcom/Code/Libs/Test_Browser/hey/connection.js' implicitly has an 'any' type.

์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋‘ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ณ ์ณ์ฃผ์„ธ์š”

๋‚˜๋Š” ๋˜ํ•œ ์ด๊ฒƒ์— ๋Œ€ํ•œ ์ˆ˜์ •์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒŒ ์•„์ง๋„ ์ด์Šˆ๊ฐ€ ๋˜๊ณ  ์žˆ๋‹ค๋Š”๊ฒŒ ์›ƒ๊ธฐ๋„ค์š”! :00

๋งˆ์นจ๋‚ด TypeScript๋กœ ์ „ํ™˜ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๊ณ  ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์ฒ˜์Œ ์ง๋ฉดํ•œ ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ Node์˜ ๊ธฐ๋ณธ ๊ตฌํ˜„์—์„œ ๋ชจ๋“ˆ ํ™•์ธ์„ ๊นจ๊ณ  ํ™•์žฅ์ž๊ฐ€ ์—†๋Š” ์ด๋ฆ„์„ ๋ฐ›์•„๋“ค์ด๋Š” ๋ฐ ๋” ์œ ์—ฐํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” esm ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ (์ด์ƒํ•˜๊ฒŒ) ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฒฝ๋กœ์—์„œ .js ํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ .ts ๋˜๋Š” .tsx ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ๋‚ด .ts ํŒŒ์ผ ๋‚ด๋ถ€์— ์žˆ์Šต๋‹ˆ๋‹ค. TypeScript ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด๋ฅผ ์ˆ˜๋ฝํ•˜๋Š” ์ด์œ ๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์ ์–ด๋„ ๋นŒ๋“œ ์ถœ๋ ฅ์—๋Š” .js ํ™•์žฅ์ž๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋”์ฐํ•˜๊ฒŒ ํ•ดํ‚ค ์†”๋ฃจ์…˜.

๋‚˜๋Š” ์š”์ฆ˜ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ typescript๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜์ง€๋„ ์•Š๊ณ  ๋‚ด ์ฝ”๋“œ ํ’ˆ์งˆ์— ๋„ˆ๋ฌด ๋งŽ์€ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๊ณ  ์ผ์„ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ JavaScript๋Š” ์„ ํƒ์ ์ธ ์œ ํ˜•์˜ ์›ํฌ์ธํŠธ๋ฅผ ๊ฐ€์งˆ ๊ฒƒ์ด๊ณ  ์ด ๋ฌธ์ œ๋Š” ๋” ์ด์ƒ ์ค‘์š”ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Jest์™€ Webpack์„ ํ–‰๋ณตํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๊ฐ€์ ธ์˜ค๊ธฐ ๋ผ์ธ์˜ ํ™•์žฅ์„ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค.
์ปดํŒŒ์ผํ•  ๋•Œ tsc --listEmittedFiles ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์ถœ๋ ฅ์„ ํ›„์ฒ˜๋ฆฌ ์Šคํฌ๋ฆฝํŠธ๋กœ ํŒŒ์ดํ”„ํ•ฉ๋‹ˆ๋‹ค. ์ด ์Šคํฌ๋ฆฝํŠธ๋Š” .js ํ™•์žฅ์„ ์ถ”๊ฐ€ํ•˜์—ฌ Node(๋ชจ๋“ˆ ๋ชจ๋“œ์—์„œ)๋ฅผ ๋งŒ์กฑ์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
https://github.com/yoursunny/NDNts/blob/fa6b2eb68a9f32a6a2e24e5475275f803236b8f8/mk/build-post.js

@kj

(์ด์ƒํ•˜๊ฒŒ๋„) ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ .ts ๋˜๋Š” .tsx ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ๋‚ด .ts ํŒŒ์ผ ๋‚ด๋ถ€์˜ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฒฝ๋กœ์—์„œ .js ํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. TypeScript ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด๋ฅผ ์ˆ˜๋ฝํ•˜๋Š” ์ด์œ ๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์ ์–ด๋„ ๋นŒ๋“œ ์ถœ๋ ฅ์—๋Š” .js ํ™•์žฅ์ž๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋”์ฐํ•˜๊ฒŒ ํ•ดํ‚ค ์†”๋ฃจ์…˜.

์ด์ƒํ•˜์ง€ ์•Š๊ณ  ํ™•์‹คํžˆ ํ•ดํ‚น๋˜์ง€ ์•Š์œผ๋ฉฐ ๋ธŒ๋ผ์šฐ์ € ๋ฐ ๋…ธ๋“œ ๊ธฐ๋ณธ ๋ชจ๋“ˆ ํ•ด์ƒ๋„์™€ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์ ธ์˜ค๋Š” ๋ฆฌ์†Œ์Šค๋Š” .js ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ์œ ํ˜•์€ .ts ํŒŒ์ผ ๋˜๋Š” .d.ts ํŒŒ์ผ์— ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .d.ts ํŒŒ์ผ์€ .js ๋ชจ๋“ˆ์˜ ํ˜•์ œ์ผ ํ•„์š”๋„ ์—†์œผ๋ฉฐ .d.ts ํŒŒ์ผ๊ณผ .js ํŒŒ์ผ ์‚ฌ์ด์— 1:1 ๊ด€๊ณ„๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

.js ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ tsc๊ฐ€ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์•ˆ์ •์ ์ด๊ณ  ์•ˆ์ •์ ์ธ ์˜ต์…˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์œ ํ˜•์„ ๊ฐ€์ ธ์˜ค๊ณ  tsc๊ฐ€ ์‹ค์ œ ๋ชจ๋“ˆ ๊ฒฝ๋กœ์— ์œ ํ˜•์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@justinfagnani ์•„, ๋ง์ด ๋˜๋Š” ๊ฒƒ ๊ฐ™์•„์š”. TypeScript๊ฐ€ ์—ฌ๊ธฐ์„œ ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์ด ํ•ดํ‚ค(๋‚˜๋Š” ๊ทธ๋Ÿฐ ์ฃผ์žฅ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์œ„์น˜์— ์žˆ์ง€ ์•Š์Œ)๋ผ๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๋‹จ์ง€ ๋‚ด๊ฐ€ ํ•˜๊ณ  ์žˆ๋Š” ์ผ์ด ์ผ๋ฐ˜์ ์ด์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ œ๊ฐ€ ์ž˜๋ชป ์ƒ๊ฐํ•˜๊ณ  ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™์•„์š”. ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ TypeScript๊ฐ€ ์•„๋‹ˆ๋ผ ๋นŒ๋“œ ์ถœ๋ ฅ์„ ํ‰๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋˜๋Š” ์ œ๊ฐ€ ์˜คํ•ดํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ)? ์ด ๊ฒฝ์šฐ ์™œ ์ด๋Ÿฐ ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์ ธ์˜ค๋Š” ๋ฆฌ์†Œ์Šค๋Š” .js ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋นŒ๋“œ๋œ ๋ชจ๋“ˆ์„ ๋ง์”€ํ•˜์‹œ๋Š” ๊ฑด๊ฐ€์š”? ์†Œ์Šค ๋””๋ ‰ํ† ๋ฆฌ์˜ .js ํŒŒ์ผ์ด ์•„๋‹ˆ๋ผ .ts ๋ชจ๋“ˆ์˜ ๋นŒ๋“œ ๋ฒ„์ „์ž…๋‹ˆ๊นŒ?

๋ชจ๋“ˆ ๊ฒฝ๋กœ์— .ts ๋˜๋Š” .tsx ํ™•์žฅ์ž๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜๋ฉด ์ถœ๋ ฅ์ด .js๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š์„๊นŒ์š”?

@kj ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์˜คํ•ด๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜์ง€ ์•Š๊ณ  .ts ํ™•์žฅ์ž๋ฅผ ์ง€์ •ํ•˜๋ฉด ts ํŒŒ์ผ์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ tsc๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํŒŒ์ผํ•˜๋ฉด ts ํŒŒ์ผ์˜ ๋‚ด์šฉ์ด ํ˜„์žฌ ํ™˜๊ฒฝ(๋…ธ๋“œ ๋˜๋Š” ๋ธŒ๋ผ์šฐ์ €)์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ js ํŒŒ์ผ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.

@mkay581 ์„ ์ดํ•ดํ•˜์ง€๋งŒ foo.ts ํŒŒ์ผ์— ๋‹ค์Œ ์ค„์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

import { Component } from './Component.js';

๋‚ด๊ฐ€ ์–ธ๊ธ‰ํ•˜๋Š” 'Component.js'๋Š” ์‹ค์ œ๋กœ ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ 'Component.tsx'์ž…๋‹ˆ๋‹ค(TypeScript๊ฐ€ ์ด๊ฒƒ์„ ํŒŒ์ผ์˜ ์ตœ์ข… ํŠธ๋žœ์ŠคํŒŒ์ผ ๋ฒ„์ „์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ดํ•ดํ•˜์ง€ ์•Š๋Š” ํ•œ .js ํŒŒ์ผ์€ ์—†์Šต๋‹ˆ๋‹ค?), ์•„์ง TypeScript๋Š” ์ด๊ฒƒ์„ ์ž˜ ๋ฐ›์•„๋“ค์ด๊ณ  ๋™์ผํ•œ ๊ฐ€์ ธ์˜ค๊ธฐ ์ค„์ด ์ถœ๋ ฅ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค(Node ๋˜๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž‘๋™ํ•˜๋Š” .js ํ™•์žฅ๋ช… ์‚ฌ์šฉ).

๊ธฐ์กด TypeScript ๋ฐฉ์‹(AFAIK)์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ™•์žฅ์ž ์—†์ด ๊ฐ€์ ธ์˜ค๊ธฐ ๋ผ์ธ์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

import { Component } from './Component';

ํŠธ๋žœ์ŠคํŒŒ์ผ๋œ .js ํŒŒ์ผ์˜ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ผ์ธ์— './Component'์— .js ํ™•์žฅ์ž๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ถ„๋ช…ํžˆ ์ž˜ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค. t ํ™•์‹คํžˆ ์ฝ์œผ์‹ญ์‹œ์˜ค).

๋ฐ˜๋ฉด์— ์†Œ์Šค ํŒŒ์ผ์˜ ์‹ค์ œ ํŒŒ์ผ ์ด๋ฆ„์œผ๋กœ ์ค„์„ ์ง€์ •ํ•˜๋ฉด:

import { Component } from './Component.tsx';

๊ทธ๋Ÿฌ๋ฉด TypeScript๋Š” ๊ฒฝ๋กœ๋ฅผ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๊ณ  ํŒŒ์ผ ํ™•์žฅ์ž ์—†์ด ๊ฐ€์ ธ์˜ค๊ธฐ ํ–‰์„ ์‹œ๋„ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค(๊ธฐ์–ตํ•˜๋ฉด ์ง€๊ธˆ์€ ์ปดํ“จํ„ฐ์— ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค).

๋”ฐ๋ผ์„œ ์ฒซ ๋ฒˆ์งธ ์˜ˆ์ œ๋Š” TypeScript๋ฅผ ์ž‘์„ฑ ์ค‘์ผ ๋•Œ .ts ๋˜๋Š” .tsx ํ™•์žฅ์ž๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜์ง€๋งŒ ํ™•์žฅ์ž๊ฐ€ ์—†๋Š” ๊ฒฝ๋กœ๋งŒ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค(์ด๋Š” ES ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์˜ ๋‹ค๋ฅธ ๊ตฌํ˜„๊ณผ ์ƒ์ดํ•จ) ๋˜๋Š” ๊ทธ๋Ÿฌํ•œ ์†Œ์Šค ํŒŒ์ผ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ถœ๋ ฅ ํŒŒ์ผ๋งŒ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” .js ํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

@justinfagnani

๊ฐ€์ ธ์˜ค๋Š” ๋ฆฌ์†Œ์Šค๋Š” .js ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” tsc๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋ชจ๋ฅด์ง€๋งŒ ๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์˜ณ๊ฒŒ ๋“ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์•„์ง .js ํŒŒ์ผ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ผ์ž…๋‹ˆ๋‹ค.

TS๋Š” JS ์œ„์—์„œ ์ถ”์ƒํ™” ๊ณ„์ธต ์—ญํ• ์„ ํ•˜๋ฉฐ .js ํŒŒ์ผ์€ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์˜ ์ถœ๋ ฅ์ž…๋‹ˆ๋‹ค. ๊ทธ ํŠน์ • ํ™•์žฅ์œผ๋กœ ๊ฑฐ๊ธฐ์— ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ฏฟ์œผ๋ฉด IMO๋ผ๋Š” ์ถ”์ƒํ™”๋ฅผ ๊นจ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋งํ•ด, C ๋˜๋Š” C++๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ #include .o ํŒŒ์ผ์„ ์ฝ”๋“œ์— ํฌํ•จํ•˜์ง€ ์•Š๊ณ  .h ๋˜๋Š” ์ตœ๋Œ€ .c ๋˜๋Š” .cpp .

๋‚˜๋Š” Typescript์—์„œ ์ด ๋™์ž‘์— ๋Œ€ํ•œ ํ•ฉ๋ฆฌ์ ์ธ ์„ค๋ช…์„ ๊ธฐ๊บผ์ด ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ์ง€ ์•Š๋Š” ํ•œ ์ด๊ฒƒ์€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@kj

์ด์ƒํ•˜์ง€ ์•Š๊ณ  ํ™•์‹คํžˆ ํ•ดํ‚น๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ๊ทธ๊ฒƒ์€ ์ด์ƒํ•˜๊ณ  ํ•ดํ‚ค์˜ ๋ฐ”๋กœ ๊ทธ ์ •์˜์ž…๋‹ˆ๋‹ค. ๐Ÿ˜› ์—ฌ๊ธฐ์„œ ํ•˜๋Š” ์ž‘์—…์€ ๊ฐ€์ƒ ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์กด์žฌ๊ฐ€ ๋ณด์žฅ๋˜์ง€ ์•Š๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. (์˜ˆ: ์ฝ”๋“œ ๋ฒˆ๋“ค๋ง, AssemblyScript ๋˜๋Š” deno ์‚ฌ์šฉ) ์ถœ๋ ฅ ํ˜•์‹์„ ๊ฐ€์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ถˆ๊ฐ€์ง€๋ก ์ ์ธ ์ฝ”๋“œ(์˜ˆ: ํƒ€์‚ฌ ๋ชจ๋“ˆ)๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ด๋Š” ๊ฐ€์ •ํ•  _์œ„ํ—˜ํ•œ_ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@borfast @frzi ๋„ค, ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ฐ€ ๋Š๊ผˆ๋˜ ์ ์ž…๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์— ๋ถˆํŽธํ•จ์„ ๋Š๋ผ๋Š” ์‚ฌ๋žŒ์ด ์ €๋ฟ๋งŒ์ด ์•„๋‹ˆ๋ผ๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. TypeScript๊ฐ€ ๋„ˆ๋ฌด ์ƒˆ๋กญ๋‹ค๋Š” ๊ฐ€์ •์„ ๋„ˆ๋ฌด ๋งŽ์ด ํ•˜์ง€ ์•Š์œผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค!

@frzi

์—ฌ๊ธฐ์„œ ํ•˜๋Š” ์ผ์€ ๊ฐ€์ƒ ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์กด์žฌ๊ฐ€ ๋ณด์žฅ๋˜์ง€ ์•Š๋Š” ํŒŒ์ผ

๊ฐ€์ƒ์ด ์•„๋‹ˆ๋ผ tsc๊ฐ€ ์ƒ์„ฑํ•  ๊ฒƒ์ž„์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. tsc๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์„ ๋ณด๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ .ts ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋ฉด ์ปดํŒŒ์ผ ํ›„์— ์กด์žฌํ•˜์ง€ ์•Š์„ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฝ”๋“œ๋ฅผ ๋ฌถ์„ ๋•Œ

๋ฒˆ๋“ค๋Ÿฌ๋Š” tsc ์ดํ›„์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

@kj ๋Š” .tsx ํŒŒ์ผ์„ ์–ธ๊ธ‰ํ–ˆ๊ณ , ๊ทธ๊ฒƒ๋“ค์€ ๋‚ด ์š”์ ์„ ๋”์šฑ ๊ฐ•์กฐํ•ฉ๋‹ˆ๋‹ค. .tsx๋Š” ํ•ด๋‹น ๋ชจ๋“ˆ์˜ ์ปดํŒŒ์ผ๋Ÿฌ(_locally_)์— ๋ชจ๋“ˆ์— JSX๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋Š” ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด์„œ๋งŒ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๋Š” ์‚ฌ๋žŒ์€ ํŒŒ์ผ์— JSX๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ์ปดํŒŒ์ผ ํ›„์— ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ์€ .tsx, .ts ๋ฐ .js/.d.ts ์Œ ๊ฐ„์— ์›ํ™œํ•˜๊ฒŒ ์ด์‹๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

.ts ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜จ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

import {Component} from './component.ts';

๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ตฌ์„ฑ ์š”์†Œ์— JSX๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฏ€๋กœ ์ด๋ฆ„์„ component.tsx๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ์‹คํŒจํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? .ts์—์„œ .js/.d.ts๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ๋‹ค์‹œ ์‹คํŒจํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@borfast

TS๋Š” JS ์œ„์—์„œ ์ถ”์ƒํ™” ๊ณ„์ธต ์—ญํ• ์„ ํ•˜๋ฉฐ .js ํŒŒ์ผ์€ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์˜ ์ถœ๋ ฅ์ž…๋‹ˆ๋‹ค. ๊ทธ ํŠน์ • ํ™•์žฅ์œผ๋กœ ๊ฑฐ๊ธฐ์— ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ฏฟ์œผ๋ฉด IMO๋ผ๋Š” ์ถ”์ƒํ™”๋ฅผ ๊นจ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ถ”์ƒํ™”๋Š” ์—ฌ๊ธฐ์—์„œ ์•”์‹œํ•˜๋Š” ๊ฒƒ๋งŒํผ ์™„์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. TS ํ”„๋กœ์ ํŠธ ๋‚ด๋ถ€ ๋˜๋Š” ์™ธ๋ถ€์—์„œ .js ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  ์œ„์น˜์— ์žˆ๋Š” .d.ts ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ .js ํŒŒ์ผ์— ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .js ํŒŒ์ผ์€ ์ปดํŒŒ์ผ ํ›„ ์‹ค์ œ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์€ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋„์šธ ๋ฟ์ž…๋‹ˆ๋‹ค.

@justinfagnani ๋‚˜๋Š” ๋‹น์‹ ์ด ๋งํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์•ฝ๊ฐ„ ์žƒ์–ด ๊ฐ€๊ณ  ์žˆ์ง€๋งŒ ์™œ TypeScript๋Š” .ts ๋˜๋Š” .tsx๊ฐ€ ์žˆ๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฒฝ๋กœ๋ฅผ ์ œ๊ณตํ•˜๋ฉด ํ•ด๋‹น ๋ชจ๋“ˆ์— ๋Œ€ํ•œ .js ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ๋”ฐ๋ผ์„œ ์ถœ๋ ฅ์—์„œ โ€‹โ€‹ํ›„์ž์˜ ํ™•์žฅ์„ ๋Œ€์ฒดํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@justinfagnani

๊ฐ€์ƒ์ด ์•„๋‹ˆ๋ผ tsc _์•Œ๊ณ _ ์ƒ์„ฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. tsc๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์—๋Š” ๋‹น์‹ ์ด ์ธ์ •ํ•˜์ง€ ์•Š๋Š” ๋Œ€์นญ์ด ํ•จ์ถ•๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ท€ํ•˜๊ฐ€ ์–ธ๊ธ‰ํ•œ ์ด "๋ณด์ฆ"์€ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๋งํ–ˆ๋“ฏ์ด "tsc _knows_ ๊ทธ๊ฒƒ์€ [js ํŒŒ์ผ]์„ ์ƒ์„ฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค."๋ผ๊ณ  ๋ฌป๋Š”๋‹ค๋ฉด ๋˜‘๊ฐ™์ด ์œ ํšจํ•œ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋œ js์—์„œ ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?โ€

"tsc๊ฐ€ js ํŒŒ์ผ์„ ๋ณด์žฅํ•œ๋‹ค"๋Š” ์‚ฌ์‹ค์„ ํ•ด์„ํ•˜๋Š” ๊ฒƒ์€ ์–‘๋ฐฉํ–ฅ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚˜๋Š” @justinfagnani , ๋‹น์‹ ์˜ ํ•ด์„์ด ํŠน์ • ๊ด€์ ์—์„œ _is_ ์œ ํšจํ•˜๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐ˜๋Œ€ ํ•ด์„์€ "๊ทธ๋Ÿฌ๋ฏ€๋กœ tsc๋Š” _์ž์‹ ์˜ ์ง€์‹์— ๋”ฐ๋ผ ํ–‰๋™ํ•˜๊ณ _ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•ด ์ด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค."์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฒ˜์Œ๋ถ€ํ„ฐ ์ด ์ „์ฒด ํ† ๋ก ์— ๋Œ€ํ•ด ๋‚˜๋ฅผ ๊ดด๋กญํžˆ๋Š” ๊ฒƒ์€ ์ด ํ•ด์„์ด ๊ฑฐ์˜ ์กฐ๋กฑ์„ ๋ฐ›์„ ์ •๋„๋กœ _๋ถ€์ •์ ์œผ๋กœ_ ๋ฐ›์•„๋“ค์—ฌ์ง€๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ง๋„ ์•ˆ๋ผ

๊ฒฐ๊ตญ ์ด ๋…ผ์Ÿ์€ _๋…ผ๋ฆฌ์ ์ธ ๊ฒฐ์ •์ด ์•„๋‹ˆ๋ผ ๋ฏธํ•™์  ๊ฒฐ์ •์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚ด ํฌ๋ง์€ ๋ฏธํ•™์  _์˜๊ฒฌ_(๋…ผ๋ฆฌ์  ์ถ”๋ก ์ด ์•„๋‹˜)์— ๊ณ ์œ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ถ€์ ์ ˆํ•˜๊ณ  ์ˆ˜์šฉ์ ์ธ ๋ชฉ์†Œ๋ฆฌ๊ฐ€ ๋ฐ˜๋Œ€์ž๋“ค์— ์˜ํ•ด ์ด ๋ฌธ์ œ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์š”์ปจ๋Œ€, OP์˜ ์งˆ๋ฌธ์ด ์™„๋ฒฝํ•˜๊ฒŒ ์œ ํšจํ•œ ํ•ด์„์ž„์„ ์ธ์ •ํ•˜์‹ญ์‹œ์˜ค. ์•„๋งˆ๋„ ๊ท€ํ•˜์˜ ํ•ด์„๊ณผ ํ•จ๊ป˜์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฑฐ์นœ ๋…ผ์Ÿ์ด โ€‹โ€‹ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

@justinfagnani

๊ทธ๊ฒƒ์„ ๋ณด๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ .ts ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋ฉด ์ปดํŒŒ์ผ ํ›„์— ์กด์žฌํ•˜์ง€ ์•Š์„ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฌผ๋ก  .h ํŒŒ์ผ์ด C ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ํŒŒ์ผ๊ณผ ํ•จ๊ป˜ ๋ฐฐํฌ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์š”์ ์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์ปดํŒŒ์ผ๋œ ํŒŒ์ผ์ด ์•„๋‹Œ ์†Œ์Šค ํŒŒ์ผ์„ ํฌํ•จํ•˜๋„๋ก ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค.

์ข‹์•„, ์ด ๋Œ€ํ™”์— ์ŠคํŒธ์ด ๋„ˆ๋ฌด ๋งŽ์•„ ๋” ์ด์ƒ ๋ฌด์‹œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
import ๋ฌธ์€ typescript์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ๋ผ ๊ทธ๊ฒƒ์„ ์‹คํ–‰ํ•œ JavaScript ํ™˜๊ฒฝ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค. ์ž, ์—ฌ๊ธฐ์„œ ํ‚ค์›Œ๋“œ๋Š” JavaScript ํ™˜๊ฒฝ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ฒฝ๋กœ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„์— .ts ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๊ณ  ์‹คํ–‰ํ•˜๋Š” ๋‹จ์ผ ์•ฑ ์„ ๋ณด์—ฌ์ฃผ์„ธ์š”.
TypeScript๋Š” ์†Œ์Šค ํŒŒ์ผ ๋‚ด๋ถ€์— ๊ธฐ๋ณธ JavaScript๋ฅผ ํ—ˆ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— .js ํ™•์žฅ์ž๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. node.js์˜ ๋ธŒ๋ผ์šฐ์ € ์ค‘ ์–ด๋Š ์ชฝ๋„ .ts ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ts-node ๋ผ๋„ .ts ํŒŒ์ผ์„ ์ฆ‰์„์—์„œ ๋ณ€ํ™˜ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ํ•˜๋“œ ๋“œ๋ผ์ด๋ธŒ์— ๊ธฐ๋กํ•˜๋Š” ๋Œ€์‹  ๋ฉ”๋ชจ๋ฆฌ์— ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค(ํ•ดํ‚ค๊ฐ€ ์ „ํ˜€ ์•„๋‹™๋‹ˆ๋‹ค. ?).

์ด์ œ ์ ์ ˆํ•œ tsc ์ˆ˜์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • .ts ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ ์ฐธ์กฐ
  • tsc๋Š” .ts ํŒŒ์ผ์„ .js ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฐ ๋‹ค์Œ tsc๋Š” .ts .js #$ ํŒŒ์ผ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค(๋ณ€ํ™˜ ๋ฐฉ๋ฒ•์„ ์ •ํ™•ํžˆ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Œ).

๋ฌธ์ œ: "modern web dev"๋Š” ์‹ค์ œ ์›น ๊ฐœ๋ฐœ์ด ์•„๋‹ˆ๋ฉฐ node.js ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ํ™•์žฅ์ž(๋ฐ ์ „์ฒด ํŒŒ์ผ ๊ฒฝ๋กœ)๋ฅผ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค. tsc ์ด์ œ ๋” ์ด์ƒ ์ถœ๋ ฅ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค my-awesome-module/test ๊ฐ€์ ธ์˜ค๊ธฐ๋Š” node-modules/my-awesome-module ํŒŒ์ผ test.js node-modules/my-awesome-module ์—์„œ ์‹œ์ž‘ํ•˜์—ฌ index.js ํŒŒ์ผ๊นŒ์ง€ ๋ฌด์—‡์ด๋“  ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. $ node-modules/my-awesome-module ์˜ test ํด๋” ๋‚ด๋ถ€, ./local-mocks/my-awesome-module/mock.json ์™€ ๊ฐ™์€ ๋น„ js ํŒŒ์ผ๋กœ ์ผ๋ถ€ ๋กœ์ปฌ ์žฌ์ž‘์„ฑ์œผ๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. tsc๋Š” ํŠน์ • ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ํŽ‘ํ‚คํ•œ webpack/rollup/super-awesome-new-and-shiny-bundler ๊ตฌ์„ฑ์ด ๋ฌด์—‡์ธ์ง€ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‹ค์‹œ: ์ €๋Š” tsc๊ฐ€ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฒฝ๋กœ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ์ฐฌ์„ฑํ•˜์ง€๋งŒ ๋‹จ์ˆœํ•œ ํ”„๋กœ์ ํŠธ์—์„œ๋งŒ ์ž‘๋™ํ•˜๊ณ  ๋‹จ์ˆœํ•œ ํ”„๋กœ์ ํŠธ์—์„œ๋งŒ ์ž‘๋™ํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ(์š”์ฆ˜์—๋Š” ๋‹จ์ˆœํ•œ ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ํŽ˜์ด์ง€์—์„œ๋„ ๊ณผ๋„ํ•˜๊ฒŒ ์—”์ง€๋‹ˆ์–ด๋ง๋œ ์›นํŒฉ ๊ตฌ์„ฑ๊ณผ ๋ฐ˜์‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์†Œ์ˆ˜์ž…๋‹ˆ๋‹ค)์€ ๊ฐ€์น˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ์ž‘์„ฑ๋œ ์Šคํฌ๋ฆฝํŠธ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์‹œ๊ฐ„์„ ๋ณด๋‚ด์‹ญ์‹œ์˜ค.

๋‹ค์‹œ: ์ €๋Š” tsc๊ฐ€ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฒฝ๋กœ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ์ฐฌ์„ฑํ•˜์ง€๋งŒ ๋‹จ์ˆœํ•œ ํ”„๋กœ์ ํŠธ์—์„œ๋งŒ ์ž‘๋™ํ•˜๊ณ  ๋‹จ์ˆœํ•œ ํ”„๋กœ์ ํŠธ์—์„œ๋งŒ ์ž‘๋™ํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ(์š”์ฆ˜์—๋Š” ๋‹จ์ˆœํ•œ ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ํŽ˜์ด์ง€์—์„œ๋„ ๊ณผ๋„ํ•˜๊ฒŒ ์—”์ง€๋‹ˆ์–ด๋ง๋œ ์›นํŒฉ ๊ตฌ์„ฑ๊ณผ ๋ฐ˜์‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์†Œ์ˆ˜์ž…๋‹ˆ๋‹ค)์€ ๊ฐ€์น˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ์ž‘์„ฑ๋œ ์Šคํฌ๋ฆฝํŠธ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์‹œ๊ฐ„์„ ๋ณด๋‚ด์‹ญ์‹œ์˜ค.

webpack์ด ์—†๋Š” ๊ฐ„๋‹จํ•œ ํ”„๋กœ์ ํŠธ์—์„œ tsc๋งŒ ์žˆ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ์˜๊ฒฌ์„ ์ฝ๊ณ  ์žˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์—์„œ typescript ์‚ฌ์šฉ์— ๋Œ€ํ•œ ๊ธฐ๋Œ€์น˜์— ๋Œ€ํ•œ ๊ทผ๋ณธ์ ์ธ ๋ถˆ์ผ์น˜์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

.ts ์†Œ์Šค ํŒŒ์ผ์ด .js ํŒŒ์ผ์„ ์ฐธ์กฐํ•  ๋•Œ ๋ฌธ์ œ๋Š” ์ด๋ฏธ ์‹œ์ž‘๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Typescript๋Š” .js ํŒŒ์ผ์ด ์•„๋‹Œ ์†Œ์Šค .ts ํŒŒ์ผ์„ ~run~ ์ปดํŒŒ์ผํ•˜๋„๋ก ๋นŒ๋“œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ํ”„๋กœ์ ํŠธ์—์„œ TypeScript๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด _entire_ ํ”„๋กœ์ ํŠธ๋ฅผ typescript๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•˜๋ฉฐ ๋ถ„๋ฆฌ๋œ .js ํŒŒ์ผ์„ ๋‚จ๊ฒจ๋‘๊ณ  ์ฐธ์กฐํ•˜๋ ค๊ณ  ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  js ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ Typescript ๊ตฌ๋ฌธ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์‹œ๊ฐ„์ด ์—†๋Š” ๊ฒฝ์šฐ js ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ts ํŒŒ์ผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค(๋˜๋Š” TS์˜ ๊ฒฝ๋กœ ๋งคํ•‘์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ .js ํŒŒ์ผ๋กœ ๋งคํ•‘). ๋ฌธ์ œ ํ•ด๊ฒฐ๋จ. :man_shrugging:

ํŽธ์ง‘: "์‹คํ–‰"์„ "์ปดํŒŒ์ผ"๋กœ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ œ๊ฐ€ ์˜๋ฏธํ•œ ๊ฒƒ์ด์ง€๋งŒ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๊ฒŒ ํ•ด์„๋˜์—ˆ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@mkay581 TypeScript๋Š” JS ํŒŒ์ผ์„ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ฌด ๊ฒƒ๋„ ์‹คํ–‰ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

@valeriob Simple ํ”„๋กœ์ ํŠธ์—๋Š” ๋ฒˆ๋“คํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ํŒŒ์ผ์ด ๊ฑฐ์˜ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์š”์ฆ˜ ๋ธŒ๋ผ์šฐ์ €์—๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ ๊ธฐ๋Šฅ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฅผ ์šฐํšŒํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ธŒ๋ผ์šฐ์ €์—์„œ ํƒ์ƒ‰ ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹  ๋Œ€๊ธฐํ•œ ๋‹ค์Œ ๊ฐ ์ด๋ฒคํŠธ๋ฅผ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ๋กœ์— ๋งคํ•‘ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๊ฒฝ๋กœ ๋Š” fetch ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ณ  ๋ฐ˜ํ™˜๋˜๋ฉด ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์€ ํ…œํ”Œ๋ฆฟ ์—”์ง„์œผ๋กœ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. html, HyperHTML ๋˜๋Š” Mustache, Handlebars, Pug ๋“ฑ๊ณผ ๊ฐ™์€ ์˜ค๋ž˜๋œ ๊ฒƒ). ์™„๋ฃŒ, ๋ฉ‹์ง„ ์›นํŒฉ, ํ”„๋ ˆ์ž„์›Œํฌ ๋˜๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค. ๋ฆฌ์Šค๋„ˆ, regexp, fetch, promise ๋ฐ ๊ฐ„๋‹จํ•œ js ํ…œํ”Œ๋ฆฟ ์—”์ง„๋งŒ ์žˆ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

@Draccoz ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ด ๊ฐ„๋‹จํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ž‘๋™์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ฃผ์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? https://github.com/valeriob/Typescript_Non_SPA
JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: rxjs)๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฐ„๋‹จํ•œ .ts ํŒŒ์ผ์ด๋ฉฐ html ํŽ˜์ด์ง€์—์„œ ๋ชจ๋“ˆ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@valeriob ์ด๊ฒƒ์€ ๊ทธ๋ ‡๊ฒŒ ์‚ฌ์†Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ES ๋ชจ๋“ˆ๊ณผ ํ˜ธํ™˜๋œ๋‹ค๊ณ  ์„ ์–ธํ•˜๋”๋ผ๋„ ๋ธŒ๋ผ์šฐ์ € ์„ธ๊ณ„์—๋Š” ์—†์Šต๋‹ˆ๋‹ค.
RxJS๋Š” ๊ธฐ๋ณธ ํ๋ฆ„์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ๋•Œ ๋‚ด๊ฐ€ ๊ฐ€์žฅ ๊ด€์‹ฌ์ด ๋งŽ์•˜๋˜ ๊ฒƒ์ด์ง€๋งŒ ๊ทธ๋“ค์€ ์Šค์Šค๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๊ธฐ ์ „์— ์ด ํ‹ฐ์ผ“์ด ํ•ด๊ฒฐ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค(์žฌ๋ฏธ...).
๋‚ด๊ฐ€ ์„ค๊ณ„ํ•˜๊ณ  ์žˆ๋˜ ์•„ํ‚คํ…์ฒ˜์—์„œ ์ฒ˜์Œ์—๋Š” ๋ชจ๋“  ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ฐ sed๋ฅผ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ๊ฒฝ๋กœ ์žฌ์ž‘์„ฑ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๋งˆ์Œ์„ ๋ฐ”๊ฟจ์Šต๋‹ˆ๋‹ค. ๋‚ด ๊ฐœ๋…์€ rxjs, typescript ๋ฐ lit-html(4๊ฐœ์˜ ํด๋” ๋ฐ ULTRA ๋น ๋ฅธ CI ํ…Œ์ŠคํŠธ/๋นŒ๋“œ๊ฐ€ ์žˆ๋Š” node_modules)์„ ์ œ์™ธํ•˜๊ณ  ๋‚ด ์•ฑ์— ์™ธ๋ถ€ ์ข…์†์„ฑ์ด ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. TS๊ฐ€ ๊ฒฝ๋กœ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋ฉด ์–ด์จŒ๋“  ์•ฝ 90์ค„์˜ ์ฝ”๋“œ์ด์ง€๋งŒ ๋‚ด ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜คํ”ˆ ์†Œ์Šค์ž…๋‹ˆ๋‹ค. ๋งํฌ๋ฅผ ์›ํ•˜๋Š” ์‚ฌ๋žŒ์ด ์žˆ์œผ๋ฉด ๋‚ด ํ”„๋กœํ•„์— ์žˆ๋Š” ์กฐ์ง์— ๋ฌธ์˜ํ•˜๊ฑฐ๋‚˜ ํ™•์ธํ•˜์„ธ์š”.

๊ฐ„๋‹จํ•œ ํŽ˜์ด์ง€์— ๊ด€ํ•ด์„œ๋Š” url ๋ˆ„๋ฅด๊ธฐ -> ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ -> ํ‘œ์‹œํ•˜๊ธฐ -> ๋ฐ˜๋ณต๊ณผ ๊ฐ™์ด ์‹ค์ œ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ–ˆ์Šต๋‹ˆ๋‹ค.

Js์—๋Š” ๊ธฐ๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— Js์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์€ ์ˆœ์ˆ˜ํ•œ ํ™˜์ƒ์ž…๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ๋‚ด๊ฐ€ ์—ฐ๊ฒฐํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์ด๋ฉฐ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์‹ค์ œ ์ด์ ๋„ ์—†์ด ์ผ์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ , ์˜ต์…˜์„ ๋งค์šฐ ์ œํ•œํ•˜๊ณ , ๊ฐœ๋ฐœ์ž๊ฐ€ ์•ฑ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋„๊ตฌ์™€ ์‹ธ์šฐ๊ฒŒ ๋งŒ๋“ค๊ณ , ๊ฐœ๋ฐœ์ž๋ฅผ ๋Š๋ฆฌ๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฏธ์นœ ์›นํŒฉ/์ปดํŒŒ์ผ ์„ธ๊ณ„์— ๋›ฐ์–ด๋“ค๊ณ  ์‹ถ์ง€ ์•Š์€ ppl์˜ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค์ž…๋‹ˆ๋‹ค. ๊ณ ๋ฆฌ.

๋งŽ์€ ์ •์‹  ์ฒด์กฐ์—์„œ ์ด ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ•˜๋ฉฐ ๋งŽ์€ ๊ฐœ๋ฐœ์ž์˜ ์ƒ์‚ฐ์„ฑ์— ์ค‘์š”ํ•œ ๋ฌธ์ œ์ž„์„ ๋ถ€์ธํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด _๋ฌธ์ œ๊ฐ€ ๋˜์–ด์„œ๋Š” ์•ˆ ๋จ_์„ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์€ _๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ_ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์†Œํ”„ํŠธ์›จ์–ด๋Š” ์‚ฌ์šฉ์ž์˜ ์ •์‹  ๋ชจ๋ธ์„ ๋”ฐ๋ผ์•ผ ํ•˜๋ฉฐ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ž์ฒด ๊ตฌํ˜„ ๋ชจ๋ธ์„ ๊ฐ•์š”ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. (UX ๊ด€๋ จ)

์‚ฌ์šฉ์ž๊ฐ€ @borfast ์— ๋”ฐ๋ผ tsc๋ฅผ C์™€ ๊ฐ™์€ ์ปดํŒŒ์ผ๋Ÿฌ๋กœ ๊ฐœ๋…ํ™”ํ•˜๋Š” ๊ฒฝ์šฐ tsc์˜ ๊ตฌํ˜„ ์„ธ๋ถ€ ์ •๋ณด๊ฐ€ ๋ฌด์—‡์ด๋“  ๊ฐ„์— ์ˆ˜์šฉํ•ด์•ผ ํ•˜๋Š” ํŠน๊ถŒ ์ •์‹  ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค.

OP์˜ ์งˆ๋ฌธ์—๋Š” ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ๋‹ค๋ฅธ ๋ชจ๋“  ๋ฌธ์ œ๋ณด๋‹ค ๋งŽ์€ 200๊ฐœ ์ด์ƒ์˜ ์—„์ง€์†๊ฐ€๋ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ ํˆฌํ‘œ๋ฅผ ๋ฐ›์„ ์ž๊ฒฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค๋ฌธ ์กฐ์‚ฌ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž๊ฐ€ tsc๊ฐ€ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๋‹ค์‹œ ์“ฐ๊ธฐ๋ฅผ ์›ํ•˜๋ฉด ๊ทธ๊ฒƒ์ด ์ •๋‹ต์ž…๋‹ˆ๋‹ค. ์ ์–ด๋„ ๊ทธ๊ฒƒ์ด ์‚ฌ๋ฌผ์„ ๋ณด๋Š” UX ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๊ทธ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. typescript๊ฐ€ ์–ธ์–ด๋กœ์„œ JavaScript์˜ ์ƒ์œ„ ์ง‘ํ•ฉ์ธ ๊ฒฝ์šฐ tsc์˜ ์ถœ๋ ฅ(๋‹จ์ผ ์ถœ๋ ฅ ํŒŒ์ผ ์Šค์œ„์น˜๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ์—๋„)์€ JavaScript ์ž์ฒด์—์„œ ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@weoreference ์—ฌ๋Ÿฌ ํ™˜๊ฒฝ(node.js, ๋ธŒ๋ผ์šฐ์ €), ์—ฌ๋Ÿฌ ๋ฒˆ๋“ค๋Ÿฌ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ์„ฑ(ํ˜„์žฌ, ๊ณ„ํš ๋ฐ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋ฏธ๋ž˜ ๊ธฐ๋Šฅ ์กฐ์‚ฌ webpack, ๋กค์—… ๋ฐ ์†Œํฌ ๋ฐ ๊ธฐํƒ€ ๋ฒˆ๋“ค๋Ÿฌ) ๊ทธ๋ ‡๋‹ค๋ฉด TypeScript ํŒ€์ด ๊ท€ํ•˜์˜ ํŽธ์— ๊ฐ€๋“ ์ฐฐ ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ํ•  ์˜ํ–ฅ์ด ์—†๊ฑฐ๋‚˜ ๋„ˆ๋ฌด ์–ด๋ ต๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด ์•„๋ฌด๋„ ์‹ค์ œ๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์—†๋Š” ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค๋„๋ก ์š”์ฒญํ•˜์ง€ ๋งˆ์„ธ์š”. "๋‚˜๋Š” ์–ด๋–ป๊ฒŒ ํ•˜๋“  ์ƒ๊ด€์—†์ง€๋งŒ ์ด ์†Œ๋ฅผ ๋‚ ๊ฒŒ ํ•˜์„ธ์š”"์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค...

@Draccoz , ๋‹น์‹ ์€ 10Km/h๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ์šด์ „ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฐจ๊ฐ€ ๊ธฐ์–ด๋ฅผ ๋ณ€์†ํ•˜๊ธฐ๋ฅผ ์›ํ•˜์ง€๋งŒ, ๋””์ž์ธ์€ ๊ณ ์‚ฌํ•˜๊ณ  ๊ธฐ์–ด ํŠธ๋ ˆ์ธ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋ฐฐ์šฐ๋„๋ก ์ œ์กฐ์—…์ฒด์—์„œ ์š”์ฒญํ•œ ์ ์ด ์—†๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

๋ฒˆ๋“ค๋Ÿฌ ๋ฐ ๊ธฐํƒ€ ๋ฌธ์ œ์— ๊ด€ํ•ด์„œ๋Š” ์ด๊ฒƒ์ด ์™œ ์ฐจ๋‹จ ์žฅ์น˜์ž…๋‹ˆ๊นŒ?

๋ด, ๋‚œ ๊ทธ๋ƒฅ ES ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๊ณ  ๋ชจ๋“  Babel๊ณผ Webpack์˜ ๋ฏธ์นœ ์ง“์„ ๋‹ค๋ฃจ๊ณ  ์‹ถ์ง€๋Š” ์•Š์•„. ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ .js๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ์„ ํƒ์  ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์ด ๋  ์ˆ˜ ์—†๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด ๋™์ž‘์ด ์‚ฌ์šฉ์ž๊ฐ€ ์„ค์ •ํ•œ ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์˜ต์…˜๊ณผ ์ถฉ๋Œํ•˜๋Š” ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ๋น„ํ™œ์„ฑํ™”๋˜๊ฑฐ๋‚˜ ๊ฒฝ๊ณ /์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋˜๊ณ  tsc๊ฐ€ ์‹คํ–‰๋  ๋•Œ ์ปดํŒŒ์ผ์ด ์ค‘์ง€๋˜์–ด ์‚ฌ์šฉ์ž๊ฐ€ ๊ตฌ์„ฑ์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•จ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒŒ ์™œ ๋ถˆ๊ฐ€๋Šฅํ•œ์ง€ ์ •๋ง ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

@Draccoz ์•ˆ๋…•ํ•˜์„ธ์š” :) ๊ธ€์Ž„, ๋‚ด๊ฐ€ ๋ณด๊ธฐ์— ๋‹น์‹ ์€ ๋‘ ๊ฐ€์ง€๋ฅผ ๋ฌป๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

  2. ๊ฐœ๋ฐœ์ž์ธ ๋‚ด๊ฐ€ tsc์— ํŠน์ • ํ™˜๊ฒฝ์— ๋Œ€ํ•ด ํŠน์ • ๋ฐฉ์‹์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ๋‹ค๋Š” ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•

์—ฌ๊ธฐ ๋‚ด ์ƒ๊ฐ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. @borfast ์˜ ํšŒ์‹ ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. "๊ณ ์ฐจ" ๋‹ต๋ณ€์ด์ง€๋งŒ ๊ฐ„๊ฒฐํ•ฉ๋‹ˆ๋‹ค. :)

  2. "renameImports":true์™€ ๊ฐ™์€ ํ”Œ๋ž˜๊ทธ๋ฅผ tsc/tsconfig์— ์ „๋‹ฌํ•  ์ˆ˜๋„ ์žˆ๊ณ  tsc์—์„œ ์„ ํƒํ•˜๋Š” ๋‹ค๋ฅธ ์‹ ํ˜ธ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ์ •๋ฐ€๋„๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ”Œ๋ž˜๊ทธ๋Š” ๋ถ€์šธ์ด ์•„๋‹ˆ๋ผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ž์—ด์„ ์ทจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

standardImportExtension: 'js'

๋”ฐ๋ผ์„œ ํŒŒ์ผ ํ™•์žฅ์ž๊ฐ€ ์—†๋Š” ๋ชจ๋“  ๊ฐ€์ ธ์˜ค๊ธฐ์˜ ๊ธฐ๋ณธ๊ฐ’์€ .js์ž…๋‹ˆ๋‹ค.

๊ฒฐ๋ก :
์ด ๊ธฐ๋Šฅ์€ Q2(๊ฐ€์ ธ์˜ค๊ธฐ ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ ์ฒด๊ณ„)๊ฐ€ Q1(์ฆ‰, tsc)์— ์˜ํ•ด ๋ฏธ๋ฆฌ ์•Œ๋ ค์งˆ ํ•„์š”๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„ํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ๋กœ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์ธ๊ฐ„ ๊ฐœ๋ฐœ์ž์ธ ๋‚˜๋Š” webpack/browsers/ ๋“ฑ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์•Œ ํ•„์š” ์—†์ด ์ด "์„ธ๊ณ„ ์ง€์‹"์„ tsc์— ์‰ฝ๊ฒŒ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ๊ฒƒ์ด ๊ฐ„๋‹จํ•œ ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค.

@borfast ์ „์†ก์€ ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ œ์กฐ์—…์ฒด์—์„œ ์ž๋™์ฐจ์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜์—ˆ์œผ๋ฉฐ ์‚ฌ์šฉ์ž๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์— ๋™์˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ ์ ˆํ•œ ์ฃผ์žฅ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์ž๋™์ฐจ ์ œ์กฐ์—…์ฒด ์˜ˆ์™€ ๋น„๊ตํ•  ๋•Œ "๋‚ด ์ฐจ๊ฐ€ 100,000๋งˆ์ผ ๋ฒ”์œ„์™€ ์ œํŠธ๊ธฐ์˜ ์†๋„์— ๋„๋‹ฌํ•˜๋Š” ์ตœ๊ณ  ์†๋„์˜ ์™„์ „ ์ „๊ธฐ ์ž๋™์ฐจ๊ฐ€ ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋‹ฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ณ  ๊ทธ๊ฒƒ์„ ์›ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ๋‹ค์•ผ - ๊ธฐ๊ฐ„.
@weoreference ๋‚ด ์งˆ๋ฌธ์— ์•ฝ๊ฐ„์˜ ์˜คํ•ด. ๋‚˜๋Š” tsc๊ฐ€ ๊ฒฝ๋กœ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋ฌป๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ง์ ‘ js ํŒŒ์ผ์ธ๊ฐ€์š”? ์•„๋‹ˆ๋ฉด ๋‚ด๋ถ€์— index.ts ๊ฐ€ ์žˆ๋Š” ํด๋”์ž…๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด main ํ•„๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” package.json์ด ์žˆ๋Š” ๋ชจ๋“ˆ์ž…๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด esnext ํ•„๋“œ? ์•„๋‹ˆ๋ฉด ํ‘œ์ค€์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด webpack์— ์˜ํ•ด ๋‹ค์‹œ ์ž‘์„ฑ๋œ ๊ฒฝ๋กœ์ž…๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋กค์—…? ๊ทธ๋ ‡๋‹ค๋ฉด ๊ตฌ์„ฑ์€ ์–ด๋””์— ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹ค๋ฅธ ๋ฒˆ๋“ค๋Ÿฌ์ผ๊นŒ์š”? ๋œ ์•Œ๋ ค์ง„ ์ผ๋ถ€? ๊ทธ๋ฆฌ๊ณ  ์œ„ ๋ฌธ์žฅ์—์„œ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ•œ ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

"renameImports":true์™€ ๊ฐ™์€ ํ”Œ๋ž˜๊ทธ๋ฅผ tsc/tsconfig์— ์ „๋‹ฌํ•  ์ˆ˜๋„ ์žˆ๊ณ  tsc์—์„œ ์„ ํƒํ•˜๋Š” ๋‹ค๋ฅธ ์‹ ํ˜ธ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@weoreference ๊ฒฝ๋กœ ๋งคํ•‘ ์œผ๋กœ ์ด๋ฏธ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ? TSconfig ํŒŒ์ผ์˜ paths ์˜ต์…˜์€ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฒฝ๋กœ๋ฅผ JS ํŒŒ์ผ์— ๋งคํ•‘ํ•˜๋Š” ์ œ์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ž˜๋ชป ํ•ด์„ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

@Draccoz ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ช…ํ™•ํžˆ ํ•ด์ฃผ์„ธ์š”.

๊ทธ๋ฆฌ๊ณ  ์œ„ ๋ฌธ์žฅ์—์„œ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ•œ ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์˜ˆ, tsc๊ฐ€ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ํ™˜๊ฒฝ/๋นŒ๋“œ ๋„๊ตฌ ์กฐํ•ฉ์— ๋Œ€ํ•œ ์ง€์‹์„ ๊ฐ–์ถ”๋Š” ๊ฒƒ์€ ๋งค์šฐ ์–ด๋ ค์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ tsc๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ _๋Œ€๋ถ€๋ถ„์˜_ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๊ฐ„๋‹จํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๊ฒƒ์ด ์ œ๊ฐ€ ์„ค๋ช…ํ•œ "standardImportExtension" ๊ตฌ์„ฑ ๊ฐ’์ž…๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์—ฌ๊ธฐ์— "๋ณด์ฆ"์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ์˜ ์•ž๋ถ€๋ถ„์—์„œ tsc๋Š” ์ปดํŒŒ์ผ๋œ js๊ฐ€ ์‹ค์ œ๋กœ [์ผ๋ถ€ ํ™˜๊ฒฝ์—์„œ] ์‹คํ–‰๋˜๋„๋ก "๋ณด์žฅ"ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.

์Œ... ์–ด์ฉŒ๋ฉด ์ด๊ฒƒ์€ ๋„ˆ๋ฌด ํž˜๋“  ์•ฝ์†์ด์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ tsc๊ฐ€ js๊ฐ€ [์ผ๋ถ€ ํ™˜๊ฒฝ์—์„œ] ์‹คํ–‰๋˜๋„๋ก ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋ฐฉ๊ธˆ ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ํ˜„์žฌ js ํ™˜๊ฒฝ์—์„œ ํ•ด๋‹น ํ™˜๊ฒฝ์„ ์ •์˜ํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ @borfast ๊ฐ€ ์ œ์•ˆํ•œ ๊ฐ„๋‹จํ•œ ํ”Œ๋ž˜๊ทธ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” tsc๋ฅผ ์‹œ๋„ํ•˜๋Š” ์ƒˆ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒช๋Š” js ๊ฐ€์ ธ์˜ค๊ธฐ ์˜ค๋ฅ˜์˜ _๋Œ€๋ถ€๋ถ„_์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

๊ท€ํ•˜๊ฐ€ ์–ธ๊ธ‰ํ•œ ๊ณ ๊ธ‰ ์‚ฌ์šฉ์€ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๊ณ ๋ ค ์‚ฌํ•ญ์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์ง์ ‘ js ํŒŒ์ผ์ธ๊ฐ€์š”? ์•„๋‹ˆ๋ฉด ๋‚ด๋ถ€์— index.ts๊ฐ€ ์žˆ๋Š” ํด๋”์ž…๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋ฉ”์ธ ํ•„๋“œ๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” package.json์ด ์žˆ๋Š” ๋ชจ๋“ˆ์ž…๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด esnext ํ•„๋“œ? ์•„๋‹ˆ๋ฉด ํ‘œ์ค€์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด webpack์— ์˜ํ•ด ๋‹ค์‹œ ์ž‘์„ฑ๋œ ๊ฒฝ๋กœ์ž…๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋กค์—…? ๊ทธ๋ ‡๋‹ค๋ฉด ๊ตฌ์„ฑ์€ ์–ด๋””์— ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹ค๋ฅธ ๋ฒˆ๋“ค๋Ÿฌ์ผ๊นŒ์š”?

โ€” ๊ทธ ์‚ฌ์šฉ๋ฒ•์€ ์‹ค์ œ๋กœ ์‚ฌ์šฉ์ž ์ •์˜ ์‚ฌ์šฉ์ž ์Šคํฌ๋ฆฝํŠธ, ๋ฒˆ๋“ค๋Ÿฌ ๋ฐ ๊ธฐํƒ€ ๋„๊ตฌ์— ๋งก๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ณ ๊ธ‰ ์‚ฌ์šฉ๋ฒ•์ด ํ’€๊ธฐ ์–ด๋ ต๋‹ค๊ณ  ํ•ด์„œ ์‰ฌ์šด ๊ฒฝ์šฐ๋ฅผ ํ”ผํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์‰ฌ์šด ๊ฒฝ์šฐ๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ์— .js ํ™•์žฅ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ณ  ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ.

@weoreference ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๋‹น์‹ ์ด ์งˆ๋ฌธ์„ ํ•˜๊ณ  ๋„์›€์„ ์ฃผ๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ๋Š”๋ฐ ๋‹น์‹ ์ด ๊ทธ ์งˆ๋ฌธ์„ ๋ฌด์‹œํ•œ ๊ฒƒ์— ๋Œ€ํ•ด ๋ฐ˜๋Œ€ ํˆฌํ‘œ๋ฅผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ƒ์‚ฐ์ ์ธ ์†”๋ฃจ์…˜์œผ๋กœ ์ง„ํ–‰ํ•˜๋Š” ๋Œ€์‹  ๋…ผ์Ÿํ•˜๊ณ  ํ† ๋ก ํ•˜๋ ค๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ ค๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ์‹œ๋„๋ฅผ ๋ฐ˜๋Œ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•œ ๋งˆ์ง€๋ง‰ ๋ฉ”์‹œ์ง€์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์ŠคํŒธ์— ๋Œ€ํ•ด ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„.

@weoreference ๋Š” @DanielRosenwasser ๋Œ“๊ธ€์—์„œ ์ด ๋Œ€ํ™”์˜ ๋งจ ์ฒ˜์Œ์„ ์‚ดํŽด๋ณด์„ธ์š”. ๊ทธ๋Š” ๊ทธ๋“ค์ด ๊ทธ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค("ํ˜„์žฌ"? ์“ธ๋ชจ์—†๋Š” ํฌ๋ง ์ฃผ๊ธฐ). ๊ทธ์˜ ์„ฑ๋ช… ์ดํ›„์— typescript์˜ ๋ˆ„๊ตฌ๋„ ์ด ์ฃผ์ œ์— ๋Œ€ํ•ด ๋” ์ด์ƒ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ €์—๊ฒŒ๋Š” ์ด ํ† ๋ก ์ด ์ข…๋ฃŒ๋˜์–ด์•ผ ํ•˜๋ฉฐ Microsoft๋Š” ๊ณต์‹์ ์œผ๋กœ ์ž…์žฅ์„ ๋ฐํ˜€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๊ฐ„.
์ฐธ๊ณ ๋กœ ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๊ทธ ๊ธฐ๋Šฅ์— ์ฐฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์ด ๋‹จ์ˆœํ™”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. typescript ํŒ€ ์ฃผ์žฅ๋„ ์ดํ•ดํ•˜๋ฉด์„œ ํฌ๋ง์„ ์žƒ์—ˆ์Šต๋‹ˆ๋‹ค.

@weoreference

๊ฐ€์ƒ์ด ์•„๋‹ˆ๋ผ tsc๊ฐ€ ์ƒ์„ฑํ•  ๊ฒƒ์ž„์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. tsc๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์—๋Š” ๋‹น์‹ ์ด ์ธ์ •ํ•˜์ง€ ์•Š๋Š” ๋Œ€์นญ์ด ํ•จ์ถ•๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ท€ํ•˜๊ฐ€ ์–ธ๊ธ‰ํ•œ ์ด "๋ณด์ฆ"์€ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๋งํ–ˆ๋“ฏ์ด "tsc๊ฐ€ [js ํŒŒ์ผ]์„ ์ƒ์„ฑํ•  ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค."๋ผ๊ณ  ๋ฌป๋Š”๋‹ค๋ฉด ๋˜‘๊ฐ™์ด ์œ ํšจํ•œ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋œ js์—์„œ ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?โ€

๋Œ€์นญ์€ ์‹ค์ œ๋กœ ์œ ์ง€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ".js ํ™•์žฅ์ž ์ ์šฉ"๋งŒํผ ๊ฐ„๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. tsc๋Š” ์ง€์ •์ž๋ฅผ ํ™•์ธํ•˜๊ณ  ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋ฉฐ ํ™•์ธ์€ ์œ ํ˜• ์„ ์–ธ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. TypeScript ๋ฐ Babel์€ ๋‹จ์ผ ๋ชจ๋“ˆ ์ปดํŒŒ์ผ ๋ชจ๋“œ(tsc์˜ ๊ฒฝ์šฐ isolateModules)๋ฅผ ์ง€์›ํ•˜๋ฉฐ ์ด ๊ฒฝ์šฐ JavaScript ๋Œ€์‹  ์œ ํ˜•์„ ๊ฐ€์ ธ์˜ค๋ฉด tsc๋Š” ์œ ํ˜• ์„ ์–ธ์„ ๋กœ๋“œํ•˜์—ฌ ํ•ด๋‹น .js ํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ โ€‹โ€‹๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ง€์ •์ž. ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ณ  ๊ทน๋‹จ์ ์ธ ๊ฒฝ์šฐ๊ฐ€ ์—†๋„๋ก ํ•˜๋ ค๋ฉด ์ปดํŒŒ์ผ ์ „์— ์กด์žฌํ•˜๊ฑฐ๋‚˜ ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์˜ ์•Œ๋ ค์ง„ ๊ฒฐ๊ณผ์ธ .js ํŒŒ์ผ ๊ฐ€์ ธ์˜ค๊ธฐ๋งŒ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

@justinfagnani @Draccoz ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋„ค, ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚ด ๋งˆ์ง€๋ง‰ ์˜๊ฒฌ: "์–ด๋ ค์šด ๊ฒฝ์šฐ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ํ•ด์„œ ์‰ฌ์šด ๊ฒฝ์šฐ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค."

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

TypeScript๊ฐ€ ์—ฌ๊ธฐ์—์„œ ์‚ฌ์–‘์— ์–ด๊ธ‹๋‚œ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์ง€๋งŒ(๊ทธ๋ฆฌ๊ณ  ์ž˜๋ชป๋œ JavaScript๋ฅผ ์ƒ์„ฑํ•จ) ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฒฝ๋กœ๊ฐ€ ํŒŒ์ผ ์ด๋ฆ„๊ณผ ์ •ํ™•ํžˆ ์ผ์น˜ํ•ด์•ผ ํ•˜๋Š” ์‚ฌ์–‘ ์„ ์–ด๋””์—์„œ๋„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(ํ™•์žฅ์ž ํฌํ•จ). ์†Œํ™”ํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ์™„์ „ํžˆ ํ™•์‹ ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ์‚ฌ์–‘์—์„œ 'FromClause'์˜ 'ModuleSpecifier'๊ฐ€ 'StringLiteral'์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ์ ๋งŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งค์šฐ ๋Š์Šจํ•œ ์ •์˜์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ECMAScript๊ฐ€ ์กด์žฌํ•˜๋Š” ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์—์„œ ๋ชจ๋“ˆ ํ•ด์„์˜ ์œ ์—ฐ์„ฑ์„ ํ—ˆ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๋„ ๋‚ด๊ฐ€ ์ด๊ฒƒ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฝ๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์ด ์‚ฌ์‹ค์ด๋ผ๋ฉด TypeScript๊ฐ€ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•œ ์ž…์žฅ์„ ์™„ํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ TypeScript, Node ๋ฐ ์›น ๊ฐ„์— ๋” ๋งŽ์€ ์ƒํ˜ธ ์šด์šฉ์„ฑ์ด ์žˆ๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ƒํ™ฉ์€ ์ด์ƒ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ์ฝ์€ ํ›„์— ์ด ๋ฌธ์ œ์— ์ด๋ฅด๋ €๋‹ค. ๊ทธ ๋ฌธ์ œ๋Š” Node์˜ ์‹œ์Šคํ…œ์ด ES ์‚ฌ์–‘์œผ๋กœ ์ธํ•ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹(ํŒŒ์ผ ์ด๋ฆ„๊ณผ ์—„๊ฒฉํ•˜๊ฒŒ ์ผ์น˜)์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค๋Š” ์ธ์ƒ์„ ์ฃผ์—ˆ์ง€๋งŒ ์ด์ œ ๋‚ด๊ฐ€ ์ž˜๋ชป ์ฝ์—ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(ES ์‚ฌ์–‘์„ ์ฐธ์กฐํ•˜์ง€ ์•Š์Œ). TypeScript๋„ ์‹ค์ œ๋กœ '์ž˜๋ชป๋œ' ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด ๋ฌธ์ œ๋Š” ์‹ค์ œ๋กœ ์„œ๋กœ ๋‹ค๋ฅธ ํ™˜๊ฒฝ ๊ฐ„์˜ ๋ชจ๋“ˆ ํ•ด๊ฒฐ์— ๋Œ€ํ•œ ๋™๋“ฑํ•˜๊ฒŒ ์œ ํšจํ•œ ์ ‘๊ทผ ๋ฐฉ์‹ ๊ฐ„์˜ ๋น„ํ˜ธํ™˜์„ฑ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ TypeScript์˜ ์ฃผ์š” ๋Œ€์ƒ ํ™˜๊ฒฝ์€ ๋ถ„๋ช…ํžˆ Node์™€ ์›น์ด๊ณ  Node๊ฐ€ ์ด๋ก ์ ์œผ๋กœ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ทธ๋Ÿด ๊ฐ€๋Šฅ์„ฑ์€ ๊ฑฐ์˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ ์—ฌ์ „ํžˆ ์ด ๋ฌธ์ œ๊ฐ€ ์œ ํšจํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘: ๋ชจ๋“ˆ ํ•ด์ƒ๋„๊ฐ€ 'ํ˜ธ์ŠคํŠธ ์ •์˜'์ž„์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š” ์‚ฌ์–‘์˜ ์ด ์„น์…˜์ด ์•„๋‹๊นŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@kj ๊ด€๋ จ ์‚ฌ์–‘ ํ…์ŠคํŠธ๋Š” HTML ์‚ฌ์–‘์— ์žˆ์Šต๋‹ˆ๋‹ค. https://html.spec.whatwg.org/multipage/webappapis.html#resolve -a-module-specifier

๊ฐ€์ ธ์˜ค๊ธฐ ์ง€์ •์ž๋Š” ์ „์ฒด URL ๋˜๋Š” ์ ˆ๋Œ€ ๋˜๋Š” ์ƒ๋Œ€ ๊ฒฝ๋กœ์—ฌ์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ์ง€์ •์ž๊ฐ€ URL๋กœ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜(์ผ๋ฐ˜์ ์œผ๋กœ http:// ๋˜๋Š” https:// ์‹œ์ž‘) / , ./ ๋˜๋Š” ../ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ

๋‹ค๋ฅธ ๊ฒฝ๋กœ ๊ฒ€์ƒ‰ ๋˜๋Š” ํ•ด๊ฒฐ์€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ง€์ •์ž๊ฐ€ ๋ชจ๋“ˆ์˜ ์ „์ฒด URL๋กœ ํ™•์ธ๋˜์–ด์•ผ ํ•˜๊ณ  ์„œ๋ฒ„์—์„œ ์š”๊ตฌํ•˜๋Š” ๊ฒฝ์šฐ ํ™•์žฅ์„ ํฌํ•จํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์—๋Š” ํ™•์žฅ ์—†๋Š” URL์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Node๊ฐ€ ๋ชจ๋“ˆ์— ๋Œ€ํ•ด ๋ณด๋‹ค ์ œํ•œ์ ์ธ ํ•ด๊ฒฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ์›น๊ณผ์˜ ํ˜ธํ™˜์„ฑ์ด ํ–ฅ์ƒ๋˜์–ด npm์— ๊ฒŒ์‹œ๋œ ๋ชจ๋“ˆ์ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒƒ์ด ๋” ์ผ๋ฐ˜์ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ ์ด๋ฆ„์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ๋Š” ์—ฌ์ „ํžˆ ๋งค์šฐ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ Node๋Š” ์ด๋ฅผ ์ง€์›ํ•˜์ง€๋งŒ Import Maps ์ œ์•ˆ (Deno ๋ฐ SystemJS๊ฐ€ ์ด๋ฏธ ์ง€์›)๊ณผ ํ˜ธํ™˜๋˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

.js ํ™•์žฅ์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ์— ๋Œ€ํ•œ tsc์˜ ์ง€์›์€ ๋…ธ๋“œ์™€ ์›น ๋ธŒ๋ผ์šฐ์ € ๋ชจ๋‘์—์„œ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ถ”๊ฐ€ ๋„๊ตฌ ์—†์ด ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ๊ฒƒ์€ ํ™•์žฅ ์—†๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํŒจํ‚ค์ง€ ์ด๋ฆ„์— ๋Œ€ํ•œ ๋…ธ๋“œ ํ™•์ธ์„ ์ง€์›ํ•˜๋Š” ๋„๊ตฌ๋Š” ํด๋ž˜์Šค require() ์Šคํƒ€์ผ ํ™•์ธ๋„ ์‚ฌ์šฉํ•˜๊ณ  ์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•˜๊ณ  ํ™•์žฅ๋„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด es-dev-server ๊ฐ€ ํ•˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค.

@justinfagnani ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ ์–ด๋„ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ์„œ๋ฒ„๊ฐ€ ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ์•Œ์•„๋‘์‹œ๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ง๊ด€์ ์ด์ง€ ์•Š๊ณ  ํ˜ผ๋ž€ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ์ด์ต์„ ์œ„ํ•ด ํ”„๋กœ์ ํŠธ๊ฐ„์— ๋” ๋งŽ์€ ์ˆ˜๋ ด์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋” ์ด์ƒ ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋ณด์ผ์ง€ ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์ง€๊ธˆ์€ ์ด๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(ํŠนํžˆ ์œ„์˜ ์„ค๋ช…์„ ๋ณด๋ฉด ๋” ํŽธ์•ˆํ•ฉ๋‹ˆ๋‹ค).

https://nodejs.org/api/esm.html#esm_customizing_esm_specifier_resolution_algorithm

์ด ์˜ต์…˜์ด TypeScript ๋ฌธ์„œ์—์„œ ์ฐธ์กฐ๋˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ํ˜ผ๋™์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ' site:typescriptlang.org specifier-resolution' ๋˜๋Š” ' site:staging-typescript.org specifier-resolution'์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Node์—์„œ ์—ฌ์ „ํžˆ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ ๊ทธ๋ฆฌ ๋†€๋ผ์šด ์ผ์€ ์•„๋‹™๋‹ˆ๋‹ค.

@justinfagnani ๋‚˜๋Š” .js ํ™•์žฅ์ด ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์— ์ž‘๋™ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด์— ๋ฐ˜๋Œ€ํ•˜๋Š” ์ด๋…์  ์ž…์žฅ์„ ์ทจํ•˜๋Š” ๊ฒฝ์šฐ(์˜ˆ: https://github.com/TypeStrong/ts-node/issues/783, ๋‹น์‹ ์ด ์•Œ๊ณ  ์žˆ๋Š”).

์—ฌ๊ธฐ ์—์„œ @quantuminformation ์Šคํฌ๋ฆฝํŠธ์˜ ์ข…์†์„ฑ ์—†๋Š” ๋ฒ„์ „์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฒ„์ „์—๋Š” ์ด๋ฏธ .js ๋กœ ๋๋‚˜์ง€ ์•Š๋Š” ๋ชจ๋“ˆ๋งŒ ๊ต์ฒดํ•˜๋Š” ์ •๊ทœ์‹์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ™์€ ํ•„์š”

import ๋ฌธ์—์„œ .js ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ESM ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•œ .js ํ™•์žฅ์„ ๋‹ฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. TS ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๊ณ  ํ™•์žฅ์ž๋ฅผ ์ƒ๋žตํ•˜๋ฉด ์ž˜ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค. ๊ฐ€์ ธ์˜ค๊ธฐ์— .js ํ™•์žฅ์„ ์ถ”๊ฐ€ํ•˜๋ฉด TS ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ๋งŽ์€ ์˜ค๋ฅ˜(์กด์žฌํ•˜์ง€ ์•Š์•„์•ผ ํ•จ)๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์ด ๊ฐœ๋ฐœ๋˜์ง€ ์•Š๋Š” ์ฃผ๋œ ์ด์œ ๋Š” ๋‹ค์–‘ํ•œ ๋ฒˆ๋“ค๋Ÿฌ์™€์˜ ํ˜ธํ™˜์„ฑ์ด ์–ด๋ ต๊ฑฐ๋‚˜ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Node.js์™€ ๋ฒˆ๋“ค๋Ÿฌ๋Š” ECMAScript์—์„œ ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ์ง€์›์ด ์—†๋Š” ์ƒํƒœ์—์„œ ์ž์ฒด ๋ชจ๋“ˆ ๋ฐฉ์‹์„ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์ด ์ƒ๊ฐํ•˜๊ธฐ์— ๋ถ€์ ์ ˆํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ESM์ด ์ด์ œ ์šฐ๋ฆฌ์—๊ฒŒ ์žˆ์–ด ์•ž์œผ๋กœ ๋‚˜์•„๊ฐˆ ๊ธธ์ž…๋‹ˆ๋‹ค. ESM ๋ฐ ์›น ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ๋” ๋งŽ์€ ์ฝ”๋“œ๊ฐ€ ๊ฐœ๋ฐœ๋จ์— ๋”ฐ๋ผ ๋ฒˆ๋“ค๋Ÿฌ์˜ ์‚ฌ์šฉ์ด ์ค„์–ด๋“ค๊ณ  TS์™€ ESM ๊ฐ„์˜ ์ด๋Ÿฌํ•œ ๊ณ ์ถฉ์ ์€ ๋” ๋งŽ์€ ๋งˆ์ฐฐ์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ์ง€์›์ด ๋ฒ„๊ทธ๊ฐ€ ์žˆ๊ณ  ๋ชจ๋“  ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š๋”๋ผ๋„ ์ง€์›์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋” ๋‚˜์€ ์†”๋ฃจ์…˜์ด ์žˆ์„ ๋•Œ๊นŒ์ง€ ์ด๊ฒƒ์€ ๋นŒ๋“œ ์ž‘์—…์œผ๋กœ ์‚ฌ์šฉํ•  ๋น„ ์ข…์†์„ฑ ๋…ธ๋“œ ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค.

package.json์—์„œ ๊ตฌ์„ฑํ•˜์‹ญ์‹œ์˜ค.

  ..
    "scripts": {
        "build": "node build.js",
   ...

//build.js
import { execSync} from "child_process"
import * as util from "util"
import * as fs from "fs"
import * as path from "path"

//function to recurse dirs finding files
function fromDir(startPath, filter, callback) {

    //console.log('Starting from dir '+startPath+'/');

    if (!fs.existsSync(startPath)) {
        console.log("no dir ", startPath);
        return;
    }

    var files = fs.readdirSync(startPath);
    for (var i = 0; i < files.length; i++) {
        var filename = path.join(startPath, files[i]);
        var stat = fs.lstatSync(filename);
        if (stat.isDirectory()) {
            fromDir(filename, filter, callback); //recurse
        }
        else if (filter.test(filename)) callback(filename);
    };
};

//this add .js to lines like:  import .* from "\.  <-- only imports from ./ or ../ are touched
function addDotJsToLocalImports(filename) {
    var buf = fs.readFileSync(filename);
    let replaced = buf.toString().replace(/(import .* from\s+['"])(?!.*\.js['"])(\..*?)(?=['"])/g, '$1$2.js')
    if (replaced !== buf.toString()) {
        fs.writeFileSync(filename, replaced)
        console.log("fixed imports at "+filename )
    }
}

//------------------------
//---BUILD TASK START 
//------------------------

execSync("npx tsc --build -verbose", { stdio: 'inherit' })

//add .js to generated imports so tsconfig.json module:"ES2020" works with node
//see: https://github.com/microsoft/TypeScript/issues/16577
fromDir("./dist", /\.js$/, addDotJsToLocalImports)

https://github.com/microsoft/TypeScript/issues/16577#issuecomment -310426634 ๊ธฐ๋ฐ˜

3๋…„ ์ „ ์ด ํ˜ธ๊ฐ€ ์—ด๋ ธ์„ ๋•Œ ์ž์‹ ์ด ๋ฌด์—‡์„ ํ•˜๊ณ  ์žˆ์—ˆ๋Š”์ง€ ๊ธฐ์–ตํ•˜๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋น„๋ฒˆ๋“ค๋Ÿฌ ์†”๋ฃจ์…˜์€ ํ™•์žฅ์ž๋กœ .js ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›น ๋ถ„์‚ฐ ํ”„๋กœ์ ํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

100% ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋” ํฐ ๋ฌธ์ œ๋Š” ์›น๊ณผ Node.js๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๋ชจ๋“ˆ์„ ์ž‘์„ฑํ•˜๋ ค๋Š” ๊ฒƒ์ด์ง€๋งŒ ์ด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ JS์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ์ผ์ด ์žˆ์œผ๋ฉด --moduleResolution=web ์ถ”๊ฐ€๋˜์ง€๋งŒ ์—ฌ๊ธฐ์—์„œ๋Š” ์ด ๋ฌธ์ œ์˜ ๋ฒ”์œ„๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

.js ํ™•์žฅ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ์ด ๋นŒ๋“œ ํ›„ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

fix-ts-imports

#!/usr/bin/env sh

# Fixes JavaScript module imports generated by TypeScript without extension.
# Converts
# import {} from './module'
# into
# import {} from './module.js'
#
# EXAMPLE
# ./fix-ts-imports

ProjectDir="$(cd "$(dirname "$0")/.." && pwd)"

fix() {(
        local pkg="$1"
        shift

        find "$pkg" -type f -iname '*.js' -not -ipath '*/node_modules/*' -print0 \
        | while read -r -d '' file; do
                sed -i '' -E 's|(import .+ from ['\''"]\.?\./.+[^.][^j][^s])(['\''"])|\1.js\2|g' "$file"
        done
)}

if test $# -eq 0; then
        set -- "$ProjectDir"
fi

for pkg; do
        fix "$pkg"
done

JavaScript์—์„œ ๋น„์Šทํ•œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/yoursunny/NDNts/blob/743644226fe18d48e599181e87ad571a2708a773/mk/build-post.js

๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

tsc -b mk/tsconfig-solution.json -w --listEmittedFiles \
  | node mk/build-post.js

์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์Šคํฌ๋ฆฝํŠธ์˜ ์ฃผ์š” ๋‹จ์ ์€ ์†Œ์Šค ๋งต์„ ๊นจ๋œจ๋ฆฌ๋ฏ€๋กœ ๋””๋ฒ„๊น…์˜ ํšจ์œจ์„ฑ์ด ๋–จ์–ด์ง„๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์†Œ์Šค์—์„œ ์ตœ์‹  ๋„๊ตฌ์™€ .js ํ™•์žฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ๋…ธ๋“œ์™€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

  • ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ
  • es ๋ชจ๋“ˆ
  • ๋กค์—…

๊ฐœ๋ฐœ์ž๊ฐ€ ์ด์ „ ์›Œํฌํ”Œ๋กœ์˜ ์ต์ˆ™ํ•œ ๋žœ๋“œ๋งˆํฌ์— ์ง‘์ฐฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์ด ์‹ค์ œ๋กœ es-module๊ณผ ๋…ธ๋“œ ํ•ด๊ฒฐ์˜ ๊นจ์ง„ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ์— ๊ฐ‡ํ˜€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ webpack์ด ํƒ“์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค...

โ€” ์•„๋งˆ๋„ webpack์ด ํƒ“์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค...

๊ทธ๋ž˜์„œ ๊ณ ์–‘์ด๊ฐ€ ๊ฐ€๋ฐฉ์—์„œ ๋‚˜์™”์Šต๋‹ˆ๋‹ค.

์†Œ์Šค์—์„œ ์ตœ์‹  ๋„๊ตฌ์™€ .js ํ™•์žฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ๋…ธ๋“œ์™€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

_๋Œ€๋ถ€๋ถ„์˜_ ๋ชจ๋“  ๊ฒƒ์ด ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋ฉฐ ์†Œ์Šค ํŒŒ์ผ์˜ ๋‚ด๋ณด๋‚ด๊ธฐ์— .js ํ™•์žฅ์ž๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ๊ฒฝํ—˜์ƒ, .js ํ™•์žฅ ์ง€์›์„ ์™„๊ฐ•ํžˆ ๊ฑฐ๋ถ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์œผ๋กœ ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ํ•œ ๊ฐ€์ง€๋Š” ts-node์ž…๋‹ˆ๋‹ค. ์˜ˆ, ๋…ธ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์‚ฌ์ „ ๋ณ€ํ™˜ ๋‹จ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ .js ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ์ž‘๋™ํ•˜์ง€๋งŒ .ts ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ๋…ธ๋“œ์™€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง์ ‘ ํ…Œ์ŠคํŠธํ•˜๋ ค๋ฉด, ๋‹น์‹ ์€ ํ˜„์žฌ ๋Œ€๋ถ€๋ถ„ ์šด์ด ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (๋ช…ํ™•ํžˆ ํ•˜์ž๋ฉด ์ด๊ฒƒ์€ TypeScript ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ ts-node ๋ฒ„๊ทธ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.)

@chase-moskal ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

repo์™€ tsconfig ํŒŒ์ผ์„ ๋ฆฌํŒฉํ† ๋งํ–ˆ๋Š”๋ฐ ์ด์ œ
import {something} from './something.js'
๋˜์ง€์ง€ ์•Š๋Š”๋‹ค
typescript force overwrite error TS5055: Cannot write file because it would overwrite input file
๋” ์ด์ƒ fix-ts-imports ํ•ดํ‚น์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

250๊ฐœ ์ด์ƒ์˜ ๋Œ“๊ธ€์—๋Š” ๋ช…ํ™•์„ฑ์ด ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ์š”์•ฝ:

๋ฐฐ๊ฒฝ

๋ธŒ๋ผ์šฐ์ € ๋ชจ๋“ˆ

๋ธŒ๋ผ์šฐ์ €๋Š” ์ƒ๋Œ€ URL์„ ํฌํ•จํ•˜์—ฌ URL์— ๋”ฐ๋ผ EcmaScript ๋ชจ๋“ˆ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ( ๋ญ์•ผ )

Node.js ๋ชจ๋“ˆ

Node.js๋Š” ์—ฌ๋Ÿฌ ๋Œ€์ฒด ๋ฐ package.json ํŒŒ์ผ ๊ตฌ๋ฌธ ๋ถ„์„์„ ํฌํ•จํ•˜๋Š” ํ›จ์”ฌ ๋” ๋ณต์žกํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด ๋ชจ๋“ˆ(EcmaScript ๋ฐ Node.js ๊ด€๋ จ CommonJS ๋ชจ๋‘)์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ( Node.js ) ์˜ˆ๋ฅผ ๋“ค์–ด ์ „์ฒด ๊ฒฝ๋กœ๊ฐ€ ํ•„์š”ํ•œ --experimental-specifier-resolution=explicit ๋กœ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

TypeScript ๋ชจ๋“ˆ

TypeScript์—๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ ํ•ด์ƒ๋„ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์ด๋ฅผ ์ถ”๊ฐ€๋กœ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ( TypeScript ) ์˜๋„๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ƒ์„ฑ๋œ ์ถœ๋ ฅ์— ์‚ฌ์šฉ๋œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ชจ๋“ˆ ์ง€์ •์ž๋ฅผ ์ž‘์„ฑํ•˜๊ณ  baseUrl ๋ฐ pathMappings์™€ ๊ฐ™์€ ์˜ต์…˜์œผ๋กœ tsc์˜ ํ•ด์ƒ๋„๋ฅผ ์กฐ์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž๋Š” Node.js ํ™˜๊ฒฝ ๋˜๋Š” ํ˜ธํ™˜๋˜๋Š” ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” node moduleResolution์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ์š”์ฒญ์€ ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ์—†๋Š” ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ์‚ฌ์šฉ์ž์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค.

ts-node ๋ชจ๋“ˆ ํ•ด์ƒ๋„

๋ถ„๋ช…ํžˆ ts-node๋Š” ํ™•์žฅ์ด ์žˆ๋Š” ๋ชจ๋“ˆ ์‹๋ณ„์ž๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค . ์ด์œ ๋Š” ๋ถˆ๋ช…ํ™•ํ•˜์ง€๋งŒ Node.js์™€ TypeScript๊ฐ€ ๋ชจ๋‘ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ts-node๋Š” ํ‘œ๋ฉด์ ์œผ๋กœ ์ด๋“ค์˜ ๋ณ‘ํ•ฉ์ž…๋‹ˆ๋‹ค.

์‚ฌ๋ฆฌ

์‚ฌ์‹ค 1: .js ํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋” ๊ด‘๋ฒ”์œ„ํ•œ ํ˜ธํ™˜์„ฑ(์ฆ‰, ๋ธŒ๋ผ์šฐ์ €)์„ ์œ„ํ•ด ์ง€๊ธˆ .js ํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ts-node(IMO ๋ฒ„๊ทธ)๋ฅผ ์ œ์™ธํ•˜๊ณ  ์ „์ฒด ๊ฒฝ๋กœ(ํ™•์žฅ์ž ํฌํ•จ)๋ฅผ ์ง€์ •ํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ๋ฐ”๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์‹ค 2: "ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ์ถ”๊ฐ€"๋งŒํผ ๊ฐ„๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ์š”์ฒญ์€ "๋ชจ๋“ˆ ์‹๋ณ„์ž๋ฅผ ํŒŒ์ผ ๊ฒฝ๋กœ๋กœ ๋ณ€ํ™˜"์œผ๋กœ ๋” ์ž˜ ์š”์•ฝ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ./example ๋Š” ./example/index.js ๊ฐ€ ๋˜๊ณ  'lodash' ๋Š” '.node_modules/lodash/index.js' ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์•ฐ๋น„์–ธํŠธ ๋ชจ๋“ˆ ์„ ์–ธ๊ณผ ๊ฐ™์ด ํ™•์ธ๋œ ํŒŒ์ผ ๊ฒฝ๋กœ์กฐ์ฐจ ์—†๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

declare module "lodash" {
}

์•„๋งˆ๋„ ๋ชจ๋“ˆ ์žฌ์ž‘์„ฑ์€ ํ˜„์žฌ ํ”„๋กœ์ ํŠธ/์ปดํŒŒ์ผ์˜ TS ๋ชจ๋“ˆ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ์šฐ๋ฆฌ๋Š” ์ด์ œ TS์˜ ์„ค๊ณ„ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์œ„๋ฐ˜ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ๋‹ค๋ฅธ ๋ชจ๋“ˆ์ด ํ˜„์žฌ ๋ชจ๋“ˆ์˜ ์ถœ๋ ฅ์— ์˜ํ–ฅ์„ ์ค๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

์›น์—์„œ ์ž‘๋™ํ•˜๋Š” ๋ชจ๋“ˆ ์‹๋ณ„์ž์— ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์˜ˆ: ./foo/index.js ๋Œ€์‹  ./foo .)

(์‹ค์ œ๋กœ ๋งํ•ด์„œ, ์–ด์จŒ๋“  ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๊ธฐ๋ฅผ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, npm ํŒจํ‚ค์ง€๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.)

@pauldraper "์‚ฌ์‹ค 2"์— ์ค‘์š”ํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์š”์ฒญ์€ "๋ชจ๋“ˆ ์‹๋ณ„์ž๋ฅผ ํŒŒ์ผ ๊ฒฝ๋กœ๋กœ ๋ณ€ํ™˜"์œผ๋กœ ๋” ์ž˜ ์š”์•ฝ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ./example์€ ./example/index.js๊ฐ€ ๋˜๊ณ  'lodash'๋Š” 'node_modules/lodash/index.js'๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€๊ฐ€ ๋‹ค๋ฅธ ๊ณณ์— ์„ค์น˜๋  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ํŒจํ‚ค์ง€ ์™ธ๋ถ€์˜ ์ง€์ •์ž๋ฅผ ํ™•์ธํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ ๊ณ ์œ ํ•œ ํŒจํ‚ค์ง€ ์„ค์น˜์—์„œ ๋…ธ๋“œ ๋ชจ๋“ˆ ํ™•์ธ์„ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด import {} from './node_modules/lodash/index.js' ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๊ฒŒ์‹œํ•˜๊ณ  ๋๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@justinfagnani , ๋™์˜ํ•˜์ง€๋งŒ ์ด๋Š” ๋ชจ๋“ˆ ์‹๋ณ„์ž๊ฐ€ ์ถ”์ƒ์ ์ด๊ณ  tsc ์™ธ๋ถ€์˜ ๋ชจ๋“ˆ ์œ„์น˜๋ฅผ ์กฐ์ž‘ํ•˜๊ณ  ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ tsc๋Š” ๊ทธ๋Ÿฌํ•œ ์กฐ์ž‘์— ๊ด€์—ฌํ•  ์ˆ˜/ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ์š”์ฒญ์€ "๋ชจ๋“ˆ ์‹๋ณ„์ž๋ฅผ ํŒŒ์ผ ๊ฒฝ๋กœ๋กœ ๋ณ€ํ™˜"์œผ๋กœ ๋” ์ž˜ ์š”์•ฝ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ./example์€ ./example/index.js๊ฐ€ ๋˜๊ณ  'lodash'๋Š” '.node_modules/lodash/index.js'๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
์•ฐ๋น„์–ธํŠธ ๋ชจ๋“ˆ ์„ ์–ธ๊ณผ ๊ฐ™์ด ํ™•์ธ๋œ ํŒŒ์ผ ๊ฒฝ๋กœ์กฐ์ฐจ ์—†๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์š”์ฒญ์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ๋‚ด๋ณด๋‚ผ ๋•Œ ํ™•์žฅ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ํ•ดํ‚น ๋‹จ๊ณ„ ์—†์ด "module" ์œ ํ˜•๊ณผ ํ˜ธํ™˜๋˜๋Š” ๋ชจ๋“ˆ์„ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. lodash์™€ ๊ฐ™์€ ์™ธ๋ถ€ ๋ชจ๋“ˆ์€ CommonJ์ด๋ฏ€๋กœ .js๊ฐ€ ์—†์–ด๋„ ๊ณ„์† ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ:

// ./src/moduleA.ts
export const test = 2;
// ./src/moduleB.ts
import {test} from './moduleA'



md5-ec0300a1c6d92a03c70699d0e52c0072



```js
// ./lib/moduleB.js
import {test} from './moduleA.js'

์œ„์˜ typescript ์™ธ์—๋„ package.json "exports" ๋ฐ "type"์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ์ง„์ •ํ•œ ESM์„ ํ–ฅํ•œ ๊ธธ์€ ์—†์Šต๋‹ˆ๋‹ค.

์ด ์š”์ฒญ์€ ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ์—†๋Š” ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ์‚ฌ์šฉ์ž์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์ž˜๋ชป๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ๋ธŒ๋ผ์šฐ์ €์šฉ TS/JS๋ฅผ ๊ฑฐ์˜ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ์ฃผ๋กœ ์„œ๋ฒ„ ์ธก ์ฝ”๋“œ๋กœ ์ž‘์—…ํ•˜๋ฉฐ ๋…ธ๋“œ์—์„œ ESM ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•˜๊ณ  ๋ชจ๋“ˆ ๋กœ๋”ฉ์„ ์œ„ํ•œ ๋ฒˆ๋“ค๋Ÿฌ ๋ฐ ์ถ”๊ฐ€ ์ฝ”๋“œ์— ์˜์กดํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

lodash์™€ ๊ฐ™์€ ์™ธ๋ถ€ ๋ชจ๋“ˆ์€ CommonJ์ด๋ฏ€๋กœ .js๊ฐ€ ์—†์–ด๋„ ๊ณ„์† ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋“ค์ดํ•˜์ง€ ์•Š๋Š” ํ•œ.

๋ฐฉ์ถœ๋  ๋•Œ.

./moduleA.js ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ./moduleA/index.js , ๋งž์Šต๋‹ˆ๊นŒ? Node.js ๋ชจ๋“ˆ ํ™•์ธ์€ ์—ฌ๋Ÿฌ ๊ฒฝ๋กœ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋“ค์ดํ•˜์ง€ ์•Š๋Š” ํ•œ.

์ด๊ฒƒ์ด ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๋•Œ์˜ ์˜ˆ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? Node.js๋Š” CommonJS์—์„œ ๋ช…๋ช…๋œ ๋‚ด๋ณด๋‚ด๊ธฐ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ง€์›ํ–ˆ์Šต๋‹ˆ๋‹ค.
https://nodejs.org/api/esm.html#esm_import_statements

./moduleA.js์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ./moduleA/index.js์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งž์ฃ ? Node.js ๋ชจ๋“ˆ ํ™•์ธ์€ ์—ฌ๋Ÿฌ ๊ฒฝ๋กœ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

ESM ๋ชจ๋“œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. index.js๋Š” ์ง€๊ธˆ์ฒ˜๋Ÿผ ๋” ์ด์ƒ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ESM ๋กœ๋”๋Š” package.json ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ "๋‚ด๋ณด๋‚ด๊ธฐ" ๋ฐ "์œ ํ˜•"์„ ์ฝ์Šต๋‹ˆ๋‹ค.
https://nodejs.org/api/esm.html#esm_mandatory_file_extensions

typescript + node.js ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ ๋” ๋‚˜์€ ๊ธฐ๋ณธ ESM ์Šคํ† ๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋„๊ตฌ(typescript) ๋˜๋Š” node.js์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๋ฌด์—‡์„ ํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ํ•ฉ์˜๊ฐ€ ๋ถ€์กฑํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€ ์žˆ๋Š” ๋…ธ๋“œ PR์— ๋Œ€ํ•œ ์ œ๊ฑฐ๋œ ๋งํฌ๋ฅผ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰