Skip to content

Commit 1044589

Browse files
authored
chore: Add bundle analysis package (#11379)
With the v8 beta coming up, we should start examining the bundle to see if there's any opportunity for us to optimize. This PR adds a package that you can add simple scenarios to that can get tested against.
1 parent ed4a751 commit 1044589

File tree

19 files changed

+362
-32
lines changed

19 files changed

+362
-32
lines changed

.eslintrc.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ module.exports = {
5151
},
5252
},
5353
{
54-
files: ['scenarios/**', 'dev-packages/rollup-utils/**'],
54+
files: ['scenarios/**', 'dev-packages/rollup-utils/**', 'dev-packages/bundle-analyzer-scenarios/**'],
5555
parserOptions: {
5656
sourceType: 'module',
5757
},
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# Bundle Analyzer Scenarios
2+
3+
This repository contains a set of scenarios to check the SDK against webpack bundle analyzer.
4+
5+
You can run the scenarios by running `yarn analyze` and selecting the scenario you want to run.
6+
7+
If you want to have more granular analysis of modules, you can build the SDK packages with with `preserveModules` set to
8+
`true`. You can do this via the `SENTRY_BUILD_PRESERVE_MODULES`.
9+
10+
```bash
11+
SENTRY_BUILD_PRESERVE_MODULES=true yarn build
12+
```
13+
14+
Please note that `preserveModules` has different behaviour with regards to tree-shaking, so you will get different total
15+
bundle size results.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { init } from '@sentry/browser';
2+
3+
init({
4+
dsn: 'https://[email protected]/0000000',
5+
});
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type": "module",
3+
"main": "index.js"
4+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{
2+
"name": "@sentry-internal/bundle-analyzer-scenarios",
3+
"version": "8.0.0-alpha.7",
4+
"description": "Scenarios to test bundle analysis with",
5+
"repository": "git://github.com/getsentry/sentry-javascript.git",
6+
"homepage": "https://github.com/getsentry/sentry-javascript/tree/master/dev-packages/bundle-analyzer-scenarios",
7+
"author": "Sentry",
8+
"license": "MIT",
9+
"private": true,
10+
"dependencies": {
11+
"html-webpack-plugin": "^5.5.0",
12+
"webpack": "^5.76.0",
13+
"webpack-bundle-analyzer": "^4.5.0",
14+
"inquirer": "^8.2.0"
15+
},
16+
"scripts": {
17+
"analyze": "node webpack.cjs"
18+
},
19+
"volta": {
20+
"extends": "../../package.json"
21+
},
22+
"type": "module"
23+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
const path = require('path');
2+
const { promises } = require('fs');
3+
4+
const inquirer = require('inquirer');
5+
const webpack = require('webpack');
6+
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
7+
const HtmlWebpackPlugin = require('html-webpack-plugin');
8+
9+
async function init() {
10+
const scenarios = await getScenariosFromDirectories();
11+
12+
const answers = await inquirer.prompt([
13+
{
14+
type: 'rawlist',
15+
name: 'scenario',
16+
message: 'Which scenario you want to run?',
17+
choices: scenarios,
18+
pageSize: scenarios.length,
19+
loop: false,
20+
},
21+
]);
22+
23+
console.log(`Bundling scenario: ${answers.scenario}`);
24+
25+
await runWebpack(answers.scenario);
26+
}
27+
28+
async function runWebpack(scenario) {
29+
const alias = await generateAlias();
30+
31+
webpack(
32+
{
33+
mode: 'production',
34+
entry: path.resolve(__dirname, scenario),
35+
output: {
36+
filename: 'main.js',
37+
path: path.resolve(__dirname, 'dist', scenario),
38+
},
39+
plugins: [new BundleAnalyzerPlugin({ analyzerMode: 'static' }), new HtmlWebpackPlugin()],
40+
resolve: {
41+
alias,
42+
},
43+
},
44+
(err, stats) => {
45+
if (err || stats.hasErrors()) {
46+
console.log(err);
47+
}
48+
49+
// console.log('DONE', stats);
50+
},
51+
);
52+
}
53+
54+
const PACKAGE_PATH = '../../packages';
55+
56+
/**
57+
* Generate webpack aliases based on packages in monorepo
58+
* Example of an alias: '@sentry/serverless': 'path/to/sentry-javascript/packages/serverless',
59+
*/
60+
async function generateAlias() {
61+
const dirents = await promises.readdir(PACKAGE_PATH);
62+
63+
return Object.fromEntries(
64+
await Promise.all(
65+
dirents.map(async d => {
66+
const packageJSON = JSON.parse(await promises.readFile(path.resolve(PACKAGE_PATH, d, 'package.json')));
67+
return [packageJSON['name'], path.resolve(PACKAGE_PATH, d)];
68+
}),
69+
),
70+
);
71+
}
72+
73+
/**
74+
* Generates an array of available scenarios
75+
*/
76+
async function getScenariosFromDirectories() {
77+
const exclude = ['node_modules', 'dist', '~', 'package.json', 'yarn.lock', 'README.md', '.DS_Store', 'webpack.cjs'];
78+
79+
const dirents = await promises.readdir(path.join(__dirname), { withFileTypes: true });
80+
return dirents.map(dirent => dirent.name).filter(mape => !exclude.includes(mape));
81+
}
82+
83+
init();

dev-packages/rollup-utils/npmHelpers.mjs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import deepMerge from 'deepmerge';
1010

1111
import {
1212
makeCleanupPlugin,
13-
makeCodeCovPlugin,
1413
makeDebugBuildStatementReplacePlugin,
1514
makeExtractPolyfillsPlugin,
1615
makeNodeResolvePlugin,
@@ -44,8 +43,6 @@ export function makeBaseNPMConfig(options = {}) {
4443
excludeIframe: undefined,
4544
});
4645

47-
const codecovPlugin = makeCodeCovPlugin();
48-
4946
const defaultBaseConfig = {
5047
input: entrypoints,
5148

@@ -106,7 +103,6 @@ export function makeBaseNPMConfig(options = {}) {
106103
debugBuildStatementReplacePlugin,
107104
rrwebBuildPlugin,
108105
cleanupPlugin,
109-
codecovPlugin,
110106
],
111107

112108
// don't include imported modules from outside the package in the final output

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
"packages/vue",
7878
"packages/wasm",
7979
"dev-packages/browser-integration-tests",
80+
"dev-packages/bundle-analyzer-scenarios",
8081
"dev-packages/e2e-tests",
8182
"dev-packages/node-integration-tests",
8283
"dev-packages/overhead-metrics",

packages/browser/rollup.npm.config.mjs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ export default makeNPMConfigVariants(
99
// set exports to 'named' or 'auto' so that rollup doesn't warn
1010
exports: 'named',
1111
// set preserveModules to false because we want to bundle everything into one file.
12-
preserveModules: false,
12+
preserveModules:
13+
process.env.SENTRY_BUILD_PRESERVE_MODULES === undefined
14+
? false
15+
: Boolean(process.env.SENTRY_BUILD_PRESERVE_MODULES),
1316
},
1417
},
1518
}),

