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

Node modules inlined in dev mode .next/server/app files #53128

Closed
1 task done
jeengbe opened this issue Jul 24, 2023 · 3 comments
Closed
1 task done

Node modules inlined in dev mode .next/server/app files #53128

jeengbe opened this issue Jul 24, 2023 · 3 comments
Labels
bug Issue was opened via the bug report template. stale The issue has not seen recent activity.

Comments

@jeengbe
Copy link

jeengbe commented Jul 24, 2023

Verify canary release

  • I verified that the issue exists in the latest Next.js canary release

Provide environment information

Operating System:
      Platform: linux
      Arch: x64
      Version: #1 SMP Fri Jan 27 02:56:13 UTC 2023
    Binaries:
      Node: 18.13.0
      npm: 9.8.0
      Yarn: 1.22.18
      pnpm: 8.6.9
    Relevant Packages:
      next: 13.4.12
      eslint-config-next: 13.4.12
      react: 18.2.0
      react-dom: 18.2.0
      typescript: 5.1.3
    Next.js Config:
      output: N/A

Which area(s) of Next.js are affected? (leave empty if unsure)

App Router

Link to the code that reproduces this issue or a replay of the bug

https://github.com/DigitalerSchulhof/digitaler-schulhof

To Reproduce

Setup is complex as it requires a locally linked package that isn't published to anywhere yet. I hope this issue is fixable in theory only, however, I'd be happy to provide code and instructions if required.

Describe the Bug

When running next dev, the generated .next/server/app/... files are several 10s of MB large since they contain all required node modules inlined. next/dist modules and native Node.js modules are the only ones that required from actual node_modules:

/***/ "dns":
/*!**********************!*\
  !*** external "dns" ***!
  \**********************/
/***/ ((module) => {

"use strict";
module.exports = require("dns");

/***/ }),

All remaining files are inlined along the following way:

/***/ "(rsc)/./node_modules/.pnpm/@protobufjs+inquire@1.1.0/node_modules/@protobufjs/inquire/index.js":
/*!************************************************************************************************!*\
  !*** ./node_modules/.pnpm/@protobufjs+inquire@1.1.0/node_modules/@protobufjs/inquire/index.js ***!
  \************************************************************************************************/
/***/ ((module) => {

"use strict";
eval("\nmodule.exports = inquire;\n/**\r\n * Requires a module only if available.\r\n * @memberof util\r\n * @param {string} moduleName Module to require\r\n * @returns {?Object} Required module if available and not empty, otherwise `null`\r\n */ function inquire(moduleName) {\n    try {\n        var mod = eval(\"quire\".replace(/^/, \"re\"))(moduleName); // eslint-disable-line no-eval\n        if (mod && (mod.length || Object.keys(mod).length)) return mod;\n    } catch (e) {} // eslint-disable-line no-empty\n    return null;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvLnBucG0vQHByb3RvYnVmanMraW5xdWlyZUAxLjEuMC9ub2RlX21vZHVsZXMvQHByb3RvYnVmanMvaW5xdWlyZS9pbmRleC5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiQSxPQUFPQyxPQUFPLEdBQUdDO0FBRWpCOzs7OztDQUtDLEdBQ0QsU0FBU0EsUUFBUUMsVUFBVTtJQUN2QixJQUFJO1FBQ0EsSUFBSUMsTUFBTUMsS0FBSyxRQUFRQyxPQUFPLENBQUMsS0FBSSxPQUFPSCxhQUFhLDhCQUE4QjtRQUNyRixJQUFJQyxPQUFRQSxDQUFBQSxJQUFJRyxNQUFNLElBQUlDLE9BQU9DLElBQUksQ0FBQ0wsS0FBS0csTUFBTSxHQUM3QyxPQUFPSDtJQUNmLEVBQUUsT0FBT00sR0FBRyxDQUFDLEVBQUUsK0JBQStCO0lBQzlDLE9BQU87QUFDWCIsInNvdXJjZXMiOlsid2VicGFjazovL0Bkc2gvZnJvbnRlbmQvLi9ub2RlX21vZHVsZXMvLnBucG0vQHByb3RvYnVmanMraW5xdWlyZUAxLjEuMC9ub2RlX21vZHVsZXMvQHByb3RvYnVmanMvaW5xdWlyZS9pbmRleC5qcz8zMzQ4Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xyXG5tb2R1bGUuZXhwb3J0cyA9IGlucXVpcmU7XHJcblxyXG4vKipcclxuICogUmVxdWlyZXMgYSBtb2R1bGUgb25seSBpZiBhdmFpbGFibGUuXHJcbiAqIEBtZW1iZXJvZiB1dGlsXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVOYW1lIE1vZHVsZSB0byByZXF1aXJlXHJcbiAqIEByZXR1cm5zIHs/T2JqZWN0fSBSZXF1aXJlZCBtb2R1bGUgaWYgYXZhaWxhYmxlIGFuZCBub3QgZW1wdHksIG90aGVyd2lzZSBgbnVsbGBcclxuICovXHJcbmZ1bmN0aW9uIGlucXVpcmUobW9kdWxlTmFtZSkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB2YXIgbW9kID0gZXZhbChcInF1aXJlXCIucmVwbGFjZSgvXi8sXCJyZVwiKSkobW9kdWxlTmFtZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZXZhbFxyXG4gICAgICAgIGlmIChtb2QgJiYgKG1vZC5sZW5ndGggfHwgT2JqZWN0LmtleXMobW9kKS5sZW5ndGgpKVxyXG4gICAgICAgICAgICByZXR1cm4gbW9kO1xyXG4gICAgfSBjYXRjaCAoZSkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbn1cclxuIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJpbnF1aXJlIiwibW9kdWxlTmFtZSIsIm1vZCIsImV2YWwiLCJyZXBsYWNlIiwibGVuZ3RoIiwiT2JqZWN0Iiwia2V5cyIsImUiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/.pnpm/@protobufjs+inquire@1.1.0/node_modules/@protobufjs/inquire/index.js\n");

/***/ }),

