Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ref(nextjs): Exclude cross-platform tracing code from bundles #3978

Merged
merged 5 commits into from Sep 14, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions packages/nextjs/src/config/types.ts
Expand Up @@ -42,6 +42,9 @@ export type WebpackConfigObject = {
output: { filename: string; path: string };
target: string;
context: string;
resolve?: {
alias?: { [key: string]: string | boolean };
};
} & {
// other webpack options
[key: string]: unknown;
Expand Down
18 changes: 18 additions & 0 deletions packages/nextjs/src/config/webpack.ts
Expand Up @@ -60,6 +60,24 @@ export function constructWebpackConfigFunction(
const origEntryProperty = newConfig.entry;
newConfig.entry = async () => addSentryToEntryProperty(origEntryProperty, buildContext);

// In webpack 5, you can get webpack to replace any module you'd like with an empty object, just by setting its
// `resolve.alias` value to `false`. Not much of our code is neatly separated into "things node needs" and "things
// the browser needs," but where it is, we can save ~1.6 kb in eventual bundle size by excluding code we know we
// don't need. (Normally this would only matter for the client side, but because vercel turns backend code into
// serverless functions, it's worthwhile to do it for both.)
if (buildContext.webpack.version.startsWith('5')) {
const excludedTracingDir = buildContext.isServer ? 'browser' : 'integrations/node';
newConfig.resolve = {
...newConfig.resolve,
alias: {
...newConfig.resolve?.alias,
[path.resolve(buildContext.dir, `./node_modules/@sentry/tracing/esm/${excludedTracingDir}`)]: false,
lobsterkatie marked this conversation as resolved.
Show resolved Hide resolved
// TODO It's not clear if it will ever pull from `dist` (in testing it never does), so we may not need this.
[path.resolve(buildContext.dir, `./node_modules/@sentry/tracing/dist/${excludedTracingDir}`)]: false,
},
};
}

// Enable the Sentry plugin (which uploads source maps to Sentry when not in dev) by default
const enableWebpackPlugin = buildContext.isServer
? !userNextConfig.sentry?.disableServerWebpackPlugin
Expand Down
8 changes: 4 additions & 4 deletions packages/tracing/src/integrations/index.ts
@@ -1,4 +1,4 @@
export { Express } from './express';
export { Postgres } from './postgres';
export { Mysql } from './mysql';
export { Mongo } from './mongo';
export { Express } from './node/express';
export { Postgres } from './node/postgres';
export { Mysql } from './node/mysql';
export { Mongo } from './node/mongo';
@@ -1,8 +1,8 @@
/* eslint-disable @typescript-eslint/unbound-method */
import { Hub, Scope } from '@sentry/hub';

import { Mongo } from '../../src/integrations/mongo';
import { Span } from '../../src/span';
import { Mongo } from '../../../src/integrations/node/mongo';
import { Span } from '../../../src/span';

class Collection {
public collectionName: string = 'mockedCollectionName';
Expand Down
@@ -1,8 +1,8 @@
/* eslint-disable @typescript-eslint/unbound-method */
import { Hub, Scope } from '@sentry/hub';

import { Postgres } from '../../src/integrations/postgres';
import { Span } from '../../src/span';
import { Postgres } from '../../../src/integrations/node/postgres';
import { Span } from '../../../src/span';

class PgClient {
// https://node-postgres.com/api/client#clientquery
Expand Down