์๋ง๋ ์ด๊ฒ์ ๋ด ์ชฝ์์ ์๋ชป๋ ๊ตฌ์ฑ์ด์ง๋ง ๋ฒ๊ทธ์ฒ๋ผ ๋ณด์
๋๋ค. object
๋ฅผ ๋กค์
๊ตฌ์ฑ์ input
์์ฑ์ผ๋ก ์ฌ์ฉํ๋ฉด ์
๋ ฅ ํ์ผ์ ๋ํ ํ์ดํ ํ์ผ์ด ์ ์ฅ์์ ๋ฃจํธ ํด๋(๋กค์
๊ตฌ์ฑ ํ์ผ๊ณผ ๋์ผํ ํด๋)์ ์์ฑ๋๊ณ ๋ฒ๋ค๋ JS ํ์ผ๊ณผ ํจ๊ป ๋์ ์ถ๋ ฅ ๋๋ ํ ๋ฆฌ(์ฌ๊ธฐ์๋ ./dist
)๊ฐ ์๋๋๋ค.
{
...
input: {
Lib1: './src/Lib1.tsx',
Lib2: './src/Lib2.tsx'
},
output: {
dir: './dist',
format: 'cjs',
sourcemap: true,
entryFileNames: '[name].js'
}
}
{
...
"compilerOptions": {
"outDir": "./dist"
},
}
// These files are created
./Lib1.d.ts
./Lib2.d.ts
// instead of (expected):
./dist/Lib1.d.ts
./dist/Lib2.d.ts
ํฅ๋ฏธ๋กญ๊ฒ๋ entryFileNames: 'dist/[name].js'
๋ฅผ ์
๋ ฅํ๋ฉด dist
ํด๋ ๋ด์ dist
๋ผ๋ ๋ถํ์ํ ํ์ ํด๋๊ฐ ์์ฑ๋์ด ๊ฑฐ๊ธฐ์ ์์ฑ๋ฉ๋๋ค.
useTsconfigDeclarationDir
ํ๋ฌ๊ทธ์ธ ์ต์
์ ํ์ฌ๋ก์๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์
๋๋ค.
์ด๊ฒ์ 0.20.0์์ ๋ฆด๋ฆฌ์ค๋ #142๋ก ์์ ๋ ์ ์์ต๋๋ค.
์๋ ํ์ธ์ @ezolenkom & @jakearchibald , ๋ ๋ค ์ค์ ๋ก ์ด์ด ์์ต๋๋ค.
๋ด ๋กค์
ํ๋ฌ๊ทธ์ธ์ useTsconfigDeclarationDir
์ต์
์ ์ถ๊ฐํ๋ฉด ์ ์ธ ํ์ผ์ด ๋ ์ด์ ์์ฑ๋์ง ์์ต๋๋ค. ๋ถํํ๋ 0.20.1๋ก ์
๋ฐ์ดํธํด๋ ์ฐจ์ด๊ฐ ์์์ต๋๋ค.
@benkeen useTsconfigDeclarationDir: true
ํ๋ฌ๊ทธ์ธ ์ต์
์ ์ฌ์ฉํ ๋ tsconfig.json
declarationDir
๊ฐ๋ ์์ด์ผ ํฉ๋๋ค.
๋น์ทํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋ด ํ๋ก์ ํธ ๋ ์ด์์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
export default [
{
input: 'src/subFolder1/one.ts,
output: [
{
file: 'dist/one.js'
.....
}
],
plugins: [
typescript({
typescript: require('typescript'),
}),
]
},
input: 'src/subFolder2/two.ts,
output: [
{
file: 'dist/two.js'
.....
}
],
...
},
]
๋๋ ์ถ๋ ฅ์ผ๋ก :
|---subFolder1
| |--------one.d.ts
|
|---subFolder2
| |---------two.d.ts
|-----one.js
|-----two.js
useTsconfigDeclarationDir: false
๋ฅผ ์ฌ์ฉํ์ฌ 0.20.1์์ ์๋ํฉ๋๋ค. -- d.ts ํ์ผ์ output.[].dir
์ง์ ๋ ํด๋๋ก ์ด๋ํฉ๋๋ค. @benkeen ๋ค์ ์๋ํด ์ฃผ์๊ฒ ์ต๋๊น?
@AntonPilyak ์๋์ ์ธ ๊ฒ์
๋๋ค. d.ts๊ฐ ํ์ ๊ฒฝ๋ก์์ด ํ ํด๋๋ก ์ด๋ํ๋ ๊ฒฝ์ฐ subFolder1/one.ts
๋ฐ subFolder2/one.ts
๊ฐ ์์ผ๋ฉด ๊ทธ ์ค ํ๋๊ฐ ๋ค๋ฅธ ํด๋๋ฅผ ๋ฎ์ด์ฐ๊ฒ ๋ฉ๋๋ค.
@ezolenko : ์ด ๊ธฐ๋ฅ์ ์ค์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ๋ณด๋ค ๋ ๋ง์ ๋ถํธ์ ์ด๋ํ๋ค๊ณ ์๊ฐํฉ๋๋ค(๋ชจ๋ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ ์งํ๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์). ์ด๋ฌํ ๋ชจ๋ ์ ํ ์ ์ธ์ ๋ฒ๋ค์ ๋ฃจํธ์ ๋ณต์ฌํ๋ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค๊ณ ํฌํจํ๊ธฐ ์ฌ์ด ๋ฒ๋ค์ ์์ฑํ๊ธฐ ์ํด ๋๋ ํ ๋ฆฌ๋ฅผ .npmignore์ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ๋์ผํ ์ด๋ฆ์ ๊ฐ์ง ์ ํ ํ์ผ์ ๋ํด์๋ง ์ด๋ฌํ ์ถ๊ฐ ๋๋ ํ ๋ฆฌ๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋จธ์ง๋ rollup.config.json์ '์ถ๋ ฅ' ์น์ ์ ์ ์๋ ๋๋ ํ ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ธ์.
@AntonPilyak useTsconfigDeclarationDir: true
์ต์
์ ์ฌ์ฉํ๊ณ tsconfig์์ declarationDir
๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด typescript ์์ฒด์์ ์
๋ ฅ ์ถ๋ ฅ ๊ฒฝ๋ก๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
๊ฒฝ๋ก์ ๊ณ ์ ์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ํ์ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ผ ํ๋์ง ๊ฒฐ์ ํ๋ ๊ฒ์ ์งํํ๋ ํ๋ก์ ํธ์์ ์ ๋ชฝ์ด ๋ ๊ฒ์ ๋๋ค. ๋ค๋ฅธ ํด๋์ ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง ์ ํ์ผ์ ์ถ๊ฐํ๊ธฐ ๋๋ฌธ์ ๊ฐ์๊ธฐ ์ ๋ ฅ์ด ํ์ ํด๋๋ก ์ด๋ํ๊ฒ ๋ฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์์ ํ์ดํ์ ์ํ๋ฉด ์ด์จ๋ ํ๋์ ํ์ผ๋ก ๋ณํฉํ๊ณ ์ถ์ ๊ฒ์ ๋๋ค (npm ๋ชจ๋์ด ์์๋๋ฐ ๊ทธ ์ด๋ฆ์ ๊ณ์ ์์ด ๋ฒ๋ ธ์ต๋๋ค)
0.22.0
๋ฒ์ ์ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ @AntonPilyak ๊ณผ ๊ฑฐ์ ๋์ผํ ๋ฌธ์ ๊ฐ
{
...
input: {
foo: 'src/lorem/foo.ts',
bar: 'src/ipsum/bar.ts'
},
output: {
dir: 'dist',
format: 'cjs',
sourcemap: true,
}
}
๊ทธ๋ฆฌ๊ณ ๋๋ ์ด๊ฒ์ ์ป์ต๋๋ค.
dist/
lorem/
foo.d.ts
ipsum/
bar.d.ts
foo.js
foo.js.map
bar.js
bar.js.map
๋ถ๋ช
ํ *.d.ts
ํ์ผ์ *.js
๋ฐ *.js.map
ํ์ผ๊ณผ ๋๋ํ ๋ฐฐ์นํ๊ณ ์ถ์ต๋๋ค.
useTsconfigDeclarationDir
๋ฐ declarationDir
๋ฅผ ๋ง์ง์๊ฑฐ๋ ค๋ ์์ฉ์ด ์์์ต๋๋ค.
์ ์ ํ์ผ์ ํญ์ ๊ฐ๊ฐ lorem
๋ฐ ipsum
ํ์ ํด๋ ๋ด์ ์์ผ๋ฉฐ ํ๋ซ ๋ชฉ๋ก์๋ ํฌํจ๋์ง ์์ต๋๋ค.
๋ํ ์ง์ ์ ๋ฟ๋ง ์๋๋ผ ์ฐพ์ ๋ชจ๋ .ts ํ์ผ์ ๋ํด ์ ์ธ ํ์ผ์ ์์ฑํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
dist/
lorem/
foo.d.ts
ipsum/
utils/
bar-helper.d.ts
bar.d.ts
some_other_ts_file/
not_imported_by/
neither_foo_nor_bar/
wat.d.ts
foo.js
foo.js.map
bar.js
bar.js.map
options.tsconfigOverride.input
๋ฒ์๋ฅผ ์ง์
์ ์ผ๋ก ์ง์ ํ๋ ค๊ณ ์๋ํ์ง๋ง ์๋ฌด ํจ๊ณผ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ฌ์ค tsconfigOverride.input
๊ฐ ์ ํ ์๋ํ๋์ง ํ์คํ์ง ์์ต๋๋ค.
์ด ๋ชจ๋ ๊ฒ์ด ์ฝ๊ฐ ํผ๋์ค๋ฝ์ต๋๋ค.
...
๋ด ๋ง์, utils/bar-helper.ts
๋ํ ์ ์ธ ํ์ผ์ ์์ฑํด์ผ ํ์ง๋ง ์ ์ด๋ wat.ts
๋ ์ ์ฒด์์ ์ ์ธ๋์ด์ผ ํ๋ค๋ฉด ์ถฉ๋ถํ ๊ณต์ ํฉ๋๋ค.
์, tsconfig์์ ์ฐพ์ ๋ชจ๋ ํ์ผ์ ๋ํ ์ ์ธ์ ์์ฑํฉ๋๋ค. ํน์ ํ์ผ์ ๊ฑด๋๋ฆฌ์ง ์์ผ๋ ค๋ฉด ํด๋น ํ์ผ์ด tsconfig์์ ์ ์ธ๋๊ฑฐ๋ ํฌํจ๋์ง ์์๋์ง ํ์ธํ์ญ์์ค. typescript์์ ์ฐพ์ ํ์ผ ๋ชฉ๋ก์ ๋ณด๋ ค๋ฉด ์์ธํ ์ ๋ 3์ผ๋ก ํ๋ฌ๊ทธ์ธ์ ์คํํ๊ณ "parsed tsconfig" ํญ๋ชฉ์ ์ฐพ์ผ์ญ์์ค.
์ ์ ๊ฒฝ๋ก์ ๊ฒฝ์ฐ ๊ทํ์ ์์์ 'src/ipsum/foo.ts'
์ ๋ํ ์ ์๋ฅผ ์ด๋์ ๋์๊ฒ ์ต๋๊น?
dist/foo.js
๋ํ ์ ์์ด๋ฏ๋ก ์์ค ๋งต ํ์ผ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก dist/foo.d.ts
์์ ์์ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํ์ต๋๋ค.
TypeScript๋ dist/foo.js
์ dist/lorem/foo.d.ts
๋ฅผ ์์ผ๋ก ์ธ์ํฉ๋๊น?
์ด๊ฒ์ด ๋ถํด๋๋ ์ ์ฒด ์๋๋ฆฌ์ค๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
src/dir1/foo.ts
src/dir2/foo.ts
dir1/foo.ts๋ ๋กค์ ์ ๋ ฅ์ผ๋ก ์ค์ ํ๊ณ dir2/foo.ts๋ฅผ ๊ฐ์ ธ์ต๋๋ค. ๋กค์ ์ ๋ ์์ค ํ์ผ์ ๊ด๋ จ ๋ถ๋ถ์ ํฌํจํ dist/foo.js ๋ฒ๋ค์ ์์ฑํ์ง๋ง typescript๋ ์ด๋๊ฐ์ ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง 2๊ฐ์ ์ ํ ์ ์ ํ์ผ์ ์์ฑํด์ผ ํฉ๋๋ค.
์ฌ์ด ์๋ฃจ์
์ ์์ค ๋ ์ด์์์ ๋ฏธ๋ฌ๋งํ๋ ํ์ ํด๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. ์ ํ ์ ์๋ฅผ ๋ณํฉํ๋๋ก ์ง์ํ์ง ์๋ ํ tsc
๋ ๋ง์ฐฌ๊ฐ์ง๋ผ๊ณ ์๊ฐํฉ๋๋ค(rpt2๋ ์ ์ ๋ณํฉ์ ์ง์ํ์ง ์์).
๊ทธ๋ฆฌ๊ณ ์, typescript๋ ์ ํ ์ ์๋ฅผ ์ฐพ์ ์์น๋ฅผ ์๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ฝ๊ฐ ์ง์ ๋ถํ ๊ฒ ์ธ์๋ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค. npm์ ์ ํ์ด ์๋ ํจํค์ง๋ฅผ ๋ฐฐํฌํ๋ ค๋ฉด "types"
์ package.json
๋ฅผ ์ง์
์ ์ ๋ํ d.ts ํ์ผ๋ก ์ค์ ํฉ๋๋ค. Typescript๋ ๊ฑฐ๊ธฐ์์ ๋ฌผ๊ฑด์ ์ฐพ์ ๊ฒ์
๋๋ค.
์, ๊ทธ๋์ ์ด ํ๋ฌ๊ทธ์ธ์ ์ค์ ๋ก ์ ์ธ ๋น๋ ํ๋ก์ธ์ค์ ์ด๋ค ๋ถ๋ถ๋ ๊ด๋ฆฌํ์ง ์์ต๋๋ค. Rollup์ ํ๋ก์ธ์ค์ ๋ฌด๊ดํ๊ฒ tsc
๋ฅผ ์คํํ์ฌ ์ ๊ธฐ๋ฅ์ ์ํํฉ๋๊น?
๊ทธ๋๋ ๋ช ๊ฐ์ ๋ชจ๋๋ง ๋
ธ์ถ/๊ฒ์ํ๋ ๊ฒฝ์ฐ TypeScript๊ฐ ๋ง๋๋ ๋ชจ๋ ๋จ์ผ ts ํ์ผ์ ๋ํด *.d.ts
ํ์ผ์ ์์ฑํ๊ธฐ๋ฅผ ์ํ๋ ์ด์ ๋ ๋ฌด์์
๋๊น? ์ง์
์ ์ผ๋ก๋ง ์ ํํ ์ ์๋ ๋ฐฉ๋ฒ์ ์๋์?
๋ฌธ์ ๋ ๋
๋ฆฝ ์คํํ ๋ชจ๋ ์ธํธ( import tool1 from 'myTools/tool1';
๋ฑ)๋ฅผ ๋ด๋ณด๋ด๊ณ ์์ผ๋ฏ๋ก pkg.types
์์ ์ฌ์ฉํ ๋จ์ผ ์ง์
์ ์ด ์์ต๋๋ค. ๊ฐ ์ ์ ํ์ผ์ VSCode๊ฐ ์ ํํ๋๋ก *.js
๋์ ํ์ผ ์์ ์์ด์ผ ํฉ๋๋ค.
๋ ๋์ ๊ฒ์, ๋ด๊ฐ ๊ฐ์ง๊ณ ์๋ค๋ฉด
{
...
input: {
fooscript: 'src/foo/index.ts',
barscript: 'src/bar/index.ts'
},
output: {
dir: 'dist',
format: 'cjs',
sourcemap: true,
}
}
๋๋ ์ป๋ค:
dist/
foo/
index.d.ts
bar/
index.d.ts
fooscript.js
fooscript.js.map
barscript.js
barscript.js.map
์ด์ TypeScript๊ฐ dist/fooscript.js
์ dist/foo/index.d.ts
๋ฅผ ์์ผ๋ก ๋ง๋ค ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
...
ํ๋ฌ๊ทธ์ธ์ด ๊ฐ JavaScript ๋ฒ๋ค ํ์ผ์ ๋ํ TypeScript ๋์/์ถ๋ ฅ ๊ฒฝ๋ก๋ฅผ ์ ๊ณตํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? tsc๊ฐ ์๋ ํญ๋ชฉ ํ์ผ ์ด๋ฆ์ ์์ ํ๊ณ ์ ์ธ์ ์์ฑํ ๋ ์ด๋ฅผ ๊ฝ ์ก๊ณ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
...๋๋ ๊ฐ ์
๋ ฅ ํ์ผ์ ๋ํด ํด๋น *.d.ts
ํ์ผ์ ์ฐพ์ ์ด๋+์ด๋ฆ์ ์
๋ ฅ ํ์ผ ๋งต ๋์์ผ๋ก ๋ฐ๊ฟ๋๋ค. (๋น์ ์ ๋ด๊ฐ ์ฌ๊ธฐ์์ ๋ด ์๋ฉ์ด๋ฅผ ๋งํ๊ณ ์๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ๊ทธ๋์ ... ;-)
์ด๊ฒ์ Rollup์ด ์๋ฃ๋ ํ์ ์๋์ผ๋ก ์๋ํด์ผ ํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ํ๋ฌ๊ทธ์ธ์ด ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ค๋ฉด ํจ์ฌ ๋ ์ข์ ๊ฒ์ ๋๋ค.
์๋์, ํ๋ฌ๊ทธ์ธ์ LanguageServices(๋์ผํ typescript API IDE์์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ)๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ์์ฑํ ๋ด์ฉ๊ณผ ์์น๋ฅผ ์ ์ดํ ์ ์์ต๋๋ค.
๋กค์ ์ ๋ ฅ๋น ํ๋์ ์ ํ ์ ์๋ฅผ ์์ฑํ๋ ค๋ฉด ํด๋น ์ ๋ ฅ์ ๋ํ ๋ชจ๋ ๊ฐ์ ธ์ค๊ธฐ์ ๋ํ ์ ์๋ฅผ ๋ณํฉํด์ผ ํฉ๋๋ค. ๋กค์ ์ ํ๋์ ์ ๋ ฅ ts ํ์ผ์ ๋ณผ ์ ์์ง๋ง ๋น๋ํ ๋ ์ํ๋ ์์ ์์ค ํ์ผ์ ๊ฐ์ ธ์ ๋ฒ๋ค๋งํ ์ ์์ผ๋ฉฐ ์ด๋ฌํ ์ ํ๋ ์์ฑ๋์ด์ผ ํฉ๋๋ค.
ํ์ฌ ์ ๋ tsconfig ํ์ผ์ ๋ณผ ๋ typescript๊ฐ ์ฐพ๋ ๋ชจ๋ ๊ฒ์ ๋ํ ์ ์๋ฅผ ์์ฑํ๋ ๋ฐ ์ค๋ฅ๊ฐ ์์ต๋๋ค. ๋ณํ๋ ๋ชจ๋์ ๋ํด์๋ง ์ ํ์ ์์ฑํ๋ ๊ฒฝ์ฐ ์ ํ๋ง ํ์ผ์ ๋ฌด์๋ฉ๋๋ค.
๊ทธ ๋ถ๋ถ์ ๋ค์ ๋ฐฉ๋ฌธํด์ผ ํ ์ง๋ ๋ชจ๋ฆ ๋๋ค. ๊ทธ ๋ถ๋ถ์ด ์๋ฃ๋๊ณ ๋์ API๊ฐ ์๋นํ ๋ณ๊ฒฝ๋์์ต๋๋ค ...
๋๋ ๋น์ ์ ์๋ฅผ ์๋์ํค๋ ๋ฐฉ๋ฒ์ ๋ด์ผ ํ ๊ฒ์ ๋๋ค. ํ๋์ ๋กค์ ๊ตฌ์ฑ์์ ์ฌ๋ฌ ๋ฒ๋ค์ ๋ํ ๋ ๋์ ์ง์์ด ํ์ํ ์ ์์ต๋๋ค.
ํจํค์ง๋ฅผ ๋น๋ํ ํ ์ด๋ป๊ฒ ์๋นํฉ๋๊น? npm์ ๊ฒ์ํ๊ณ ํจํค์ง ์ด๋ฆ์ผ๋ก ๊ฐ์ ธ์ฌ ์์๋ ๊ฒ์ด ์๋๋๋ค ...
๋ ๋ฆฝ ์คํํ ์ ํธ๋ฆฌํฐ ๋ชจ์์ ๋ง๋ค๊ณ ์์ต๋๋ค. ๊ฒ์/์ค์น๋ ํจํค์ง์ ๋ฃจํธ ํด๋์๋ ๋ชจ๋ ๋น๋๋ ๋ชจ๋ ํ์ผ์ด ํ๋ซ ๋ชฉ๋ก์ ํฌํจ๋์ด ์์ต๋๋ค.
(๋๋ ํ ์คํธ ํ์ผ์ด ํผํฉ๋ ์ค์ฒฉ๋ ํด๋ ๊ตฌ์กฐ์ TS/ES6์ ์์ฑํ๊ณ ์์ผ๋ฉฐ, ๋กค์ ์ ์ฌ์ฉํ์ฌ ์ฝ๋ ๋ถํ ๋ฐ ์ธ๋ผ์ธ์ ํจ์จ์ ์ผ๋ก ํผํฉํ์ฌ ํ๋ซ CJS ํ์ผ ๋ชฉ๋ก์ผ๋ก ๋ณํํฉ๋๋ค. ๊ณต์ ์ฝ๋์ ๋๋ค.)
๊ทธ๋ฐ ๋ค์ ๋ค์๊ณผ ๊ฐ์ด ํ์ผ ์ด๋ฆ์ผ๋ก ๋๊ตฌ๋ฅผ ๊ฐ์ ธ์์ ์ฌ์ฉํฉ๋๋ค.
import tool1 from 'myTools/tool1';
import tool2 from 'myTools/tool2';
์์ด๋์ด๋ ์ ์ฒด ํดํท์ ๋ํ ๋จ์ผ ์ง์
์ ์ ๊ฐ์ง ์์์ผ๋ก์จ( pkg.main
๋๋ pkg.module
ํญ๋ชฉ ์์) ๊ฑฐ์ ์ฌ์ฉ๋์ง ์๊ณ ์คํ์ ์ธ ๋๊ตฌ๋ฅผ ์ถ๊ฐํ๋ ๋ฐ ์ ๊ฒฝ ์ฐ์ง ์์ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ๋ค์ด์คํธ๋ฆผ ์๋น์๋ฅผ ์ํ ๋ฌด๊ฒ/ํฝ์ฐฝ์ ์ถ๊ฐํ์ง ์๊ณ (ํจ์จ์ ์ธ ํธ๋ฆฌ ํ๋ค๊ธฐ๊ฐ ์์ ์ ์์).
...์ง๊ธ์ ๋ช
๋ น์ค์์ tsc
๋ฅผ ์ฌ์ฉํด ์์ผ๋ฉฐ ์ด์ ์ฌ๋ฌ๋ถ์ด ๋ค๋ฃจ๊ณ ์๋ ํ๊ณ๋ฅผ ์ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ฌ๋ tsc๋ฅผ ์คํํ๊ณ ๋ชจ๋/์ถ๋ ฅ ํ์์ "amd"
๋๋ "system"
๋ก ์ค์ ํ๋ฉด ๋ชจ๋ ํญ๋ชฉ์ ๊น๋ํ ๋ชฉ๋ก์ด ํฌํจ๋ ๋จ์ผ *.d.ts
ํ์ผ์ด ์์ฑ๋ฉ๋๋ค. ํ์ํ declare module "..."
๋ธ๋ก์ด ์ธ๋ผ์ธ๋์์ต๋๋ค.
์ด ๋์์ด ํ์ผ ์ด๋ฆ ๋ฐ๊พธ๊ธฐ/์ด๋ ๋ฐ ๋ง์ง๋ง (์ฃผ) ๋ชจ๋ ์ ์ธ์ ๋ํ ํด์ /๋ค์ ์ฐ๊ธฐ๋ฅผ ํตํด ์ด๋ป๊ฒ๋ ์ ์ฉ๋ ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค.
์ฐธ๊ณ ์ฌํญ: tsc
๋ ํด๋น ์ ์ธ ํ์ผ์ ํธ๋ฆฌ ํ๋ค๊ธฐ ์ํด ๋ง์ ๋
ธ๋ ฅ์ ๊ธฐ์ธ์ด์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๋ค ๊ฒฝ์ฐ์๋ ๋งค์ฐ ๊ฐ๋จํ ๋จ์ผ ํจ์ ์๋ช
์ ๋ด๋ณด๋ด๋ ๊ธฐ๋ณธ(์ง์
์ ) ๋ชจ๋์ ๋ณผ ์ ์์ง๋ง ์ ์ธ ํ์ผ์ "๋ค์์" ์ฌ์ฉ๋๋ ๋ชจ๋ ๊ฐ์ธ ๋ชจ๋์ ๋ํ ์ ์ธ ๋ธ๋ก์ ๋
ธ์ถํฉ๋๋ค. ์ฌ๋ฏธ์๋. :-)
๋ค์ ์๋
.
์ง๊ธ์ tsc
์ ๋ํ ์ฌ์ฉ์ ์ ์ declarationDir
๋ฅผ ์ค์ ํ์ฌ ๋ชจ๋ *.d.ts
๋ฅผ ๋คํํ ๋ค์ ๋์ผํ ํญ๋ชฉ ํ์ผ์ ๊ฐ์ ธ์ค๋ ๋
๋ฆฝ ์คํํ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํฉ๋๋ค. ๋ด๊ฐ Rollup์ ๊ณต๊ธํ ๋ output-file ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ค์ ์ ์ธ ํ์ผ์ ๋จ์ํ export * from
ํ๋ ๋ฒ๋ค ๋์ ์์ค ์ ์ธ ํ์ผ์ ์์ฑํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์๋ง ํฌํจํ๋ dist/fooscript.d.ts
๋ฅผ ์์ฑํฉ๋๋ค.
export * from './__types/foo/index';
๋ณด๊ธฐ ํํ ๋ ๋ฆฝํ ํดํน์ด์ง๋ง ์์ธก ๊ฐ๋ฅํ ์ฌ๋ฐ๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํฉ๋๋ค.
rollup-plugin-typescript2
์ด ๋น์ทํ ์์
์ ์ํํ ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค.
๊ทธ๋์.
์๋ฅผ ๋ค์ด ๊ด๋ จ๋ ๊ฐ d.ts์ ๋ํด /// <reference types=""/>
๋ฌด๋ฆฌ๊ฐ ์๋ <bundlename>.d.ts
์์ฑ๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์์ด๋์ด๊ฐ ์์ต๋๋ค.
๋จผ์ ๋๋ฌด ๋ง์ ์ ํ ์ ์ธ์ ์์ฑํ๋ ๊ด๋ จ ๋ฒ๊ทธ๋ฅผ ์์ ํ๊ณ ๋ฃจํธ ํ์ผ๊ณผ ์ค์ ๋ก ๊ฐ์ ธ์ค๋ ๋ชจ๋ ๊ฒ์ผ๋ก๋ง ์ ํํด์ผ ํ ์๋ ์์ต๋๋ค.
๋ช ๊ฐ์ง ์๊ฐ:
IMO, ๋ด ํดํน์์ ์ ์ผํ๊ฒ ์ถ์
ํ ๋ถ๋ถ์ ๋กค์
ํ๋ก์ธ์ค์ ๊ตฌ๋ณ๋๋ค๋ ์ฌ์ค์
๋๋ค. ์ค๊ฐ์ *.d.ts
๋ ์ค์ ๋ก Rollup์์ ์์ฑ๋ ๋ฒ๋ค๊ณผ tsc
์ ์ ์ฌ์ด๋ฅผ ์ฐ๊ฒฐํ๋ ๋งค์ฐ ๊น๋ํ๊ณ ๊ด์ฉ์ ์ธ ๋ฐฉ๋ฒ์
๋๋ค.
tsc
-generated ์ ์ธ ํ์ผ์ ์๋ ๊ฒฝ๋ก๋ฅผ ํตํด ์๋ก ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์ ํด๋น ํ์ผ/ํด๋ ๊ตฌ์กฐ๋ ๊ทธ๋๋ก ๋๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ rollup-plugin-typescript2
๊ฐ output.dir + '__types'
์ ๊ฐ์ ๊ฒ์ ๊ธฐ๋ณธ declarationDir
ํ๋ฉด tsc
์ ์ง๋์น ์ด์ฌ์ผ๋ก ์ธํ ํผ๋์ด ๊น๋ํ๊ฒ ์ ๊ฑฐ๋ฉ๋๋ค. ๋ช
ํํ๊ฒ ๋ช
๋ช
๋ ํด๋ ์์ ๊ด๊ฒฝ. ๊ทธ๋ฐ ์์ผ๋ก ๊ด๋ จ ์๋ ์ ์ ํ์ผ์ IMO์์ ๋งค์ฐ ์ฌ์ํ ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค.
FWIW, ์ฌ๊ธฐ ๋ด ์คํฌ๋ฆฝํธ์ ๊ณ ๊ธฐ๊ฐ ์์ต๋๋ค.
const { makeInputMap, getEntrypoints, distFolder, srcFolder } = require('./buildHelpers');
const { writeFileSync } = require('fs');
const { relative } = require('path');
const srcPrefixRe = new RegExp('^' + srcFolder + '/');
const tsExtRe = /\.tsx?$/;
const declDirRelative = './' + relative(
distFolder,
require('../tsconfig.json').compilerOptions.declarationDir
);
const tsEntrypoints = getEntrypoints()
.filter((fileName) => tsExtRe.test(fileName));
Object.entries(makeInputMap(tsEntrypoints))
.forEach(([moduleName, sourcePath]) => {
const tscDeclFile = sourcePath
.replace(srcPrefixRe, declDirRelative + '/')
.replace(tsExtRe, '');
const outFile = distFolder + '/' + moduleName + '.d.ts';
writeFileSync(
outFile,
[
'export * from "' + tscDeclFile + '";',
'import x from "' + tscDeclFile + '";',
'export default x;',
'',
].join('\n')
);
});
console.info('Created local declaration files for TypeScripted entrypoints.');
๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ๋ช ์์ ์ผ๋ก ๋ค์ ๋ด๋ณด๋ด์ผ ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฏ๋ก ์์ ์๋ฅผ ์ ๋ฐ์ดํธํ์ต๋๋ค.
์๋น ํ
์คํธ์ ๋ฐ๋ฅด๋ฉด default
๋ด๋ณด๋ด๊ธฐ๊ฐ ์๋ ์ ์ธ ํ์ผ์์ ๋งน๋ชฉ์ ์ผ๋ก default
๋ฅผ ๋ค์ ๋ด๋ณด๋ด๋ ๊ฒ์ ๋ฌดํดํ๋ฉฐ ์กฐ์ฉํ ๋ฌด์๋ฉ๋๋ค. (์ ์ด๋ VSCode์์๋.)
์๋ ํ์ธ์, ์ด ๋ฌธ์ ๋ v0.23.0์์ ํด๊ฒฐ๋์ด์ผ ํฉ๋๊น?
(...์ฌ์ฉ์ ์ ์ ํจํ์ ๋ชจ๋ ์ญ์ ํ๋ ค๋ฉด ํ๋ก์ ํธ๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ์ ๋ฐ์ดํธํด์ผ ํ๋์ง ๊ถ๊ธํฉ๋๋ค.)
0.23์ ๋ณด์ด๋ ๋ชจ๋ ๊ฒ์ ๋ํ ์ ์ธ์ ์์ฑํ์ง ์์ง๋ง, ์ฌ์ ํ ์๋ ํ์ ํด๋์์ ์ค์ ๋ก ๊ฐ์ ธ์ค๋ ์ ์ธ์ ์์ฑํฉ๋๋ค. ์ ๋ฐ์ดํธํ๊ณ ๋ ๊ฐ๋ฒผ์ด ์ ํ์ ๊ฐ์ง ์ ์์ง๋ง ์์ง ๋ฃจํธ ์ ํ ์ ์ธ์ ์์ฑํ ํญ๋ชฉ์ด ์์ต๋๋ค.
๋ด ์ฌ์ฉ์ ์ง์ ํด๊ฒฐ ๋ฐฉ๋ฒ ๋น๋ ์คํฌ๋ฆฝํธ(์ ์ฐธ์กฐ)๊ฐ ์ ์ ๋ ๋ง์ ํ๋ก์ ํธ์ ์ ์ฉ๋๊ณ ์์ต๋๋ค. ์ค_์ค
์ฐธ๊ณ : ์ดํ ๊ณต์ @rollup/plugin-typescript ํจํค์ง ๊ฐ๋ฐ์ด ์ฌ๊ฐ๋์์ผ๋ฉฐ ์ด์ ์ ํ ๊ฒ์ฌ ๋ฐ ์ ์ธ ํ์ผ ์ถ๋ ฅ ๊ธฐ๋ฅ์ด ์์ผ๋ฏ๋ก ์ด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๊ฐ์ธ์ ์ผ๋ก ์ ํํ๊ณ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ ํ ์ฌํญ์ ๊ฑฐ์ ๋์ผํฉ๋๋ค.
@maranomynet ๋กค์ ์ด ์๋ํ ํ ์ ์ธ ํ์ผ์ ์ด๋ํ๊ธฐ ์ํด ์ฌ์ ํ ์คํฌ๋ฆฝํธ์ ์์กดํฉ๋๊น? ๋๋ ๋ ์์ ์ ๋ฐ๊พธ๋ ์ด์ด ๋ณ๋ก ์์๋ค.
์. tsc
๊ฐ ์ข
๋จ ๊ฐ ๋ฒ๋ค๋ง์ ์ํํ์ง ์๋ ํ ์ด๊ฒ์ด ์ ์ผํ ๋ฐฉ๋ฒ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
์ด๋ฌํ ๋กค์
ํ๋ฌ๊ทธ์ธ์ tsc์ ๋ ๊ฐ์ง ๋ค๋ฅธ ์์
์ ์ํํ๋๋ก ํจ๊ณผ์ ์ผ๋ก ์์ฒญํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
1๊ณผ 2์ ๊ฒฐ๊ณผ๋ ์ผ์นํ์ง ์์ผ๋ฉฐ "์ ๋ ฅ ๋งต" ๋ฐ ์ฝ๋ ๋ถํ ๋ฑ์ ์ฌ์ฉํ ๋ ์ผ์นํ ์ ์์ต๋๋ค. โ AFAICT.
...๋กค์ ํ๋ฌ๊ทธ์ธ์ ์ ํ ์ ์ธ ์์ฑ ํ๋ก์ธ์ค์ ํจ์ฌ ๋ ๋ง์ด ํฌํจ์ํค์ง ์๋ ํ.
์ ๊ทธ๋ ๊ตฐ์ ์ ๊ฐ ์๊ฐํ๊ฒ ๋ง๋ค์ ๊ฐ์ฌํฉ๋๋ค! ๋์์ด ๋๋ ๋ต๋ณ์ ๐๋ฅผ ์ฃผ์ จ๊ณ ๐๋ ์ ๊ฐ ๋๋ ์ ์ ๋๋ค.
์ด๊ฒ์ ํ์ด์ด ์์ต๋๊น?
@maranomynet ๊ณผ ์ ์ ๊ฐ์ src ํด๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ๊ณ ๊ตฐ๋ถํฌํ๋ ์ํผ์ ์ํด.
๋๋ ๊ทธ๊ฒ์ ๋ํ ๋น ๋ฅธ ์์ ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ๋ ๋ค๋ฅธ ์ถ์ ํ ๋ฐฉ๋ฒ ์ผ ์ ์์ง๋ง ์ ์๊ฒ ํจ๊ณผ์ ์ ๋๋ค.
rollup-plugin/typescript2๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฏ๋ก ์ด ๋ต๋ณ์์ ํด๋น ๊ตฌ์ฑ์ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
ํ๋ก์ ํธ๊ฐ ๋ฒ๋ค๋ dist์ ์์ฒด ๊ฒฝ๋ก์ ์๋ ๋ชจ๋ *.d.ts ํ์ผ์ ๋คํํ ์ ์๋๋ก tsconfig.json์ ์์ ์ DeclarationDir์ ์ ์ํ์ญ์์ค. ๊ทธ๋ฆฌ๊ณ ๋กค์
๊ตฌ์ฑ ํ์ผ์ typescript ํ๋ฌ๊ทธ์ธ์์ useTsConfigDeclarationDir์ true๋ก ์ค์ ํด์ผ ํฉ๋๋ค.
๋ํ rollup.config.js(๋ฐ package.json)์์ ๊ฐ๋ณ ๊ตฌ์ฑ ์์ ๋ฒ๋ค์ ๋ํ ์ถ๋ ฅ ๊ฒฝ๋ก๋ฅผ ์ ์ํ๋ ๊ฒฝ์ฐ ํด๋น ๊ฒฝ๋ก๋ฅผ 'declarationDir' + 'src ๊ตฌ์ฑ ์์ ๊ฒฝ๋ก'์ ๋์ผํ๊ฒ ๋ณ๊ฒฝํ์ธ์. ๋ฐ๋ผ์ src์ ๊ตฌ์ฑ ์์๊ฐ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ:
src/ํํ์ด์ง/foo.tsx
๊ทธ๋ฆฌ๊ณ ๊ทํ์ DeclarationDir์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
dist/MyDeclarationDir
๋ฐ๋ผ์ ์ถ๋ ฅ ๊ฒฝ๋ก๋ ๋ค์๊ณผ ๊ฐ์์ผ ํฉ๋๋ค.
dist/MyDeclarationDir/homepage/foo.js
์ด๋ ๊ฒ ํ๋ฉด ๋กค์ ์ ๊ตฌ์ฑ ์์ main.js์ ๋์ผํ ๋๋ ํฐ๋ฆฌ์ ์ ํ์ ํฌํจํ๊ณ TS ์๋น์ ํ๋ก์ ํธ๋ ์ ๋ ฅ์ ์ ํํฉ๋๋ค.
๋ฐ๋ผ์ ๋ฒ๋ค์ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ผ ๊ฒ์ ๋๋ค.
๊ฑฐ๋ฆฌ/
declarationDirPath/
component1/
foo.js/
foo.js
foo.map.js
foo.d.ts
component2/
bar.js/
bar.js
bar.map.js
bar.d.ts
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์.
tsc
๊ฐ ์ข ๋จ ๊ฐ ๋ฒ๋ค๋ง์ ์ํํ์ง ์๋ ํ ์ด๊ฒ์ด ์ ์ผํ ๋ฐฉ๋ฒ์ธ ๊ฒ ๊ฐ์ต๋๋ค.์ด๋ฌํ ๋กค์ ํ๋ฌ๊ทธ์ธ์ tsc์ ๋ ๊ฐ์ง ๋ค๋ฅธ ์์ ์ ์ํํ๋๋ก ํจ๊ณผ์ ์ผ๋ก ์์ฒญํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
1๊ณผ 2์ ๊ฒฐ๊ณผ๋ ์ผ์นํ์ง ์์ผ๋ฉฐ "์ ๋ ฅ ๋งต" ๋ฐ ์ฝ๋ ๋ถํ ๋ฑ์ ์ฌ์ฉํ ๋ ์ผ์นํ ์ ์์ต๋๋ค. โ AFAICT.
...๋กค์ ํ๋ฌ๊ทธ์ธ์ ์ ํ ์ ์ธ ์์ฑ ํ๋ก์ธ์ค์ ํจ์ฌ ๋ ๋ง์ด ํฌํจ์ํค์ง ์๋ ํ.