typescript-memo

Rollup 2021

초판: 2021-10-23
수정: 2021-10-29 sourcemap 옵션 관련 수정.

https://rollupjs.org

들어가는 글

TypeScript 코드들을 브라우저에서 실행하려면 컴파일하고 파일 하나로 묶어야 합니다. Rollup 은 이 작업을 해주는 툴입니다.

Rollup 은 WebPack 보다 설정이 간단합니다.

Node.js 설정

왠만하면 Node.js 설정을 CommonJS 방식으로 놔두는 것을 추천합니다. 2021년 기준, Node.js 기본 설정을 ESM 으로 바꾸면 여러가지 문제가 발생합니다.

Rollup Config

Rollup 환경 설정 파일 rollup.config.js 는 보통 프로젝트 루트에 둡니다. 파일 이름은 사용자 지정이 가능합니다.

모양은 대강 이렇습니다.

//import nodeResolve from '@rollup/plugin-node-resolve';
import typescript from '@rollup/plugin-typescript'
import { defineConfig } from 'rollup'

export default defineConfig({
  input: 'src/client/ts/_all.ts',
  output: {
    file: 'public/build/client-rollup.js',
    sourcemap: true,
    format: 'iife',
    name: 'app',
  },
  watch: {
    include: [
      "src/client/ts/**/*"
    ]
  },
  plugins: [
    typescript({
      tsconfig: "src/client/tsconfig.json",
    }),
    //nodeResolve(),
  ]
})

Input File

번들링의 입구가 되는 최초의 파일을 지정해야 합니다. 이 파일만 지정하면 여기서 임포트하는 모든 파일을 Rollup 이 자동으로 묶어줍니다. 제 설정에선 아래 파일이 되겠습니다.

input: 'src/client/ts/_all.ts',

Output File

출력 파일을 지정합니다. 연관된 JS 파일들이 하나로 묶여서 떨어집니다.

output: {
  file: 'public/build/client-rollup.js',
  sourcemap: true,
  format: 'iife',
  name: 'app',
},

파일 포멧은 익숙하게 보던 CommonJS 나 ESM 이 아닙니다. 이런 형식의 파일은 브라우저에서 막 쓰기에 난감합니다. 브라우저에서 쓸 코드는 iife 형식으로 묶으시면 됩니다.

sourcemap 을 출력하려면 TypeScript 설정과는 별도로 Rollup 에서도 sourcemap 옵션을 줘야합니다.

nameexport 한 펑션에 접근하기 위한 임의의 오브젝트 이름입니다. 예로 TypeScript 코드에서 아래처럼 펑션을 export 했다면,

export function helloWorld() { ... }

HTML 페이지에서 아래와 같이 불러 쓸 수 있습니다.

<script>
    app.helloWorld()
</script>

TypeScript

TypeScript 도 지원합니다. 플러그인 설정을 해두면 Rollup 이 알아서 컴파일하고 번들링합니다.

import typescript from '@rollup/plugin-typescript'
...

plugins: [
  typescript({
    tsconfig: "src/client/tsconfig.json",
  })
]

NPM Modules

브라우저에서 사용할 코드인데 npm 모듈로 배포되는 경우가 많습니다. 이런 코드도 같이 묶을 수 있습니다.

일반적인 npm 모듈처럼 설치하고,

$ npm install ...

일반 Node.js 모듈 쓰는 것 처럼 임포트 한 다음,

import ... from '...'

Rollup 하면 내 코드와 npm 패키지 코드가 같이 묶입니다.

단 npm 코드를 길어 올리는 플러그인 설정을 해야합니다.

import nodeResolve from '@rollup/plugin-node-resolve';
...

plugins: [
  nodeResolve(),
]

Rollup

위에 정도 설정하고 Rollup 하면 출력 파일이 떨어집니다.

$ npx rollup -c

watch 모드로 돌리려면,

$ npx rollup -c -w

출력 파일은 HTML 페이지에 적당히 링크합니다.

<script src="/build/client-rollup.js?v=1.0.0"></script>