Files
Donny/강동윤andGitHub 3a5b73d2d6 perf(turbopack): Remove ImportBinding fragments (#78470)
### What?

Make the `ImportBinding` node a phantom node.

### Why?

Because they are not used. We have to import directly from the original
module because of the static analysis like `next/dynamic`. So I modified
the tree shaking to import directly with
https://github.com/vercel/next.js/pull/71704. But #71704 didn't remove
the concept of `ImportBinding`. This PR finishes the work of using
direct imports.

Additionally, this PR introduces `ReexportBinding` fragments because
these are not phantom nodes. I'll check if it would be possible to
remove `ReexportBinding` fragments with follow-up PRs.

### How?

 - Closes PACK-4366
2025-04-28 15:10:59 +00:00

18 KiB

Items

Count: 18

Item 1: Stmt 0, ImportOfModule

import { AppRouteRouteModule } from '../../server/future/route-modules/app-route/module.compiled';

  • Hoisted
  • Side effects

Item 2: Stmt 0, ImportBinding(0)

import { AppRouteRouteModule } from '../../server/future/route-modules/app-route/module.compiled';

  • Hoisted
  • Declares: AppRouteRouteModule

Item 3: Stmt 1, ImportOfModule

import { RouteKind } from '../../server/future/route-kind';

  • Hoisted
  • Side effects

Item 4: Stmt 1, ImportBinding(0)

import { RouteKind } from '../../server/future/route-kind';

  • Hoisted
  • Declares: RouteKind

Item 5: Stmt 2, ImportOfModule

import { patchFetch as _patchFetch } from '../../server/lib/patch-fetch';

  • Hoisted
  • Side effects

Item 6: Stmt 2, ImportBinding(0)

import { patchFetch as _patchFetch } from '../../server/lib/patch-fetch';

  • Hoisted
  • Declares: _patchFetch

Item 7: Stmt 3, ImportOfModule

import * as userland from 'VAR_USERLAND';

  • Hoisted
  • Side effects

Item 8: Stmt 3, ImportBinding(0)

import * as userland from 'VAR_USERLAND';

  • Hoisted
  • Declares: userland

Item 9: Stmt 4, VarDeclarator(0)

const routeModule = new AppRouteRouteModule({
    definition: {
        kind: RouteKind.APP_ROUTE,
        page: 'VAR_DEFINITION_PAGE',
        pathname: 'VAR_DEFINITION_PATHNAME',
        filename: 'VAR_DEFINITION_FILENAME',
        bundlePath: 'VAR_DEFINITION_BUNDLE_PATH'
    },
    resolvedPagePath: 'VAR_RESOLVED_PAGE_PATH',
    nextConfigOutput,
    userland
});

  • Side effects
  • Declares: routeModule
  • Reads: AppRouteRouteModule, RouteKind, userland
  • Write: RouteKind, userland, routeModule

Item 10: Stmt 5, VarDeclarator(0)

const { requestAsyncStorage, workAsyncStorage, serverHooks } = routeModule;

  • Declares: requestAsyncStorage, workAsyncStorage, serverHooks
  • Reads: routeModule
  • Write: requestAsyncStorage, workAsyncStorage, serverHooks

Item 11: Stmt 6, VarDeclarator(0)

const originalPathname = 'VAR_ORIGINAL_PATHNAME';

  • Declares: originalPathname
  • Write: originalPathname

Item 12: Stmt 7, Normal

function patchFetch() {
    return _patchFetch({
        serverHooks,
        workAsyncStorage
    });
}

  • Hoisted
  • Declares: patchFetch
  • Reads (eventual): _patchFetch, serverHooks, workAsyncStorage
  • Write: patchFetch
  • Write (eventual): serverHooks, workAsyncStorage

Phase 1

graph TD
    Item1;
    Item5;
    Item2;
    Item6;
    Item3;
    Item7;
    Item4;
    Item8;
    Item9;
    Item10;
    Item11;
    Item12;
    Item13;
    Item13["export routeModule"];
    Item14;
    Item14["export requestAsyncStorage"];
    Item15;
    Item15["export workAsyncStorage"];
    Item16;
    Item16["export serverHooks"];
    Item17;
    Item17["export originalPathname"];
    Item18;
    Item18["export patchFetch"];
    Item2 --> Item1;
    Item3 --> Item2;
    Item4 --> Item3;

Phase 2

graph TD
    Item1;
    Item5;
    Item2;
    Item6;
    Item3;
    Item7;
    Item4;
    Item8;
    Item9;
    Item10;
    Item11;
    Item12;
    Item13;
    Item13["export routeModule"];
    Item14;
    Item14["export requestAsyncStorage"];
    Item15;
    Item15["export workAsyncStorage"];
    Item16;
    Item16["export serverHooks"];
    Item17;
    Item17["export originalPathname"];
    Item18;
    Item18["export patchFetch"];
    Item2 --> Item1;
    Item3 --> Item2;
    Item4 --> Item3;
    Item9 --> Item5;
    Item9 --> Item6;
    Item9 --> Item8;
    Item9 --> Item4;
    Item9 -.-> Item7;
    Item10 --> Item9;
    Item13 --> Item9;
    Item14 --> Item10;
    Item15 --> Item10;
    Item16 --> Item10;
    Item17 --> Item11;
    Item18 --> Item12;

Phase 3

graph TD
    Item1;
    Item5;
    Item2;
    Item6;
    Item3;
    Item7;
    Item4;
    Item8;
    Item9;
    Item10;
    Item11;
    Item12;
    Item13;
    Item13["export routeModule"];
    Item14;
    Item14["export requestAsyncStorage"];
    Item15;
    Item15["export workAsyncStorage"];
    Item16;
    Item16["export serverHooks"];
    Item17;
    Item17["export originalPathname"];
    Item18;
    Item18["export patchFetch"];
    Item2 --> Item1;
    Item3 --> Item2;
    Item4 --> Item3;
    Item9 --> Item5;
    Item9 --> Item6;
    Item9 --> Item8;
    Item9 --> Item4;
    Item9 -.-> Item7;
    Item10 --> Item9;
    Item13 --> Item9;
    Item14 --> Item10;
    Item15 --> Item10;
    Item16 --> Item10;
    Item17 --> Item11;
    Item18 --> Item12;
    Item12 --> Item7;
    Item12 --> Item10;
    Item12 -.-> Item16;
    Item12 -.-> Item15;

Phase 4

graph TD
    Item1;
    Item5;
    Item2;
    Item6;
    Item3;
    Item7;
    Item4;
    Item8;
    Item9;
    Item10;
    Item11;
    Item12;
    Item13;
    Item13["export routeModule"];
    Item14;
    Item14["export requestAsyncStorage"];
    Item15;
    Item15["export workAsyncStorage"];
    Item16;
    Item16["export serverHooks"];
    Item17;
    Item17["export originalPathname"];
    Item18;
    Item18["export patchFetch"];
    Item2 --> Item1;
    Item3 --> Item2;
    Item4 --> Item3;
    Item9 --> Item5;
    Item9 --> Item6;
    Item9 --> Item8;
    Item9 --> Item4;
    Item9 -.-> Item7;
    Item10 --> Item9;
    Item13 --> Item9;
    Item14 --> Item10;
    Item15 --> Item10;
    Item16 --> Item10;
    Item17 --> Item11;
    Item18 --> Item12;
    Item12 --> Item7;
    Item12 --> Item10;
    Item12 -.-> Item16;
    Item12 -.-> Item15;

Final

graph TD
    N0["Items: [ItemId(0, ImportOfModule)]"];
    N1["Items: [ItemId(0, ImportBinding(0))]"];
    N2["Items: [ItemId(1, ImportOfModule)]"];
    N3["Items: [ItemId(1, ImportBinding(0))]"];
    N4["Items: [ItemId(2, ImportOfModule)]"];
    N5["Items: [ItemId(2, ImportBinding(0))]"];
    N6["Items: [ItemId(3, ImportOfModule)]"];
    N7["Items: [ItemId(3, ImportBinding(0))]"];
    N8["Items: [ItemId(4, VarDeclarator(0))]"];
    N9["Items: [ItemId(5, VarDeclarator(0))]"];
    N10["Items: [ItemId(6, VarDeclarator(0)), ItemId(Export(("originalPathname", #2), "originalPathname"))]"];
    N11["Items: [ItemId(7, Normal), ItemId(Export(("patchFetch", #2), "patchFetch")), ItemId(Export(("serverHooks", #2), "serverHooks")), ItemId(Export(("workAsyncStorage", #2), "workAsyncStorage"))]"];
    N12["Items: [ItemId(Export(("requestAsyncStorage", #2), "requestAsyncStorage"))]"];
    N13["Items: [ItemId(Export(("routeModule", #2), "routeModule"))]"];
    N2 --> N0;
    N4 --> N2;
    N6 --> N4;
    N8 --> N1;
    N8 --> N3;
    N8 --> N7;
    N8 --> N6;
    N8 -.-> N5;
    N9 --> N8;
    N13 --> N8;
    N12 --> N9;
    N5 --> N4;
    N1 --> N0;
    N11 --> N9;
    N7 --> N6;
    N3 --> N2;
    N11 --> N5;

Entrypoints

{
    ModuleEvaluation: 8,
    Export(
        "originalPathname",
    ): 10,
    Export(
        "patchFetch",
    ): 11,
    Export(
        "requestAsyncStorage",
    ): 12,
    Export(
        "routeModule",
    ): 13,
    Export(
        "serverHooks",
    ): 11,
    Export(
        "workAsyncStorage",
    ): 11,
    Exports: 14,
}

Modules (dev)

Part 0

import '../../server/future/route-modules/app-route/module.compiled';

Part 1

import "__TURBOPACK_PART__" assert {
    __turbopack_part__: 0
};

Part 2

import "__TURBOPACK_PART__" assert {
    __turbopack_part__: 0
};
import '../../server/future/route-kind';

Part 3

import "__TURBOPACK_PART__" assert {
    __turbopack_part__: 2
};

Part 4

import "__TURBOPACK_PART__" assert {
    __turbopack_part__: 2
};
import '../../server/lib/patch-fetch';

Part 5

import "__TURBOPACK_PART__" assert {
    __turbopack_part__: 4
};

Part 6

import "__TURBOPACK_PART__" assert {
    __turbopack_part__: 4
};
import 'VAR_USERLAND';

Part 7

import "__TURBOPACK_PART__" assert {
    __turbopack_part__: 6
};

Part 8

import "__TURBOPACK_PART__" assert {
    __turbopack_part__: 0
};
import { AppRouteRouteModule } from '../../server/future/route-modules/app-route/module.compiled';
import "__TURBOPACK_PART__" assert {
    __turbopack_part__: 2
};
import { RouteKind } from '../../server/future/route-kind';
import "__TURBOPACK_PART__" assert {
    __turbopack_part__: 6
};
import * as userland from 'VAR_USERLAND';
import "__TURBOPACK_PART__" assert {
    __turbopack_part__: 6
};
import "__TURBOPACK_PART__" assert {
    __turbopack_part__: 5
};
const routeModule = new AppRouteRouteModule({
    definition: {
        kind: RouteKind.APP_ROUTE,
        page: 'VAR_DEFINITION_PAGE',
        pathname: 'VAR_DEFINITION_PATHNAME',
        filename: 'VAR_DEFINITION_FILENAME',
        bundlePath: 'VAR_DEFINITION_BUNDLE_PATH'
    },
    resolvedPagePath: 'VAR_RESOLVED_PAGE_PATH',
    nextConfigOutput,
    userland
});
export { routeModule as a } from "__TURBOPACK_VAR__" assert {
    __turbopack_var__: true
};
export { };

Part 9

import { a as routeModule } from "__TURBOPACK_PART__" assert {
    __turbopack_part__: -8
};
const { requestAsyncStorage, workAsyncStorage, serverHooks } = routeModule;
export { requestAsyncStorage as b } from "__TURBOPACK_VAR__" assert {
    __turbopack_var__: true
};
export { workAsyncStorage as c } from "__TURBOPACK_VAR__" assert {
    __turbopack_var__: true
};
export { serverHooks as d } from "__TURBOPACK_VAR__" assert {
    __turbopack_var__: true
};

Part 10

const originalPathname = 'VAR_ORIGINAL_PATHNAME';
export { originalPathname };
export { originalPathname as e } from "__TURBOPACK_VAR__" assert {
    __turbopack_var__: true
};

Part 11

import { c as workAsyncStorage } from "__TURBOPACK_PART__" assert {
    __turbopack_part__: -9
};
import "__TURBOPACK_PART__" assert {
    __turbopack_part__: 4
};
import { patchFetch as _patchFetch } from '../../server/lib/patch-fetch';
import { d as serverHooks } from "__TURBOPACK_PART__" assert {
    __turbopack_part__: -9
};
function patchFetch() {
    return _patchFetch({
        serverHooks,
        workAsyncStorage
    });
}
export { patchFetch };
export { serverHooks };
export { workAsyncStorage };
export { patchFetch as f } from "__TURBOPACK_VAR__" assert {
    __turbopack_var__: true
};

Part 12

import { b as requestAsyncStorage } from "__TURBOPACK_PART__" assert {
    __turbopack_part__: -9
};
export { requestAsyncStorage };

Part 13

import { a as routeModule } from "__TURBOPACK_PART__" assert {
    __turbopack_part__: -8
};
export { routeModule };

Part 14

export { originalPathname } from "__TURBOPACK_PART__" assert {
    __turbopack_part__: "export originalPathname"
};
export { patchFetch } from "__TURBOPACK_PART__" assert {
    __turbopack_part__: "export patchFetch"
};
export { serverHooks } from "__TURBOPACK_PART__" assert {
    __turbopack_part__: "export serverHooks"
};
export { workAsyncStorage } from "__TURBOPACK_PART__" assert {
    __turbopack_part__: "export workAsyncStorage"
};
export { requestAsyncStorage } from "__TURBOPACK_PART__" assert {
    __turbopack_part__: "export requestAsyncStorage"
};
export { routeModule } from "__TURBOPACK_PART__" assert {
    __turbopack_part__: "export routeModule"
};

Merged (module eval)

import "__TURBOPACK_PART__" assert {
    __turbopack_part__: 0
};
import { AppRouteRouteModule } from '../../server/future/route-modules/app-route/module.compiled';
import "__TURBOPACK_PART__" assert {
    __turbopack_part__: 2
};
import { RouteKind } from '../../server/future/route-kind';
import "__TURBOPACK_PART__" assert {
    __turbopack_part__: 6
};
import * as userland from 'VAR_USERLAND';
import "__TURBOPACK_PART__" assert {
    __turbopack_part__: 5
};
const routeModule = new AppRouteRouteModule({
    definition: {
        kind: RouteKind.APP_ROUTE,
        page: 'VAR_DEFINITION_PAGE',
        pathname: 'VAR_DEFINITION_PATHNAME',
        filename: 'VAR_DEFINITION_FILENAME',
        bundlePath: 'VAR_DEFINITION_BUNDLE_PATH'
    },
    resolvedPagePath: 'VAR_RESOLVED_PAGE_PATH',
    nextConfigOutput,
    userland
});
export { routeModule as a } from "__TURBOPACK_VAR__" assert {
    __turbopack_var__: true
};
export { };

Entrypoints

{
    ModuleEvaluation: 8,
    Export(
        "originalPathname",
    ): 10,
    Export(
        "patchFetch",
    ): 11,
    Export(
        "requestAsyncStorage",
    ): 12,
    Export(
        "routeModule",
    ): 13,
    Export(
        "serverHooks",
    ): 14,
    Export(
        "workAsyncStorage",
    ): 15,
    Exports: 16,
}

Modules (prod)

Part 0

import '../../server/future/route-modules/app-route/module.compiled';

Part 1

import "__TURBOPACK_PART__" assert {
    __turbopack_part__: 0
};

Part 2

import "__TURBOPACK_PART__" assert {
    __turbopack_part__: 0
};
import '../../server/future/route-kind';

Part 3

import "__TURBOPACK_PART__" assert {
    __turbopack_part__: 2
};

Part 4

import "__TURBOPACK_PART__" assert {
    __turbopack_part__: 2
};
import '../../server/lib/patch-fetch';

Part 5

import "__TURBOPACK_PART__" assert {
    __turbopack_part__: 4
};

Part 6

import "__TURBOPACK_PART__" assert {
    __turbopack_part__: 4
};
import 'VAR_USERLAND';

Part 7

import "__TURBOPACK_PART__" assert {
    __turbopack_part__: 6
};

Part 8

import "__TURBOPACK_PART__" assert {
    __turbopack_part__: 0
};
import { AppRouteRouteModule } from '../../server/future/route-modules/app-route/module.compiled';
import "__TURBOPACK_PART__" assert {
    __turbopack_part__: 2
};
import { RouteKind } from '../../server/future/route-kind';
import "__TURBOPACK_PART__" assert {
    __turbopack_part__: 6
};
import * as userland from 'VAR_USERLAND';
import "__TURBOPACK_PART__" assert {
    __turbopack_part__: 6
};
const routeModule = new AppRouteRouteModule({
    definition: {
        kind: RouteKind.APP_ROUTE,
        page: 'VAR_DEFINITION_PAGE',
        pathname: 'VAR_DEFINITION_PATHNAME',
        filename: 'VAR_DEFINITION_FILENAME',
        bundlePath: 'VAR_DEFINITION_BUNDLE_PATH'
    },
    resolvedPagePath: 'VAR_RESOLVED_PAGE_PATH',
    nextConfigOutput,
    userland
});
export { routeModule as a } from "__TURBOPACK_VAR__" assert {
    __turbopack_var__: true
};
export { };

Part 9

import { a as routeModule } from "__TURBOPACK_PART__" assert {
    __turbopack_part__: -8
};
const { requestAsyncStorage, workAsyncStorage, serverHooks } = routeModule;
export { requestAsyncStorage as b } from "__TURBOPACK_VAR__" assert {
    __turbopack_var__: true
};
export { workAsyncStorage as c } from "__TURBOPACK_VAR__" assert {
    __turbopack_var__: true
};
export { serverHooks as d } from "__TURBOPACK_VAR__" assert {
    __turbopack_var__: true
};

Part 10

const originalPathname = 'VAR_ORIGINAL_PATHNAME';
export { originalPathname };
export { originalPathname as e } from "__TURBOPACK_VAR__" assert {
    __turbopack_var__: true
};

Part 11

import { c as workAsyncStorage } from "__TURBOPACK_PART__" assert {
    __turbopack_part__: -9
};
import "__TURBOPACK_PART__" assert {
    __turbopack_part__: 4
};
import { patchFetch as _patchFetch } from '../../server/lib/patch-fetch';
import { d as serverHooks } from "__TURBOPACK_PART__" assert {
    __turbopack_part__: -9
};
function patchFetch() {
    return _patchFetch({
        serverHooks,
        workAsyncStorage
    });
}
export { patchFetch };
export { patchFetch as f } from "__TURBOPACK_VAR__" assert {
    __turbopack_var__: true
};

Part 12

import { b as requestAsyncStorage } from "__TURBOPACK_PART__" assert {
    __turbopack_part__: -9
};
export { requestAsyncStorage };

Part 13

import { a as routeModule } from "__TURBOPACK_PART__" assert {
    __turbopack_part__: -8
};
export { routeModule };

Part 14

import { d as serverHooks } from "__TURBOPACK_PART__" assert {
    __turbopack_part__: -9
};
export { serverHooks };

Part 15

import { c as workAsyncStorage } from "__TURBOPACK_PART__" assert {
    __turbopack_part__: -9
};
export { workAsyncStorage };

Part 16

export { originalPathname } from "__TURBOPACK_PART__" assert {
    __turbopack_part__: "export originalPathname"
};
export { patchFetch } from "__TURBOPACK_PART__" assert {
    __turbopack_part__: "export patchFetch"
};
export { requestAsyncStorage } from "__TURBOPACK_PART__" assert {
    __turbopack_part__: "export requestAsyncStorage"
};
export { routeModule } from "__TURBOPACK_PART__" assert {
    __turbopack_part__: "export routeModule"
};
export { serverHooks } from "__TURBOPACK_PART__" assert {
    __turbopack_part__: "export serverHooks"
};
export { workAsyncStorage } from "__TURBOPACK_PART__" assert {
    __turbopack_part__: "export workAsyncStorage"
};

Merged (module eval)

import "__TURBOPACK_PART__" assert {
    __turbopack_part__: 0
};
import { AppRouteRouteModule } from '../../server/future/route-modules/app-route/module.compiled';
import "__TURBOPACK_PART__" assert {
    __turbopack_part__: 2
};
import { RouteKind } from '../../server/future/route-kind';
import "__TURBOPACK_PART__" assert {
    __turbopack_part__: 6
};
import * as userland from 'VAR_USERLAND';
const routeModule = new AppRouteRouteModule({
    definition: {
        kind: RouteKind.APP_ROUTE,
        page: 'VAR_DEFINITION_PAGE',
        pathname: 'VAR_DEFINITION_PATHNAME',
        filename: 'VAR_DEFINITION_FILENAME',
        bundlePath: 'VAR_DEFINITION_BUNDLE_PATH'
    },
    resolvedPagePath: 'VAR_RESOLVED_PAGE_PATH',
    nextConfigOutput,
    userland
});
export { routeModule as a } from "__TURBOPACK_VAR__" assert {
    __turbopack_var__: true
};
export { };