Skip to content

Commit 011bb19

Browse files
authored
Merge pull request #577 from thejustinwalsh/feat-rollup-dist-bundle
Bundle @pixi/react for use without bundler
2 parents 501ca31 + 4794130 commit 011bb19

File tree

3 files changed

+93
-53
lines changed

3 files changed

+93
-53
lines changed

Diff for: package-lock.json

+20
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: package.json

+2
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@
9191
"react-dom": "^19.0.0",
9292
"rollup": "^4.18.0",
9393
"rollup-plugin-esbuild": "^6.1.1",
94+
"rollup-plugin-inject-process-env": "^1.3.1",
95+
"rollup-plugin-peer-deps-external": "^2.2.4",
9496
"rollup-plugin-sourcemaps": "^0.6.3",
9597
"typescript": "^5.4.5",
9698
"vitest": "^2.0.0"

Diff for: rollup.config.mjs

+71-53
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import path from 'node:path';
22
import esbuild from 'rollup-plugin-esbuild';
3+
import injectProcessEnv from 'rollup-plugin-inject-process-env';
4+
import peerDepsExternalPlugin from 'rollup-plugin-peer-deps-external';
35
import sourcemaps from 'rollup-plugin-sourcemaps';
46
import repo from './package.json' with { type: 'json' };
57
import commonjs from '@rollup/plugin-commonjs';
@@ -15,9 +17,23 @@ const paths = {
1517

1618
const {
1719
dependencies = {},
18-
peerDependencies = {},
1920
} = repo;
2021

22+
const plugins = ({ env, esmExternals = false } = {}) => [
23+
json(),
24+
esbuild({ target: moduleTarget, minify: env === 'production' }),
25+
sourcemaps(),
26+
commonjs({ esmExternals }),
27+
...(env ? [injectProcessEnv({
28+
NODE_ENV: env
29+
})] : []),
30+
resolve({
31+
browser: true,
32+
preferBuiltins: false,
33+
}),
34+
peerDepsExternalPlugin(),
35+
];
36+
2137
/**
2238
* Escapes the `RegExp` special characters.
2339
* @param {string} str
@@ -36,57 +52,59 @@ function convertPackageNameToRegExp(packageName)
3652
return new RegExp(`^${escapeRegExp(packageName)}(/.+)?$`);
3753
}
3854

39-
// Check for bundle folder
40-
const external = Object.keys(dependencies)
41-
.concat(Object.keys(peerDependencies))
42-
.map(convertPackageNameToRegExp);
55+
const external = ({ bundleDeps = true } = {}) => (bundleDeps ? [] : Object.keys(dependencies).map(convertPackageNameToRegExp));
4356

44-
export default {
45-
input: 'src/index.ts',
46-
output: [
47-
{
48-
dir: paths.library,
49-
entryFileNames: '[name].js',
50-
exports: 'named',
51-
format: 'cjs',
52-
preserveModules: true,
53-
preserveModulesRoot: paths.source,
54-
sourcemap: true,
55-
},
56-
{
57-
dir: paths.library,
58-
entryFileNames: '[name].mjs',
59-
exports: 'named',
60-
format: 'esm',
61-
preserveModules: true,
62-
preserveModulesRoot: paths.source,
63-
sourcemap: true,
64-
},
65-
{
66-
dir: paths.distributable,
67-
entryFileNames: '[name].js',
68-
exports: 'named',
69-
format: 'cjs',
70-
sourcemap: true,
71-
},
72-
{
73-
dir: paths.distributable,
74-
entryFileNames: '[name].mjs',
75-
exports: 'named',
76-
format: 'esm',
77-
sourcemap: true,
78-
},
79-
],
80-
plugins: [
81-
esbuild({ target: moduleTarget }),
82-
sourcemaps(),
83-
resolve({
84-
browser: true,
85-
preferBuiltins: false,
86-
}),
87-
commonjs(),
88-
json(),
89-
],
90-
external,
91-
treeshake: false
57+
const targets = {
58+
lib: {
59+
path: paths.library,
60+
entryFileNames: '[name]',
61+
env: undefined,
62+
external: external(),
63+
preserveModules: true,
64+
esmExternals: false,
65+
},
66+
'dist-dev': {
67+
path: paths.distributable,
68+
entryFileNames: 'pixi-react',
69+
env: 'development',
70+
external: external({ bundleDeps: true }),
71+
preserveModules: false,
72+
esmExternals: true,
73+
},
74+
'dist-prod': {
75+
path: paths.distributable,
76+
entryFileNames: 'pixi-react.min',
77+
env: 'production',
78+
external: external({ bundleDeps: true }),
79+
preserveModules: false,
80+
esmExternals: true,
81+
},
9282
};
83+
84+
export default ['lib', 'dist-dev', 'dist-prod'].map((target) =>
85+
({
86+
input: 'src/index.ts',
87+
output: [
88+
{
89+
dir: targets[target].path,
90+
entryFileNames: `${targets[target].entryFileNames}.js`,
91+
exports: 'named',
92+
format: 'cjs',
93+
preserveModules: targets[target].preserveModules,
94+
preserveModulesRoot: paths.source,
95+
sourcemap: true,
96+
},
97+
{
98+
dir: targets[target].path,
99+
entryFileNames: `${targets[target].entryFileNames}.mjs`,
100+
exports: 'named',
101+
format: 'esm',
102+
preserveModules: targets[target].preserveModules,
103+
preserveModulesRoot: paths.source,
104+
sourcemap: true,
105+
},
106+
],
107+
plugins: plugins({ env: targets[target].env, esmExternals: targets[target].esmExternals }),
108+
external: targets[target].external,
109+
treeshake: false
110+
}));

0 commit comments

Comments
 (0)