Tree Shaking

Learn how to reduce Sentry bundle size by tree shaking unused code.

The Sentry SDK supports tree shaking in various ways. To fully utilize the tree shaking capabilities of modern bundlers like webpack or Rollup, some additional configurations must be applied. If you want to minimize the bundle size of the Sentry SDK, we recommend reading through this page and applying the tree shaking configurations as shown.

The Sentry SDK ships with code that is not strictly required for it to collect your errors. This includes code to debug your Sentry configuration or code to enable tracing, for example. While debug code can be very useful in development environments, it's not typically necessary to include it in your production bundles where it takes up valuable space. The JavaScript SDK includes special flags in its CommonJS and ESM distributions, which can be used to facilitate tree shaking (removal) of this kind of code during the build process.

Anything that you don't import and use will automatically be tree shaken away when using any modern bundler like Webpack, Rollup, Vite, or similar. This means that optional integrations like Replay, BrowserTracing, BrowserProfiling, and any unused utility methods won't be included in your bundle unless you import and use them yourself. The rest of this page relates to ways to tree shake internal SDK code, which isn't strictly required unless you use certain features.

This configuration is available starting with v2.9.0 of the bundler plugins.

If you're using one of our bundler plugins, you can use the bundleSizeOptimizations configuration option to tree shake optional code:

Copied
// For example, the @sentry/webpack-plugin passed to the webpack config
sentryPlugin({
  // other config
  bundleSizeOptimizations: {
    excludeDebugStatements: true,
    excludePerformanceMonitoring: true,
  },
});

For more details, see the documentation for the specific bundler plugin you're using:

If you want to tree shake optional code, remove the code from your build output by replacing various flags in the Sentry SDK. Note that if you already configured tree shaking via the Sentry Bundler Plugins, you do not need to do this manually - the plugins will take care of it for you.

The following flags are available:

__SENTRY_DEBUG__

Replacing this flag with false will tree shake any SDK code that's related to debug logging.

__SENTRY_TRACING__

Replacing this flag with false will tree shake any SDK code that's related to tracing.

__SENTRY_TRACING__ must not be replaced with false when you're using any tracing-related SDK features (for example,Sentry.startTransaction()). This flag is intended to be used in combination with packages like @sentry/next or @sentry/sveltekit, which automatically include the tracing functionality.

To tree shake Sentry debug code in your webpack bundles, we recommend using webpack's DefinePlugin:

webpack.config.js
Copied
const webpack = require("webpack");

module.exports = {
  // ... other options
  plugins: [
    new webpack.DefinePlugin({
      __SENTRY_DEBUG__: false,
      __SENTRY_TRACING__: false,
    }),
    // ... other plugins
  ],
};

If you're using rollup.js, we recommend using Rollup's replace plugin:

rollup.config.js
Copied
import replace from "@rollup/plugin-replace";
import { terser } from "rollup-plugin-terser";

export default {
  // ... other options
  treeshake: "smallest", // recommended for best tree shaking results
  plugins: [
    replace({
      __SENTRY_DEBUG__: false,
      __SENTRY_TRACING__: false,
    }),
    // ... other plugins (best placed after)
  ],
};

By default, the Sentry SDK sets up a list of default integrations that extend your SDK functionality. You can also add additional or custom integrations to your SDK configuration. If you don't want to include default integrations in your config, you can use Sentry.initWithoutDefaultIntegrations() and pass the integrations you want manually:

Copied
const Sentry = require("@sentry/node");

// This will not add _any_ integrations by default!
Sentry.initWithoutDefaultIntegrations({
  dsn: "https://examplePublicKey@o0.ingest.sentry.io/0",
  integrations: [
    Sentry.httpIntegration(),
    Sentry.consoleIntegration(),
    Sentry.dedupeIntegration(),
    Sentry.inboundFiltersIntegration(),
  ],
});

If you want to use Sentry only for error monitoring, and do not care about any performance monitoring features, you can use the following initialization method to ensure that any performance-specific integrations are not included in your bundle and can be tree-shaken away by a bundler:

Copied
const Sentry = require("@sentry/node");

// This will not add _any_ integrations by default!
Sentry.initWithoutDefaultIntegrations({
  dsn: "https://examplePublicKey@o0.ingest.sentry.io/0",
  integrations: [
    // Adds all default integrations
    // except the ones that are only relevant for performance
    ...Sentry.getDefaultIntegrationsWithoutPerformance(),
  ],
});
Help improve this content
Our documentation is open source and available on GitHub. Your contributions are welcome, whether fixing a typo (drat!) or suggesting an update ("yeah, this would be better").