Expected Behavior

This is an issue for several reasons:

  • I assume this is a very costly process. It unnecessarily copies numerous megabytes and writes them to disk (for every change, I'd assume).
    Wild guess (I haven't followed the thread in a while), but this might be related to !48748 and is probably the reason I get 1000+ modules logged: compiled client and server successfully in 5.1s (1150 modules)
  • Some modules like @grpc/grpc-js or even graphql require reference equality for certain instanceof checks, which fail when this is used: Channel credentials must be a ChannelCredentials object.

The latter fails because the credentials object is created from the (rsc)/./node_modules/.pnpm/@grpc+grpc-js@1.8.18/node_modules/@grpc/grpc-js/build/src/channel-credentials.js file. The gRPC client is stored in a separate, locally linked package that doesn't share node_modules with the main project. I think this is important because if it did, it would use the same modules.

Because the @dsh/protocols package is linked to ../protocols (linked because still in development), that file uses the (rsc)/./node_modules/.pnpm/@grpc+grpc-js@1.8.18/node_modules/@grpc/grpc-js/build/src/channel-credentials.js object to do the instanceof check. This obviously fails.

@jeengbe jeengbe added the bug Issue was opened via the bug report template. label Jul 24, 2023
@jeengbe
Copy link
Author

jeengbe commented Jul 24, 2023

If I request the package explicitly with import * as grpc from '../../../../../protocols/clients/ts/node_modules/@grpc/grpc-js';, it uses the correct inlined module and everything works as expected. There is now also only (rsc)/../protocols/clients/ts/node_modules/.pnpm/@grpc+grpc-js@1.8.18/node_modules/@grpc/grpc-js/build/src/channel-credentials.js in the bundle.

@nextjs-bot
Copy link
Collaborator

This issue has been automatically marked as stale due to two years of inactivity. It will be closed in 7 days unless there’s further input. If you believe this issue is still relevant, please leave a comment or provide updated details. Thank you.

@nextjs-bot nextjs-bot added the stale The issue has not seen recent activity. label Feb 17, 2025
@nextjs-bot
Copy link
Collaborator

This issue has been automatically closed due to two years of inactivity. If you’re still experiencing a similar problem or have additional details to share, please open a new issue following our current issue template. Your updated report helps us investigate and address concerns more efficiently. Thank you for your understanding!

@nextjs-bot nextjs-bot closed this as not planned Won't fix, can't repro, duplicate, stale Feb 24, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Issue was opened via the bug report template. stale The issue has not seen recent activity.
Projects
None yet
Development

No branches or pull requests

2 participants