Rollup.js를 사용하는 이유
- webpack은 ES Module로 Bundle할 수 없다.
- webpack은 일반적으로 commonjs 형태로 번들링을 하게되는데, commonjs로 번들링한 라이브러리를 나중에 다른 프로젝트에서 사용하게 되면 Tree-shaking이 지원되지 않는다.
- webpack은 애플리케이션 제작시 주로 사용하고, rollup은 라이브러리 제작시 사용한다.
Setting
1. rollup 사용에 필요한 package 설치
"devDependencies": {
"@rollup/plugin-alias": "^3.1.1",
"@rollup/plugin-commonjs": "^17.0.0",
"@rollup/plugin-node-resolve": "^11.0.1",
"@svgr/rollup": "^5.5.0",
"@types/classnames": "^2.2.11",
"@types/react": "^17.0.0",
"autoprefixer": "^10.1.0",
"classnames": "^2.2.6",
"postcss": "^8.2.1",
"postcss-import": "^14.0.0",
"rollup": "^2.35.1",
"rollup-plugin-peer-deps-external": "^2.2.4",
"rollup-plugin-postcss": "^4.0.0",
"rollup-plugin-scss": "^2.6.1",
"rollup-plugin-terser": "^7.0.2",
"rollup-plugin-typescript2": "^0.29.0",
"rollup-plugin-url": "^3.0.1",
"typescript": "^4.1.3"
},
- @rollup/plugin-alias: rollup 패키지 번들링 시 별칭을 정의하기 위한 플러그인
- @rollup/plugin-commonjs: CommonJs 모듈을 ES6으로 변환하는 롤업 플러그인
- @rollup/plugin-node-resolve: node_modules에서 써드파티 모듈을 사용하는 용도로 사용
- rollup: rollup 패키지
- rollup-plugin-peer-deps-external: peerDependency로 설치된 라이브러리의 코드가 번들링된 결과에 포함되지 않고, import 구문으로 불러와서 사용할 수 있게 해주는 플러그인
- rollup-plugin-terser: 생성 된 es 번들을 최소화하기위한 롤업 플러그인 후드 아래에서 terser 를 사용합니다.
- rollup-plugin-typescript2: 타입스크립트를 지원
2. peerDependency 설정
// package.json
"peerDependencies": {
"react": ">= 15.3.0"
}
ichi.pro/ko/package-json-ui-jongsogseong-e-daehan-jasehan-seolmyeong-178053833175337
package.json의 종속성에 대한 자세한 설명
npm (노드 패키지 관리자)을 사용하여 JavaScript 프로젝트를 관리하는 경우 package.json에서 종속성을 올바르게 구성하는 것이 중요합니다.
ichi.pro
3. rollup.config.js 설정
import commonjs from "@rollup/plugin-commonjs";
import { terser } from "rollup-plugin-terser";
import resolve from "@rollup/plugin-node-resolve";
import peerDepsExternal from "rollup-plugin-peer-deps-external";
import typescript from "rollup-plugin-typescript2";
import packageJson from "./package.json";
import svgr from '@svgr/rollup';
import url from 'rollup-plugin-url';
import scss from 'rollup-plugin-scss';
import sassPostcss from 'postcss';
import alias from '@rollup/plugin-alias';
import postcss from 'rollup-plugin-postcss'
import cssimport from 'postcss-import';
import autoprefixer from 'autoprefixer';
const path = require('path');
const root = path.resolve(__dirname);
export default {
input: "./src/index.tsx",
output: [
{
file: packageJson.main,
format: "cjs",
sourcemap: true,
},
{
file: packageJson.module,
format: "esm",
sourcemap: true,
},
],
plugins: [
peerDepsExternal(),
resolve({
extensions: ['.ts', '.tsx', '.js', '.jsx', '.json', 'scss'],
}),
terser(),
commonjs(),
typescript(),
alias({
entries: [
{ find: '@src', replacement: `${root}/src` },
{ find: '@assets', replacement: `${root}/assets` },
],
}),
url(),
svgr(),
scss({
processor: (css) =>
sassPostcss([autoprefixer])
.process(css)
.then((result) => result.css),
}),
postcss({
plugins : [ cssimport(), autoprefixer() ]
}),
],
};
4. scripts 작성
"scripts": {
"build": "rollup -c"
},
5. main, modules, types 설정
// package.json
"main": "lib/index.js",
"module": "lib/index.es.js",
"types": "lib/index.d.ts"
- main, module, types 모두 패키지의 기본 진입점이다.
- module: ESModule 형태로 빌드한 결과물을 저장 할 경로. 나중에 패키지를 선택하고 불러오게 되면 이 module 값을 참조하여 코드를 불러오게 된다.
- types: 대부분의 npm 모듈은 Type 정의를 포함하고 있지 않기 때문에, TypeScript 개발자들은 보통 npm i @types/<module_name> -D의 추가적인 명령으로 npm 모듈을 사용 할 수 있게 된다. types는 JavaScript와 TypeScript에 import 가능한 npm TypeScript 모듈을 만드는 방법이다.
6. tsconfig.json 설정
{
"compilerOptions": {
"baseUrl": "./src",
"paths": {
"@src/*": ["./*"],
"@assets/*": ["./assets/*"],
},
"target": "es5",
"lib": ["dom", "dom.iterable", "esnext"],
"skipLibCheck": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"module": "esnext",
"moduleResolution": "node",
"resolveJsonModule": true,
"jsx": "react",
"declaration": true,
},
"include": ["src"],
"exclude": ["**/*.stories.tsx"]
}
7. src/index.tsx에 Demo Component 생성
import React from 'react';
import { ReactComponent as ArrowButtonOption } from '@assets/img/svg/ArrowButtonOption.svg';
import classNames from 'classnames/bind';
import style from './index.scss';
const cx = classNames.bind(style);
interface IOwnProps {
};
const DemoComponent:React.FC<IOwnProps> = ({
}) => {
return (
<div className={cx('demo')}>
데모 컴포넌트
<ArrowButtonOption />
</div>
)
}
export default DemoComponent;
8. @types 설정
declare module '*.scss';
declare module '*.module.scss' {
const classes: { [key: string]: string };
export default classes;
}
declare module "*.svg";
9. build
yarn build
9. bolierplate
github.com/beforesol/rollup-setting
10. Reference
velog.io/@velopert/bundle-with-rollup-and-publish-to-npm
Rollup을 사용하여 디자인 시스템 번들 후, npm 라이브러리로 배포하기
우리가 만든 컴포넌트들을 다른 프로젝트에서도 사용 할 수 있게 해주려면 패키지를 만들어서 npm에 퍼블리시를 해주어야 합니다. (또는, 로컬 패키지로 설정해서 사용하거나 git 레포로 설치하
velog.io
flamingotiger.github.io/frontend/DevEnv/rollup-setup/
Rollup을 사용해서 npm 배포하기
시작하기제작중인 라이브러리를 npm에 배포하는 방법입니다.webpack 도구와는 조금 다른 rollup을 사용해서 번들링 하도록 하려고 합니다.webpack을 쓸 수도 있는데 rollup을 쓰는 이유는 webpack은 ES Modul
flamingotiger.github.io
Steady Study
시작하기에 앞서 😀 rollup.js + typescript + storybook으로 디자인 시스템을 구축하는것과 관련한 아티클들이 해외 아티클들은 많지만, 예전 내용들로 작성되어 있는 경우가 대부분이었고, 또 구축 당
ideveloper2.dev
'JavaScript' 카테고리의 다른 글
| ios에서 textarea maxLength 이슈 (0) | 2021.09.13 |
|---|---|
| 브라우저에서 뒤로 버튼을 사용할 수 있는지 여부 체크하는 방법 (0) | 2021.07.07 |
| svg 그라데이션 동적으로 적용 (0) | 2021.03.11 |
| package.json add (0) | 2021.02.17 |
| 커서 맨 뒤로 이동하기 (0) | 2021.01.22 |