Skip to content

Commit

Permalink
Module duplicates: transition to using a custom selector
Browse files Browse the repository at this point in the history
This allows pretty easy extension to measuring other types (like
duplicate count)

I've declined not to add a metric selector at this time because creating
a new dropdown that only allows a single selection would be a lot more
changes.
  • Loading branch information
danielbeardsley committed Dec 30, 2023
1 parent 4784db5 commit d972e4d
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 35 deletions.
7 changes: 4 additions & 3 deletions packages/ui/src/components/bundle-modules/index.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -62,11 +62,12 @@ export const BundleModules = (props) => {
const [useDuplicatedSize, setUseDuplicatedSize] = useState(false);

const { rows, totalRowCount } = useMemo(() => {
let jobsToCompare = jobs;
let result;
if (useDuplicatedSize) {
jobsToCompare = webpack.factorDuplicateSizeIntoModules(jobs)
result = webpack.compareModuleDuplicateSize(jobs, [addRowFlags]);
} else {
result = webpack.compareBySection.modules(jobs, [addRowFlags]);
}
const result = webpack.compareBySection.modules(jobsToCompare, [addRowFlags]);
return { rows: result, totalRowCount: result.length };
}, [jobs, useDuplicatedSize]);

Expand Down
35 changes: 11 additions & 24 deletions packages/utils/src/webpack/compare.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import {
SECTION_WEBPACK_PACKAGES,
SECTIONS,
} from './constants';
import { selectors } from './selectors';
import { selectors, getModuleDuplicateSize } from './selectors';

/**
* Compare stats metrics
Expand Down Expand Up @@ -53,6 +53,16 @@ const compareAssets = (jobs, rowTransformers) =>
const compareModules = (jobs, rowTransformers) =>
compareMetrics(jobs, selectors.modules, MetricTypes.FileSize, rowTransformers);

/**
* Compare module size including duplicates
*
* @param {Object[]} jobs - List of jobs to compare
* @param {Array<Function>} [rowTransformers]
* @return {Object[]} Compared module metrics
*/
export const compareModuleDuplicateSize = (jobs, rowTransformers) =>
compareMetrics(jobs, getModuleDuplicateSize, MetricTypes.FileSize, rowTransformers);

/**
* Compare package metrics
*
Expand Down Expand Up @@ -86,26 +96,3 @@ export const compare = (jobs) =>
}),
{},
);

/**
* Augment the modules data in jobs to count the bytes from each duplicate
*/
export const factorDuplicateSizeIntoModules = (jobs) =>
jobs.map((job) => ({
...job,
metrics: {
...job.metrics,
webpack: {
...job.metrics.webpack,
modules: Object.keys(job.metrics.webpack.modules).reduce((modulesWithDupes, key) => {
const module = job.metrics.webpack.modules[key];
// eslint-disable-next-line no-param-reassign
modulesWithDupes[key] = {
...module,
value: module.value * module.chunkIds.length,
};
return modulesWithDupes;
}, {}),
},
},
}))
46 changes: 38 additions & 8 deletions packages/utils/src/webpack/selectors.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,13 @@ const getStatsMetrics = (job) => {
const metrics = pick(data, SUMMARY_METRIC_PATHS);

// Rename metric keys
return Object.entries(metrics).reduce((agg, [key, value]) => ({
...agg,
[`webpack.${key}`]: value,
}), {});
return Object.entries(metrics).reduce(
(agg, [key, value]) => ({
...agg,
[`webpack.${key}`]: value,
}),
{},
);
};

/**
Expand All @@ -47,10 +50,13 @@ const getSizeMetrics = (job) => {
const metrics = get(job, 'metrics.webpack.sizes', {});

// List metrics by the metrics list
return Object.keys(metricTypes.sizes).reduce((agg, key) => ({
...agg,
[`webpack.sizes.${key}`]: metrics[key],
}), {});
return Object.keys(metricTypes.sizes).reduce(
(agg, key) => ({
...agg,
[`webpack.sizes.${key}`]: metrics[key],
}),
{},
);
};

/**
Expand Down Expand Up @@ -79,6 +85,30 @@ const getAssetsMetrics = (job) => get(job, 'metrics.webpack.assets', {});
*/
const getModulesMetrics = (job) => get(job, 'metrics.webpack.modules', {});

/**
*
* Select webpack module size including duplication
*
* @param {Object} job Job data
* @param {Object} job.metrics Job metrics
* @param {Object} job.metrics.webpack Job webpack metrics
* @param {Object} job.metrics.webpack.modules Job webpack module metrics
*
* @return {Object} Webpack module metrics
*/
export const getModuleDuplicateSize = (job) => {
const modules = get(job, 'metrics.webpack.modules', {});
return Object.keys(modules).reduce((modulesWithDupes, key) => {
const module = modules[key];
// eslint-disable-next-line no-param-reassign
modulesWithDupes[key] = {
...module,
value: module.value * module.chunkIds.length,
};
return modulesWithDupes;
}, {});
};

/**
*
* Get package metrics
Expand Down

0 comments on commit d972e4d

Please sign in to comment.