Using rollup to build react library
tsconfig.json
{
"compilerOptions": {
"target": "es5",
"lib": [
"dom",
"dom.iterable",
"esnext"
],
"allowJs": true,
"skipLibCheck": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"noFallthroughCasesInSwitch": true,
"module": "esnext",
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "react-jsx",
"baseUrl": "src",
// generate types file .d.ts and put it under types folder
"declaration": true,
"declarationDir": "./types",
"sourceMap": true,
},
"include": [
"**/*.ts",
"**/*.tsx"
]
}
package.json
{
"name": "my_rollup_library",
"version": "1.2.1",
// declare the entry point from library
"main": "dist/index.js",
"license": "MIT",
"repository": {
"type": "git",
"url": "git+https://github.com/headshootcheng/webpack-library.git"
},
// only include dist folder when install as a library
"files": [
"dist"
],
// declare the library needed from other repo which install the library
"peerDependencies": {
"@emotion/react": "^11.9.3",
"@emotion/styled": "^11.9.3",
"@mui/icons-material": "^5.8.4",
"@mui/material": "^5.8.4",
"react": "^18.2.0",
"react-dom": "^18.2.0"
},
"scripts": {
"build": "rollup -c rollup.config.js"
},
"devDependencies": {
"@babel/core": "^7.18.5",
"@emotion/react": "^11.9.3",
"@emotion/styled": "^11.9.3",
"@mui/icons-material": "^5.8.4",
"@mui/material": "^5.8.4",
"@rollup/plugin-commonjs": "^22.0.0",
"@rollup/plugin-node-resolve": "^13.3.0",
"@rollup/plugin-typescript": "^8.3.3",
"@types/react": "^18.0.14",
"@types/react-dom": "^18.0.5",
"node-sass": "^7.0.1",
"postcss": "^8.4.14",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"rollup": "^2.75.7",
"rollup-plugin-dts": "^4.2.2",
"rollup-plugin-peer-deps-external": "^2.2.4",
"rollup-plugin-postcss": "^4.0.2",
"rollup-plugin-sass": "^1.2.12",
"rollup-plugin-terser": "^7.0.2",
"sass": "^1.53.0",
"tslib": "^2.4.0",
"typescript": "^4.7.4"
}
}
rollup.config.js
import resolve from "@rollup/plugin-node-resolve";
import commonjs from "@rollup/plugin-commonjs";
import typescript from "@rollup/plugin-typescript";
import { terser } from "rollup-plugin-terser";
import PeerDepsExternalPlugin from "rollup-plugin-peer-deps-external";
import dts from "rollup-plugin-dts";
import postcss from 'rollup-plugin-postcss';
import packageJson from "./package.json";
export default [
{
input: "src/index.ts",
output: {
file: packageJson.main,
format: "cjs",
sourcemap: true
},
plugins: [
// help to find the library from node_modules
resolve(),
// support cjs syntax
commonjs(),
// support typescript
typescript({ tsconfig: "./tsconfig.json" }),
// reduce the bundle size
terser(),
// put the all the peer-dependencies into externals automatically
PeerDepsExternalPlugin(),
// support sass
postcss({
extract: false,
modules: true,
use: ['sass'],
}),
],
},
// put it from types folder to index directory
{
input: "dist/types/index.d.ts",
output: [{ file: "dist/index.d.ts", format: "esm" }],
// allow to bundle my type file
plugins: [dts()]
}
];
Personally, i think rollup is more suitable to build a library instead of webpack, as its related library is popular, the required customization is smaller and more developer-friendly, but also easier to build different version of js
Last updated
Was this helpful?