packages/core/rollup.npm.config.mjs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ export default makeNPMConfigVariants(
77
// set exports to 'named' or 'auto' so that rollup doesn't warn
88
exports: 'named',
99
// set preserveModules to false because we want to bundle everything into one file.
10-
preserveModules: false,
10+
preserveModules:
11+
process.env.SENTRY_BUILD_PRESERVE_MODULES === undefined
12+
? false
13+
: Boolean(process.env.SENTRY_BUILD_PRESERVE_MODULES),
1114
},
1215
},
1316
}),

packages/deno/rollup.test.config.mjs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@ export default [
1010
output: {
1111
file: 'build-test/index.js',
1212
sourcemap: true,
13-
preserveModules: false,
13+
preserveModules:
14+
process.env.SENTRY_BUILD_PRESERVE_MODULES === undefined
15+
? false
16+
: Boolean(process.env.SENTRY_BUILD_PRESERVE_MODULES),
1417
strict: false,
1518
freeze: false,
1619
interop: 'auto',

packages/feedback/rollup.npm.config.mjs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ export default makeNPMConfigVariants(
99
exports: 'named',
1010
// set preserveModules to false because for feedback we actually want
1111
// to bundle everything into one file.
12-
preserveModules: false,
12+
preserveModules:
13+
process.env.SENTRY_BUILD_PRESERVE_MODULES === undefined
14+
? false
15+
: Boolean(process.env.SENTRY_BUILD_PRESERVE_MODULES),
1316
},
1417
},
1518
sucrase: {

packages/node/rollup.npm.config.mjs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@ export default [
1414
// set exports to 'named' or 'auto' so that rollup doesn't warn
1515
exports: 'named',
1616
// set preserveModules to false because we want to bundle everything into one file.
17-
preserveModules: false,
17+
preserveModules:
18+
process.env.SENTRY_BUILD_PRESERVE_MODULES === undefined
19+
? false
20+
: Boolean(process.env.SENTRY_BUILD_PRESERVE_MODULES),
1821
},
1922
plugins: [
2023
replace({

packages/opentelemetry/rollup.npm.config.mjs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ export default makeNPMConfigVariants(
77
// set exports to 'named' or 'auto' so that rollup doesn't warn
88
exports: 'named',
99
// set preserveModules to false because we want to bundle everything into one file.
10-
preserveModules: false,
10+
preserveModules:
11+
process.env.SENTRY_BUILD_PRESERVE_MODULES === undefined
12+
? false
13+
: Boolean(process.env.SENTRY_BUILD_PRESERVE_MODULES),
1114
},
1215
},
1316
}),

packages/replay-canvas/rollup.npm.config.mjs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ export default makeNPMConfigVariants(
99
exports: 'named',
1010
// set preserveModules to false because for Replay we actually want
1111
// to bundle everything into one file.
12-
preserveModules: false,
12+
preserveModules:
13+
process.env.SENTRY_BUILD_PRESERVE_MODULES === undefined
14+
? false
15+
: Boolean(process.env.SENTRY_BUILD_PRESERVE_MODULES),
1316
},
1417
},
1518
}),

