TypeScriptμ RollupμΌλ‘ ν΄κ²°νλ ν¨ν€μ§ λΉλ λ¬Έμ
- #Typescript
- #Rollup
- #Bundler
- #JavaScript
λ€μ΄κ°λ©°
μλ νμΈμ. λ Έλ¨Έμ€μμ λ°±μλ κ°λ°μ νκ³ μλ μ§μΉλ³΄μ λλ€.
μ ν¬ νμ TypeScriptλ₯Ό μ£Ό μΈμ΄λ‘ μ¬μ©νκ³ μμΌλ©°, νλ‘μ νΈμ ꡬ쑰λ₯Ό ν¨μ¨μ μΌλ‘ κ΄λ¦¬νκΈ° μν΄ λͺ¨λ Έλ ν¬λ₯Ό νμ©νκ³ μμ΅λλ€. λν, λ°±μλμ νλ‘ νΈμλ κ° λ°μ΄ν° ꡬ쑰λ₯Ό 곡μ νκΈ° μν΄ API DTO(Data Transfer Object) λ₯Ό NPM ν¨ν€μ§ ννλ‘ κ΄λ¦¬νκ³ μμ΅λλ€. μ΄ κ³Όμ μμ λ°μν λ¬Έμ μ μ ν΄κ²°νκΈ° μν΄ Rollupμ λμ νκ² λμκ³ , μ΄λ² κΈμμλ μ ν¬κ° μ΄λ€ κ³Όμ μ κ±°μ³ λ¬Έμ λ₯Ό ν΄κ²°νλμ§ κ³΅μ νκ³ μ ν©λλ€.
λ¬Έμ μν©κ³Ό ν΄κ²° λ°©μ
λ¬Έμ μν© λ°μ
μ ν¬λ packages
μν¬μ€νμ΄μ€μμ λ°±μλμ νλ‘ νΈμλκ° κ³΅μ νλ νμ
κ³Ό μ νΈλ¦¬ν° ν¨μλ€μ κ΄λ¦¬νκ³ μμμ΅λλ€. λ°±μλμμλ μ΄λ¬ν νμ
λ€μ μ νΈλ¦¬ν°λ₯Ό ν΅ν΄ μ μ°νκ² μ‘°μνμ¬ μ¬μ©νκ³ μμκ³ , μ΄λ μμ°μ€λ½κ² DTOμλ μ μ©λμμ΅λλ€.
νμ§λ§ μ€μ νλ‘μ νΈλ₯Ό μ΄μνλ©΄μ μμμΉ λͺ»ν λ¬Έμ κ° λ°μνμ΅λλ€. λ°±μλμμ packages
μν¬μ€νμ΄μ€μ νμ
μ νμ©ν΄ λ€μκ³Ό κ°μ΄ DTOλ₯Ό μμ±νμ λμμ΅λλ€:
// λ°±μλμ DTO μ½λ
import { PostType } from '@packages/types';
// @packages/types μ μ μλ enum
enum PostType {
LiveRecord = 'live_record',
Video = 'video',
...
}
export class SomeDto {
...
type: Exclude<PostType, PostType.LiveRecord>; // PostTypeμμ LiveRecordλ₯Ό μ μΈ
}
μ΄ DTOλ₯Ό npm ν¨ν€μ§λ‘ λΉλνμ¬ νλ‘ νΈμλμ μ 곡νμ λ, κ²μΌλ‘ 보기μλ λμΌν μ½λκ° μμ±λμμ΅λλ€:
// νλ‘ νΈμλμ μ€μΉλ ν¨ν€μ§μ μ½λ
import { PostType } from '@packages/types';
export class SomeDto {
...
type: Exclude<PostType, PostType.LiveRecord>;
}
νμ§λ§ νλ‘ νΈμλμμλ μ΄ ν¨ν€μ§λ₯Ό μ¬μ©ν λλ§λ€ νμ μλ¬κ° λ°μνμ΅λλ€. λΉμ λΉλ νλ‘μΈμ€λ λ€μκ³Ό κ°μμ΅λλ€:
nest build && tsc-alias
μ΄ λΉλ κ³Όμ μ κ±°μΉλ©΄ λ€μκ³Ό κ°μ κ²°κ³Όλ¬Όμ΄ μμ±λμμ΅λλ€:
import { PostType } from '@packages/types';
export class SomeDto {
id: string;
age: number;
name: string;
type: PostType;
}
λ¬Έμ λ₯Ό μμΈν λΆμν΄λ³΄λ, λ κ°μ§ ν΅μ¬μ μΈ μ΄μκ° μμμ΅λλ€. 첫째λ‘, λΉλλ ν¨ν€μ§μ λ°±μλμ κ³΅μ© νμ
μ μκ° ν¨κ» ν¬ν¨λμ§ μμμ΅λλ€. μ΄λ‘ μΈν΄ νλ‘ νΈμλμμλ @packages/types
μ PostType
enumμ μ°Ύμ μ μμκ³ , type
νλλ μ€μ§μ μΌλ‘ any
νμ
μ²λΌ λμνμ΅λλ€.
λμ§Έλ‘, λ μ¬κ°ν λ¬Έμ λ νμ
μ‘°μκ³Ό κ΄λ ¨μ΄ μμμ΅λλ€. νλ‘ νΈμλμ μ‘΄μ¬νμ§ μλ PostType
enumμ Exclude
λ‘ μ‘°μνλ € μλνλ€ λ³΄λ, TypeScriptλ μ΄λ₯Ό never
νμ
μΌλ‘ μΆλ‘ νμ΅λλ€. κ²°κ³Όμ μΌλ‘ νλ‘ νΈμλμμλ type
νλμ μ΄λ€ κ°λ ν λΉν μ μλ μν©μ΄ λ°μνμ΅λλ€.
λ¬Έμ μ 보 μ¬λ
μ΄λ¬ν νμ λΆμΌμΉ λ¬Έμ λ κ·Έλμ λ¨μν νμ λ§ μ¬μ©ν λλ λ°κ²¬λμ§ μλ€κ°, νμ μ νΈλ¦¬ν°λ₯Ό νμ©νλ©΄μ λΉλ‘μ λλ¬λκ² λμμ΅λλ€.
ν΄κ²°λ°©μ λͺ¨μ
packages
μν¬μ€νμ΄μ€λ Publish νμ¬ νλ‘ νΈμλμμ μ¬μ©- Swagger μ¬μ©
- DTOμμ μ¬μ©νλ λ°±μλ κ³΅μ© νμ μ λΉλ κ²°κ³Όλ¬Όμ ν¬ν¨ (μ ν)
1. packages
μν¬μ€νμ΄μ€λ Publish νμ¬ νλ‘ νΈμλμμ μ¬μ©
μ΄ λ°©λ²μλ λ€μκ³Ό κ°μ λ¬Έμ μ μ΄ μμμ΅λλ€. packages
λ λ°±μλ νμ λͺ¨λκ° μ¬μ©νκ³ μμλ‘ μμ λ μ μκΈ° λλ¬Έμ, λ€μκ³Ό κ°μ μν©μμ λ³κ²½μ¬ν κ° μΆ©λμ΄ λ°μν μ μμ΅λλ€:
- νμ Aκ° ν¨ν€μ§λ₯Ό μμ νκ³ λΉλ ν Publish
- νμ Bκ° ν¨ν€μ§λ₯Ό μμ νκ³ λΉλ ν Publish
μ΄ κ²½μ°, νμ Aμ λ³κ²½μ¬νμ μ¬μ©νλ νλ‘ νΈμλλ νμ Bμ Publishλ‘ μΈν΄ μκΈ°μΉ μκ² λΉλ κ²°κ³Όλ¬Όμ΄ λ³κ²½λ μ μμ΅λλ€.
λν packages
μν¬μ€νμ΄μ€μλ λ°±μλμμλ§ μ¬μ©νλ μ νΈλ¦¬ν° ν¨μλ€λ ν¬ν¨λμ΄ μμ΄, μ΄λ₯Ό νλ‘ νΈμλμ λ
ΈμΆμν€λ κ²μ λ°λμ§νμ§ μμμ΅λλ€.
2. Swagger μ¬μ©
Swaggerλ API λ¬Έμνμ νμ μ μλ₯Ό μλμΌλ‘ μμ±ν΄μ£Όλ μ μ©ν λꡬμ λλ€. νμ§λ§ λ€μκ³Ό κ°μ μ΄μ λ‘ Swaggerλ‘μ μ νμ 보λ₯νμ΅λλ€:
1. κΈ°μ‘΄ μ½λλ² μ΄μ€μ λ³κ²½μ΄ νμ
- κΈ°μ‘΄ μ½λλ² μ΄μ€μ Swagger λ°μ½λ μ΄ν°κ° μ ννκ² μ μ©λμ΄ μμ§ μμμ΅λλ€.
2. νλ‘ νΈμλμμλ Swagger μ€νμ APIλ‘ μ ννλ μμ μ΄ νμνμ΅λλ€.
3. DTOμμ μ¬μ©νλ λ°±μλ κ³΅μ© νμ μ λΉλ κ²°κ³Όλ¬Όμ ν¬ν¨
μ΄ λ°©λ²μ΄ μ ν¬ νμ μν©μ κ°μ₯ μ ν©ν ν΄κ²°μ± μΌλ‘ νλ¨λμμ΅λλ€. μ£Όμ μ₯μ μ λ€μκ³Ό κ°μ΅λλ€:
1. μ΅μνμ μ½λ λ³κ²½
- κΈ°μ‘΄ μ½λλ² μ΄μ€λ₯Ό ν¬κ² μμ ν νμκ° μμ΅λλ€.
- λΉλ μ€μ λ§ λ³κ²½νλ©΄ λλ―λ‘ λ¦¬μ€ν¬κ° μ μ΅λλ€.
2. νμ μμ μ± λ³΄μ₯
- λ°±μλμ μ€μ νμ μ΄ κ·Έλλ‘ νλ‘ νΈμλμ μ λ¬λ©λλ€.
- νμ λΆμΌμΉλ‘ μΈν λ°νμ μλ¬λ₯Ό λ°©μ§ν μ μμ΅λλ€.
3. νμν νμ λ§ μ νμ ν¬ν¨
- DTOμμ μ€μ λ‘ μ¬μ©λλ νμ λ§ λΉλ κ²°κ³Όλ¬Όμ ν¬ν¨λ©λλ€.
- λΆνμν μ½λ λ ΈμΆμ λ°©μ§ν μ μμ΅λλ€.
Rollupκ³Ό rollup-plugin-dts λμ
μ ν¬λ λ€μκ³Ό κ°μ μ΄μ λ‘ Rollupκ³Ό rollup-plugin-dts νλ¬κ·ΈμΈμ λμ νμ΅λλ€:
1. ν¨μ¨μ μΈ Tree-shaking
- Rollupμ ES λͺ¨λμ κΈ°λ°μΌλ‘ μ μ λΆμμ μννμ¬ μ¬μ©λμ§ μλ μ½λλ₯Ό μ κ±°ν©λλ€.
- νΉν νμ μ μμμ μ€μ μ¬μ©λλ νμ λ§ ν¬ν¨νλ―λ‘, λΆνμν νμ μ΄ λ²λ€μ ν¬ν¨λλ κ²μ λ°©μ§ν μ μμ΅λλ€.
2. νμ μ μ νμΌ μ΅μ ν
rollup-plugin-dts
λ₯Ό μ¬μ©νλ©΄ μ¬λ¬ νμ μ μ νμΌλ€μ νλμindex.d.ts
νμΌλ‘ λ²λ€λ§ν μ μμ΅λλ€.- λ€λ₯Έ νμΌμμ μ°Έμ‘°νλ νμ λ€μ λͺ¨λ μΈλΌμΈμΌλ‘ ν¬ν¨μμΌ νλμ νμΌμμ λͺ¨λ νμ μ 보λ₯Ό νμΈν μ μμ΅λλ€.
μμ:
// κΈ°μ‘΄: μ¬λ¬ νμΌμ λΆμ°λ νμ
λ€
// types/user.d.ts
declare interface User { ... }
// types/post.d.ts
declare interface Post { ... }
// λ²λ€λ§ ν: index.d.ts
declare interface User { ... }
declare interface Post { ... }
Rollup μ μ© κ³Όμ
1. ν¨ν€μ§ μ€μΉ
yarn workspace add [workspace_name] rollup rollup-plugin-dts rollup-plugin-typescript-paths
κ° ν¨ν€μ§μ μν :
rollup
: JavaScript λͺ¨λ λ²λ€λ¬rollup-plugin-dts
: νμ μ μ νμΌ(.d.ts)μ νλλ‘ λ²λ€λ§rollup-plugin-typescript-paths
: TypeScript κ²½λ‘ λ³μΉ(path alias) μ²λ¦¬
2. Rollup μ€μ νμΌ μμ±
μν¬μ€νμ΄μ€ 루νΈμ rollup.config.js
νμΌμ μμ±ν©λλ€:
const path = require('path');
const { dts } = require('rollup-plugin-dts');
const { typescriptPaths } = require('rollup-plugin-typescript-paths');
module.exports = {
input: 'index.ts', // TypeScriptλ‘ μ»΄νμΌλ d.ts νμΌλ€μ μ§μ
μ
output: {
file: 'publish/dist/index.d.ts', // μ΅μ’
λ²λ€λ§λ νμ
μ μΈ νμΌ κ²½λ‘
format: 'es' // ES Module νμμΌλ‘ λ²λ€λ§
},
plugins: [
typescriptPaths({ preserveExtensions: true }), // TypeScript paths λ³μΉ ν΄μ
dts({
respectExternal: true, // μΈλΆ ν¨ν€μ§μ νμ
μ μΈμ μ μ§
compilerOptions: {
baseUrl: path.resolve(__dirname) // TypeScript μ€μ μ baseUrlκ³Ό λμΌνκ² μ€μ
}
})
]
};
3. λΉλ λͺ λ Ήμ΄
"scripts": {
"build": "rollup -c rollup.config.js"
}
4. λΉλ κ²°κ³Όλ¬Ό νμΈ
publish/dist/index.d.ts
νμΌμ νμΈν΄λ³΄λ©΄ λͺ¨λ νμ
μ΄ νλμ νμΌλ‘ λ²λ€λ§λμ΄ μμμ νμΈν μ μμ΅λλ€.
// λ²λ€λ§ κ²°κ³Όλ¬Ό
declare enum PostType {
LiveRecord = 'live_record',
Video = 'video',
...
}
declare class SomeDto {
...
type: Exclude<PostType, PostType.LiveRecord>;
}
μ΄μ²λΌ Rollupμ ν΅ν΄ λΉλλ κ²°κ³Όλ¬Όμλ PostType
enumμ΄ ν¨κ» ν¬ν¨λμ΄, νλ‘ νΈμλμμλ νμ
μ νΈλ¦¬ν°λ₯Ό νμ©ν νμ
μ‘°μμ΄ κ°λ₯ν΄μ‘μ΅λλ€.
λ¬Έμ ν΄κ²° μ¬λ
κ²°λ‘
Rollupκ³Ό rollup-plugin-dtsλ₯Ό λμ νλ©΄μ μ°λ¦¬κ° κ²ͺμλ νμ κ΄λ ¨ λ¬Έμ λ€μ ν΄κ²°ν μ μμμ΅λλ€. ꡬ체μ μΌλ‘ λ€μκ³Ό κ°μ λΆλΆλ€μ΄ κ°μ λμμ΅λλ€:
1. νμ μ μ λ¬Έμ ν΄κ²°
- λ°±μλμ νμ μ΄ νλ‘ νΈμλ ν¨ν€μ§μ μ¬λ°λ₯΄κ² ν¬ν¨λ¨
- νμ μ νΈλ¦¬ν°(Exclude, Pick λ±)λ₯Ό μ¬μ©ν΄λ μμν λλ‘ λμ
- νλ‘ νΈμλμμ νμ μλ¬κ° μ ννκ² νμλ¨
2. κ°λ° μμ°μ± ν₯μ
- IDEμμ νμ κΈ°λ° μλμμ± μ§μ
- μ»΄νμΌ νμμ νμ μ€λ₯ κ°μ§
- λͺ νν νμ μ λ³΄λ‘ μΈν λλ²κΉ μ©μ΄μ± μ¦κ°
μ΄λ¬ν κ°μ μ ν΅ν΄ λ°±μλμ νλ‘ νΈμλ μ¬μ΄μ νμ 곡μ κ° λμ± μμ μ μΌλ‘ μ΄λ£¨μ΄μ§κ² λμμ΅λλ€. νΉν νμ μ€ν¬λ¦½νΈμ νμ μ‘°μ κΈ°λ₯λ€μ μλν λλ‘ μ¬μ©ν μ μκ² λ μ μ΄ κ°μ₯ ν° μ΄μ μ΄μμ΅λλ€.
μ½μ΄μ£Όμ μ κ°μ¬ν©λλ€.