Your dependencies are bad and you should feel bad
roast-my-deps
Your dependencies are bad and you should feel bad.
Install
yarn add roast-my-deps
Example
From Spectrum:
roast-my-deps --ignore draft-js* --ignore apollo-link-ws
Output
┌─────────────────────────────────────────────┬─────────┬─────────┐
│ Name │ min │ min+gz │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ All │ 1.97 MB │ 499 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ moment │ 260 kB │ 65.5 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ react-dom │ 91 kB │ 28.9 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ draft-js │ 98.8 kB │ 25.3 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ raven-js │ 37.6 kB │ 13 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ prismjs │ 31.4 kB │ 11.7 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ validator │ 40.6 kB │ 10.2 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ styled-components │ 27.1 kB │ 9.68 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ apollo-client │ 36.1 kB │ 9.2 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ react-flip-move │ 21.4 kB │ 6.23 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ lodash │ 20.2 kB │ 5.8 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ react-apollo │ 23.5 kB │ 5.7 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ draft-js-markdown-plugin │ 20.3 kB │ 5.51 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ react-helmet-async │ 19 kB │ 5.31 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ apollo-cache-inmemory │ 16.9 kB │ 5.07 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ react-modal │ 17.3 kB │ 4.83 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ history │ 20 kB │ 4.74 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ apollo-utilities │ 16.5 kB │ 4.59 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ react-stripe-elements │ 17.4 kB │ 3.91 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ react-router │ 16.8 kB │ 3.61 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ react-redux │ 11.9 kB │ 3.46 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ draft-js-plugins-editor │ 11.4 kB │ 3.03 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ react-stripe-checkout │ 8.75 kB │ 2.95 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ redraft │ 10.3 kB │ 2.75 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ react-textarea-autosize │ 6.69 kB │ 2.27 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ react │ 5.44 kB │ 2.22 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ draft-js-focus-plugin │ 7.23 kB │ 2.13 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ react-trend │ 5.27 kB │ 2.08 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ react-router-dom │ 7.65 kB │ 1.99 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ react-transition-group │ 5.91 kB │ 1.89 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ redux │ 4.63 kB │ 1.72 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ draft-js-drag-n-drop-plugin │ 4.76 kB │ 1.71 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ emoji-regex │ 7.15 kB │ 1.67 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ react-error-boundary │ 3.95 kB │ 1.54 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ react-loadable │ 4.27 kB │ 1.44 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ react-infinite-scroller-with-scroll-element │ 4.33 kB │ 1.43 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ react-popper │ 4.52 kB │ 1.39 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ recompose │ 6.1 kB │ 1.34 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ slugg │ 3.25 kB │ 1.34 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ apollo-link │ 3.74 kB │ 1.29 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ draft-js-image-plugin │ 3.42 kB │ 1.25 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ draft-js-embed-plugin │ 3.12 kB │ 1.2 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ draft-js-linkify-plugin │ 3.25 kB │ 1.18 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ react-clipboard.js │ 3.54 kB │ 1.13 kB │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ query-string │ 2.21 kB │ 845 B │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ graphql-tag │ 1.68 kB │ 777 B │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ apollo-upload-client │ 1.71 kB │ 760 B │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ string-replace-to-array │ 1.15 kB │ 469 B │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ css.escape │ 771 B │ 373 B │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ draft-js-prism-plugin │ 878 B │ 372 B │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ apollo-link-ws │ 803 B │ 325 B │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ hoist-non-react-statics │ 691 B │ 309 B │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ draft-js-code-editor-plugin │ 931 B │ 286 B │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ debounce │ 434 B │ 170 B │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ offline-plugin │ 316 B │ 164 B │
├─────────────────────────────────────────────┼─────────┼─────────┤
│ redux-thunk │ 244 B │ 103 B │
└─────────────────────────────────────────────┴─────────┴─────────┘
Methodology
First we find all of your package.json
dependencies and install them in a
fresh directory.
Then we search through all your source code to find import
's and require
's.
This way we have the exact imports you have in your app.
You can configure which files we search by passing globs:
roast-my-deps 'src/**/*.js' '!**/__tests__/**'
Then we create entry points for each dependency that look like this:
// module-name.js
f(require("module-name"));
The
f()
is a missing global to prevent any code from being optimized away.
Everything outside of that dependency is marked "external" and won't be
included in that module's bundle. This means that:
- The sizes are a representation of just the code in that module
- Sub-dependencies don't get displayed directly
We also create an "all" entry. This is not a sum of the other bundles. It
creates a separate bundle from an entry point that looks like this:
// _all.js
f(require("module-name-1"));
f(require("module-name-2"));
f(require("module-name-3"));
f(require("module-name-4"));
f(require("module-name-5"));
// ...
All bundles are run through Webpack in the "production" mode.