packages/replay-internal/rollup.npm.config.mjs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ export default makeNPMConfigVariants(
99
exports: 'named',
1010
// set preserveModules to false because for Replay we actually want
1111
// to bundle everything into one file.
12-
preserveModules: false,
12+
preserveModules:
13+
process.env.SENTRY_BUILD_PRESERVE_MODULES === undefined
14+
? false
15+
: Boolean(process.env.SENTRY_BUILD_PRESERVE_MODULES),
1316
},
1417
},
1518
}),

packages/tracing-internal/rollup.npm.config.mjs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ export default makeNPMConfigVariants(
77
// set exports to 'named' or 'auto' so that rollup doesn't warn
88
exports: 'named',
99
// set preserveModules to false because we want to bundle everything into one file.
10-
preserveModules: false,
10+
preserveModules:
11+
process.env.SENTRY_BUILD_PRESERVE_MODULES === undefined
12+
? false
13+
: Boolean(process.env.SENTRY_BUILD_PRESERVE_MODULES),
1114
},
1215
},
1316
}),

packages/utils/rollup.npm.config.mjs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ export default makeNPMConfigVariants(
77
// set exports to 'named' or 'auto' so that rollup doesn't warn
88
exports: 'named',
99
// set preserveModules to false because we want to bundle everything into one file.
10-
preserveModules: false,
10+
preserveModules:
11+
process.env.SENTRY_BUILD_PRESERVE_MODULES === undefined
12+
? false
13+
: Boolean(process.env.SENTRY_BUILD_PRESERVE_MODULES),
1114
},
1215
},
1316
}),

0 commit comments

Comments
 (0)