Rollup-plugin-typescript2: '์ž…๋ ฅ' ๋กค์—…์œผ๋กœ ๊ฐœ์ฒด ๋‚ด์˜ ์ž˜๋ชป๋œ ํด๋”์— ์ƒ์„ฑ๋œ ์ž…๋ ฅ ํŒŒ์ผ

์— ๋งŒ๋“  2019๋…„ 02์›” 05์ผ  ยท  33์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: ezolenko/rollup-plugin-typescript2

๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์™œ ๊ทธ๊ฒƒ์ด ์ž˜๋ชป๋œ ๊ฒƒ์ธ๊ฐ€

์•„๋งˆ๋„ ์ด๊ฒƒ์€ ๋‚ด ์ชฝ์—์„œ ์ž˜๋ชป๋œ ๊ตฌ์„ฑ์ด์ง€๋งŒ ๋ฒ„๊ทธ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. object ๋ฅผ ๋กค์—… ๊ตฌ์„ฑ์˜ input ์†์„ฑ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์ž…๋ ฅ ํŒŒ์ผ์— ๋Œ€ํ•œ ํƒ€์ดํ•‘ ํŒŒ์ผ์ด ์ €์žฅ์†Œ์˜ ๋ฃจํŠธ ํด๋”(๋กค์—… ๊ตฌ์„ฑ ํŒŒ์ผ๊ณผ ๋™์ผํ•œ ํด๋”)์— ์ƒ์„ฑ๋˜๊ณ  ๋ฒˆ๋“ค๋œ JS ํŒŒ์ผ๊ณผ ํ•จ๊ป˜ ๋Œ€์ƒ ์ถœ๋ ฅ ๋””๋ ‰ํ† ๋ฆฌ(์—ฌ๊ธฐ์„œ๋Š” ./dist )๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋ฒ„์ „

  • ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ: 3.2.4
  • ๋กค์—…: 1.1.2
  • ๋กค์—… ํ”Œ๋Ÿฌ๊ทธ์ธ typescript2: 0.19.2

๋กค์—….config.js

{
    ...
    input: {
        Lib1: './src/Lib1.tsx',
        Lib2: './src/Lib2.tsx'
    },
    output: {
        dir: './dist',
        format: 'cjs',
        sourcemap: true,
        entryFileNames: '[name].js'
    }
}

tsconfig.json

{
  ...
  "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 ๋ผ๋Š” ๋ถˆํ•„์š”ํ•œ ํ•˜์œ„ ํด๋”๊ฐ€ ์ƒ์„ฑ๋˜์–ด ๊ฑฐ๊ธฐ์— ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

bug more info needed

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

์˜ˆ. tsc ๊ฐ€ ์ข…๋‹จ ๊ฐ„ ๋ฒˆ๋“ค๋ง์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ํ•œ ์ด๊ฒƒ์ด ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ๋กค์—… ํ”Œ๋Ÿฌ๊ทธ์ธ์€ tsc์— ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํšจ๊ณผ์ ์œผ๋กœ ์š”์ฒญํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. "์ด๋Ÿฌํ•œ ๋ชจ๋“  ๊ฐœ๋ณ„ ๋ชจ๋“ˆ์„ ์œ ํ˜• ํ™•์ธํ•˜๊ณ  JavaScript๋กœ ๋ณ€ํ™˜"ํ•˜๊ณ  ๋‚ด๊ฐ€(์ฆ‰, ๋กค์—…) ๋ฒˆ๋“ค๋ง ๋ฐ ๋””์Šคํฌ ์“ฐ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  2. "์ด TS ํ”„๋กœ์ ํŠธ ํด๋”์— ๋Œ€ํ•œ ๋ชจ๋“  ์„ ์–ธ์„ ๋งŒ๋“ค๊ณ  ๊ฑฐ๊ธฐ์— ๋คํ”„ํ•˜์‹ญ์‹œ์˜ค."

1๊ณผ 2์˜ ๊ฒฐ๊ณผ๋Š” ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ "์ž…๋ ฅ ๋งต" ๋ฐ ์ฝ”๋“œ ๋ถ„ํ•  ๋“ฑ์„ ์‚ฌ์šฉํ•  ๋•Œ ์ผ์น˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. โ€“ AFAICT.

...๋กค์—… ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์œ ํ˜• ์„ ์–ธ ์ƒ์„ฑ ํ”„๋กœ์„ธ์Šค์— ํ›จ์”ฌ ๋” ๋งŽ์ด ํฌํ•จ์‹œํ‚ค์ง€ ์•Š๋Š” ํ•œ.

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

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. "์ด๋Ÿฌํ•œ ๋ชจ๋“  ๊ฐœ๋ณ„ ๋ชจ๋“ˆ์„ ์œ ํ˜• ํ™•์ธํ•˜๊ณ  JavaScript๋กœ ๋ณ€ํ™˜"ํ•˜๊ณ  ๋‚ด๊ฐ€(์ฆ‰, ๋กค์—…) ๋ฒˆ๋“ค๋ง ๋ฐ ๋””์Šคํฌ ์“ฐ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  2. "์ด TS ํ”„๋กœ์ ํŠธ ํด๋”์— ๋Œ€ํ•œ ๋ชจ๋“  ์„ ์–ธ์„ ๋งŒ๋“ค๊ณ  ๊ฑฐ๊ธฐ์— ๋คํ”„ํ•˜์‹ญ์‹œ์˜ค."

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