๋ธ๋ผ์ฐ์ ์์ 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>
#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+์ผ ๋ ์ปดํ์ผ๋ฌ์์ ์ถ๊ฐํ๋๋ก ํฉ๋๋ค.
.js
์ ๋ํ .ts
.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๊ฐ์ง ์ง๋ฌธ์ ๋ต๋ณํด ์ฃผ์๊ฒ ์ต๋๊น?
์ฒซ ๋ฒ์งธ ์ง๋ฌธ์ ๋ํ ๋๋ต์ด '์๋์ค'์ธ ๊ฒฝ์ฐ ์ด ๊ธฐ๋ฅ์ ์ ๊ณตํ ์์ฌ๊ฐ ์์์ ๊ณต์์ ์ผ๋ก ์ ์ธํ๊ณ ์ด ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง ์์ ๊ฒฝ์ฐ ๋ค๋ฅธ ์ฌ๋์ ๊ธฐ๋ค๋ฆฌ๊ฒ ํ์ง ์์์ ๊ณต์์ ์ผ๋ก ์ ์ธํ๋ฉด์ ์ด ๋ฌธ์ ๋ฅผ ๋ซ์ผ์ญ์์ค.
์, ์ด๋ฏธ ํ ๋ฒ ์ด์ ์ ์๋ ์ ์ด ์์ต๋๋ค. ๊ณ ๋ คํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? 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/ )๋ก ์ด๋ํ์ญ์์ค.
ํ์ด์ง ๋ฐ๋ฅ๊ธ์์ ๋ค์ ํ์ ์ฝ์ ์ ์์ต๋๋ค.
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 ํ์ผ์ด๋๋ผ๋) ๐ข
๋๊ตฐ๊ฐ ๊ทธ๊ฒ์ ์๋ํ๊ณ ์ถ๋ค๋ฉด:
https://github.com/QuantumInformation/web-gen-bot
๊ทธ๋ฌ๋ ํ์ฌ tsconfig์์ ์๋ํ๋๋ก ์์ค ๋๋ฒ๊น ์ ๊ฐ์ ธ์ฌ ์ ์์ผ๋ฉฐ ๋ค์ ๋ณด๊ณ ํฉ๋๋ค.
๊ฒฐ๊ตญ ๋๋ webpack์ผ๋ก ๋์๊ฐ๊ณ node_modules๋ ๋ธ๋ผ์ฐ์ ์ ๋น๋ ๋๊ตฌ์์ ๋ฒ์ด๋๋ ค๊ณ ํ ๋ ํฌ๋ฌ์์ต๋๋ค.
Jest ๋ฟ๋ง์ด ์๋๋๋ค. ๊ฒ์ํ๊ธฐ ์ ์ TypeScript๋ฅผ ์ปดํ์ผํ๊ธฐ ์ํด tsc
๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ฒฐ๊ณผ ํจํค์ง๋ฅผ ๊ฐ์ ธ์ค๋ ๋ชจ๋ JS ๋ชจ๋์ ๋ชจ๋ ํด์๋์ ์ฐจ์ด๋ก ์ธํด ์ค๋จ๋ฉ๋๋ค.
์ฌ๊ธฐ์ ๋ ผ์๋ ๋ ๊ฐ์ง ๊ด๋ จ๋์ง๋ง ๊ถ๊ทน์ ์ผ๋ก ๋ณ๊ฐ์ ๋ฌธ์ ๋ก ์ฝ๊ฐ ๊ฐ๋ผ์ง ๊ฒ ๊ฐ์ต๋๋ค.
๋ ๋ฒ์งธ ๋ฌธ์ ๋ ๋ถ๋ช ํ 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 ๋ ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
.js
ํ์ฅ์ ์ง์ ํ๋ฉด TS๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์คํํ๋ ๋ฐํ์(์: TS-Node)์ด ์๋ํ์ง ์์ต๋๋ค.(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 ๋ ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
- TS๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์คํํ๋ ๋ฐํ์(์: TS-Node)์ ๊ฐ์ ธ์ค๊ธฐ์ .js ํ์ฅ์๋ฅผ ์ง์ ํ๋ฉด ์๋ํ์ง ์์ต๋๋ค.
์ด๊ฒ์ TS-Node์ ๋ฒ๊ทธ์
๋๋ค. tsc
์ ๋์๊ณผ ์ผ์นํ์ง ์์ต๋๋ค.
- ๊ฐ์ ธ์ค๊ธฐ์ .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๋ง ์๊ณ ๋ค๋ฅธ ์ข
์์ฑ์ ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ค, ํ์ง๋ง ๋ถ๋ช ํ ํฌ๋ง์ ์ฌ์ ํ โโ๋ง์ ์ฌ๋๋ค์๊ฒ ์ข์ ๊ฒ์ ๋๋ค
๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๊ทธ ์๊ฒฌ์ ํตํด ๋ช ๋ฒ์ด๋ ๊ตฌํ๋์ง ์์ ๊ฒ์ด๋ผ๊ณ ์ธ๊ธํ๋๋ฐ ์ ๊ณ์ ์ด์ด ๋๋๊ฐ?
๋๊ตฐ๊ฐ๊ฐ './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 ์ ์ฉ:
๋ฐ๋ผ์ ์ด ๋ชจ๋ ๊ฒ์ ๋ํ ํด๊ฒฐ์ฑ
์ ๋จ์ํ .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๋ฅผ ๋จ์ผ ํ์ผ๋ก ๋ฌถ๊ฑฐ๋ ์ปดํ์ผํ์ง ์๊ณ ๋ธ๋ผ์ฐ์ ์์ ์ง์ ์คํํฉ๋๋ค. ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
.js
ํ์ฅ์๊ฐ ์๋์ง ํ์ธํ์ญ์์ค.es-dev-server
๋ ๋ด๊ฐ ์๋ ๊ฐ์ฅ ๊ฐ๋จํ ๊ฒ์
๋๋ค.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 ์ฌ์ด์์ ์ด์ ๋ง ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋๋ ํ์ค(ํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ธ๋ผ์ฐ์ ๋ฐ ๋ ธ๋)์ ๋ํด ์ ๋์ํ ์ ์์ต๋๋ค.
์ต์ ์๋ฐ ์คํฌ๋ฆฝํธ ํจํค์ง๋ฅผ ์์ฑํ๊ณ typescript๋ก ์์ฑํ๊ณ emascript ๋ชจ๋๋ก ๋ฐฐํฌํ ์ ํ์ ์ ๊ฑฐํ๊ณ ์ถ์ต๋๋ค(๊ฐ์ ธ์ค๊ธฐ ๋ฐ ๋ด๋ณด๋ด๊ธฐ ๋ฌธ ์ ์ง).
์ ๋ vscode์ ๋ชจ๋์ ์ฌ์ฉํ์ฌ ์ ์ ์น์ฌ์ดํธ๋ฅผ ๊ตฌ์ถ ์ค์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ ์ฒซ ๋ฒ์งธ ๊ฐ์ ธ์ค๊ธฐ์ ๋ํด ํ์ฅ ์์ด ์๋ ๊ฐ์ ธ์ค๊ธฐ๊ฐ ์ํ๋๋ฉฐ ์ด๋ฅผ ์๋์ผ๋ก ์กฐ์ ํด์ผ ํฉ๋๋ค.
์ด๋ฌํ ๊ฒฝ์ฐ tsc๋ ์ด๋ฅผ ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ ์ ์ฒด ํ์ดํ์ผ๋ก typescript์์ es ๋ชจ๋ ๋ฐฐํฌ๋ฅผ ์๋นํ๋ ๊ฒ์ ์ง์ํ๋ ์ค๋ช ์ ํ์ผ์ ๋ฐ๋ก ๋ด๋ณด๋ผ ์๋ ์์ต๋๋ค(๊ต์ฅํฉ๋๋ค).
๊ทธ๋ฌ๋ ์์ค์ ๋ํด ํ ์คํธ ์ฝ๋๋ฅผ ์คํํ๋ ค๋ฉด ts-node๋ฅผ ์ฌ์ฉํ ์ ์์ง๋ง ์ฌ๊ธฐ์๋ ts-node๊ฐ ๋ง์กฑ์ค๋ฝ์ง ์์ต๋๋ค.
์ ์ฌํ๊ฒ, tsc, vscode ๋ฐ 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๊ฐ ์๊ธฐ ๋๋ฌธ์
์/ ์ด๋ป๊ฒ ์๋ํ๋์? (๋๋ ๊ทธ๊ฒ์ด ํ์ฅ์ ๊ณ ๋ คํ์ง ์๋๋ค๊ณ ๊ฐ์ ํฉ๋๋ค)
์ฐธ๊ณ ์ฉ์ผ๋ก ์คํฌ๋ฆฐ์ท์ ์ฒจ๋ถํฉ๋๋ค.
@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 ์๋ฃจ์ ์ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ์ด์ ๋ํ ๋ฎ์ ๊ธฐ์ ์์ ์ฌํญ์
๋ค๋ฅธ ์ฌ๋๋ค์ด ์ฌ์ฉํ ์ ์๋๋ก ์ด ํ ์ค์ง๋ฆฌ๋ฅผ ๊ณต์ ํ๊ณ ์ถ์์ต๋๋ค. 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
๋ฅผ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํ ํ์๊ฐ ์์ต๋๋ค.
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
ํ์ผ์ด ์์ต๋๋ค..ts
ํ์ผ์ .js
ํ์ผ๋ก ๋ณํํฉ๋๋ค..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 ์๋ ํ์ธ์ :) ๊ธ์, ๋ด๊ฐ ๋ณด๊ธฐ์ ๋น์ ์ ๋ ๊ฐ์ง๋ฅผ ๋ฌป๊ณ ์์ต๋๋ค.
๊ตฌํ ๋ฐฉ๋ฒ
๊ฐ๋ฐ์์ธ ๋ด๊ฐ tsc์ ํน์ ํ๊ฒฝ์ ๋ํด ํน์ ๋ฐฉ์์ผ๋ก ๊ฐ์ ธ์ค๊ธฐ ์ด๋ฆ์ ๋ณ๊ฒฝํ๊ณ ์ถ๋ค๋ ์ ํธ๋ฅผ ๋ณด๋ด๋ ๋ฐฉ๋ฒ
์ฌ๊ธฐ ๋ด ์๊ฐ์ด ์์ต๋๋ค.
@borfast ์ ํ์ ์ ์ฐธ์กฐํ์ญ์์ค. "๊ณ ์ฐจ" ๋ต๋ณ์ด์ง๋ง ๊ฐ๊ฒฐํฉ๋๋ค. :)
"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-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๋ ์ฌ๋ฌ ๋์ฒด ๋ฐ package.json ํ์ผ ๊ตฌ๋ฌธ ๋ถ์์ ํฌํจํ๋ ํจ์ฌ ๋ ๋ณต์กํ ์๊ณ ๋ฆฌ์ฆ์ ํตํด ๋ชจ๋(EcmaScript ๋ฐ Node.js ๊ด๋ จ CommonJS ๋ชจ๋)์ ํด๊ฒฐํฉ๋๋ค. ( Node.js ) ์๋ฅผ ๋ค์ด ์ ์ฒด ๊ฒฝ๋ก๊ฐ ํ์ํ --experimental-specifier-resolution=explicit
๋ก ์ฌ์ฉ์ ์ ์ํ ์ ์์ต๋๋ค.
TypeScript์๋ ์ฌ์ฉ ๊ฐ๋ฅํ ์ฌ๋ฌ ๋ชจ๋ ํด์๋ ์๊ณ ๋ฆฌ์ฆ๊ณผ ์ด๋ฅผ ์ถ๊ฐ๋ก ์ฌ์ฉ์ ์ ์ํ ์ ์๋ ๋ค์ํ ์ต์ ์ด ์์ต๋๋ค. ( TypeScript ) ์๋๋ ์ฌ์ฉ์๊ฐ ์์ฑ๋ ์ถ๋ ฅ์ ์ฌ์ฉ๋ ๊ฒ๊ณผ ๋์ผํ ๋ชจ๋ ์ง์ ์๋ฅผ ์์ฑํ๊ณ baseUrl ๋ฐ pathMappings์ ๊ฐ์ ์ต์ ์ผ๋ก tsc์ ํด์๋๋ฅผ ์กฐ์ ํ๋ ๊ฒ์ ๋๋ค.
์ค์ ๋ก ๋๋ถ๋ถ์ ์ฌ์ฉ์๋ Node.js ํ๊ฒฝ ๋๋ ํธํ๋๋ ๋ฒ๋ค๋ฌ๋ฅผ ๋์์ผ๋ก ํ๋ node moduleResolution์ ์ฌ์ฉํฉ๋๋ค. ์ด ์์ฒญ์ ๋ฒ๋ค๋ฌ๊ฐ ์๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋์์ผ๋ก ํ๋ ์ฌ์ฉ์์ ์ค์ ์ ๋ก๋๋ค.
๋ถ๋ช ํ ts-node๋ ํ์ฅ์ด ์๋ ๋ชจ๋ ์๋ณ์๋ฅผ ์ง์ํ์ง ์์ต๋๋ค . ์ด์ ๋ ๋ถ๋ช ํํ์ง๋ง Node.js์ TypeScript๊ฐ ๋ชจ๋ ํ๊ธฐ ๋๋ฌธ์ ts-node๋ ํ๋ฉด์ ์ผ๋ก ์ด๋ค์ ๋ณํฉ์ ๋๋ค.
๋ ๊ด๋ฒ์ํ ํธํ์ฑ(์ฆ, ๋ธ๋ผ์ฐ์ )์ ์ํด ์ง๊ธ .js ํ์ฅ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ts-node(IMO ๋ฒ๊ทธ)๋ฅผ ์ ์ธํ๊ณ ์ ์ฒด ๊ฒฝ๋ก(ํ์ฅ์ ํฌํจ)๋ฅผ ์ง์ ํ๋ฉด ๋ชจ๋ ๊ฒ์ด ๋ฐ๋ก ์๋ํฉ๋๋ค.
์ด ์์ฒญ์ "๋ชจ๋ ์๋ณ์๋ฅผ ํ์ผ ๊ฒฝ๋ก๋ก ๋ณํ"์ผ๋ก ๋ ์ ์์ฝ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ./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์ ๋ํ ์ ๊ฑฐ๋ ๋งํฌ๋ฅผ ํธ์งํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ํ ์ด ๋ฌธ์ ๋ฅผ ์กฐ๊ธ ์ผ๋ฐํํ๊ธฐ ์ํด ์ค์ ๋ก
.js
ํ์ฅ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์๋๋ผ ํ์ฅ์๊ฐ ๋ฌด์์ด๋ ๋ชจ๋ ์ง์ ์๋ฅผ ์ค์ ๊ฒฝ๋ก๋ก ํด๊ฒฐํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.