Repository navigation
CRA5 Bug: require a submodule of a package (i.e. my-package/sub-module) returns a string instead of the module #11889
Description
Describe the bug
Doing require('something/something-else') returns a string — what looks like the path to the bundle file with the lib — instead of returning the actual module that can be used in code. Specifically, the issue was observed with require('nanoid/non-secure').
Using import * as nano from 'nanoid/non-secure' works correctly but require('nanoid/non-secure') doesn't. Big part of the issue is that if it's a dependency of your project that's using it with require, you have no control on your app to change the syntax to import instead of require to workaround this issue.
Using vanilla Webpack 5 works correctly (outside of react-scripts). Downgrading to react-scripts@^4 also makes it all work correctly. My guess is that it's something in the react-scripts@5 Webpack configuration.
Did you try recovering your dependencies?
No issues with the module tree. Issue is reproducible on a freshly created react-app. It even happens across different yarn setups with versions 1.22.17 and 3.1.0.
$ yarn --version
1.22.17
$ yarn --version
3.1.0
Which terms did you search for in User Guide?
"submodules", "require", "require submodule"
Environment
$ yarn create react-app --info
yarn create v1.22.17
[1/4] 🔍 Resolving packages...
[2/4] 🚚 Fetching packages...
[3/4] 🔗 Linking dependencies...
[4/4] 🔨 Building fresh packages...
success Installed "create-react-app@5.0.0" with binaries:
- create-react-app
Environment Info:
current version of create-react-app: 5.0.0
running from /Users/rart/.config/yarn/global/node_modules/create-react-app
System:
OS: macOS 12.1
CPU: (12) x64 Intel(R) Core(TM) i9-8950HK CPU @ 2.90GHz
Binaries:
Node: 16.13.0 - /var/folders/5g/4p2kn0ks3x7fj848t3cvt4rw0000gn/T/yarn--1641400000423-0.5498156139928032/node
Yarn: 1.22.17 - /var/folders/5g/4p2kn0ks3x7fj848t3cvt4rw0000gn/T/yarn--1641400000423-0.5498156139928032/yarn
npm: 8.1.4 - ~/.nvm/versions/node/v16.13.0/bin/npm
Browsers:
Chrome: 97.0.4692.71
Edge: Not Found
Firefox: 89.0.2
Safari: 15.2
npmPackages:
react: 17.0.2
react-dom: 17.0.2
react-scripts: 5.0.0
npmGlobalPackages:
create-react-app: Not Found
✨ Done in 2.29s.
Steps to reproduce
yarn add nanoidconst nano = require('nanoid/non-secure')- Inspect the value of const
nano; it should be a module with two functions (nanoidandcustomAlphabet), but instead is a path that looks like/static/media/index.617173a3029a82877c86.cjs- If you — or most importantly a dependency of your project — uses nanoid (e.g.
const { nanoid } = require('nanoid/non-secure')),nanoidwill be undefined and cause a runtime exception when it's accessed.
- If you — or most importantly a dependency of your project — uses nanoid (e.g.
Expected behavior
require('something/something-else') should return the module, an object with whatever is exported, not a string path to a file.
For example require('nanoid/non-secure'), should return { nanoid: ƒ nanoid(), customAlphabet: ƒ customAlphabet() }
Actual behavior
The require('something/something-else') statement returns a string with what looks like the path to the bundle file that contains the lib instead of returning the actual module that can be invoked in code.
Using import * as nano from 'nanoid/non-secure' works correctly but require('nanoid/non-secure') doesn't. Big part of the issue is that if it's a dependency of your project that's using it with require, you have no control on your app to change the syntax to import instead of require to workaround this issue.
Using vanilla Webpack 5 works correctly (no react-scripts involved). Downgrading to react-scripts@^4 also makes it all work correctly. My guess is that it's something in the react-scripts@5 Webpack configuration.
Reproducible demo
I'm attaching 3 things:
- An app created using
yarn create react-appthat shows the issue: react-scripts-5-issue.zip - A codesandbox download that shows the issue: react-scripts-5-issue-submodules-codesandbox.zip. The code example ran in codesandbox actually works correctly, but if you download it straight from codesandbox, install it (i.e. yarn/npm install), and run the react scripts the bug is reproduced. I don't think code sandbox actually runs react scripts and that's why it works. In the same way that trying the same thing on a vanilla Webpack setup works. Or downgrading the app to react-script@^4 works too.
- A plain vanilla Webpack setup that shows that it's not a Webpack issue per se: react-scripts-5-issue-vanilla-webpack.zip
Activity
[-]Bug: `require` a submodule of a package (i.e. `my-package/sub-module`) returns a string instead of the module[/-][+]CRA5 Bug: `require` a submodule of a package (i.e. `my-package/sub-module`) returns a string instead of the module[/+]zzmingo commentedon Jan 18, 2022
I also have this issue, any workaround for this?
sunz7 commentedon Jan 18, 2022
same here
MatejBivr commentedon Jan 18, 2022
same issue
andreinemikin commentedon Feb 20, 2022
Same issue
umid-podo commentedon Mar 5, 2022
same issue
gdethier commentedon May 2, 2022
Impacted as well.
gdethier commentedon May 2, 2022
I think I found the issue. In order to test different webpack configurations, I ejected then directly modified
config/webpack.config.js. The problem is in the last module rule (the one for the file loader):cjsfiles are not excluded.If you change the rule as follows, it works (
cjswas added to the list of excluded JS-like extensions):gdethier commentedon May 2, 2022
In the very short term, a workaround is to use craco in order to add the exclusion. Your
craco.config.jsfile would then look like this:fix: exclude CJS files with file loader (react#11889)
crazy4chrissi commentedon Sep 5, 2022
I guess this pull request should also fix this issue:
#12605
Use .js extension for CJS, and .mjs for ESM
Use .js extension for CJS, and .mjs for ESM
15 remaining items
(#147) Update Node, Webpack, Misc security updates
(#147) Update Node, Webpack, Misc security updates
(#147) Update Node, Webpack, Misc security updates
(#147) Update Node, Webpack, Misc security updates
(#147) Update Node, Webpack, Misc security updates
(#147) Update Node, Webpack, Misc security updates
(#147) Update Node, Webpack, Misc security updates
(#147) Update Node, Webpack, Misc security updates
(#147) Update Node, Webpack, Misc security updates
(#147) Update Node, Webpack, Misc security updates
(#147) Update Node, Webpack, Misc security updates
(#147) Update Node, Webpack, Misc security updates
(#147) Update Node, Webpack, Misc security updates
(#147) Update Node, Webpack, Misc security updates
updated dependencies and added craco for custom webpack config due to…