Current behavior:
I'm using following emotion 11 with React Native 0.63.2,
"@emotion/native": "11.0.0-next.15",
"@emotion/primitives-core": "11.0.0-next.15",
"@emotion/react": "11.0.0-next.15",
And when I build and run I'm getting following error in the runtime,
While trying to resolve module stylis from file /****/node_modules/@emotion/cache/dist/cache.browser.cjs.js, the package /****/node_modules/stylis/package.json was successfully found. However, this package itself specifies a main module field that could not be resolved (/****/node_modules/stylis/dist/stylis.cjs. Indeed, none of these files exist:
/**/node_modules/stylis/dist/stylis.cjs(.native|.ios.js|.native.js|.js|.ios.json|.native.json|.json|.ios.ts|.native.ts|.ts|.ios.tsx|.native.tsx|.tsx|.ios.svg|.native.svg|.svg)
To reproduce:
Use emotion 11 packages with latest react native sample.
Expected behavior:
It should not throw any error.
Environment information:
Reat Native: 0.63.2
"@emotion/native": "11.0.0-next.15",
"@emotion/primitives-core": "11.0.0-next.15",
"@emotion/react": "11.0.0-next.15"
Hello, I encountered this issue recently too. The problem is with the stylis depedency as their main module has a cjsextension. The Metro config included in Create React App starter does not include cjsmodules by default, so you have to add it as such:
metro.config.js
const { getDefaultConfig } = require('metro-config');
module.exports = (async () => {
const {
resolver: { sourceExts, assetExts }
} = await getDefaultConfig();
return {
resolver: {
sourceExts: [...sourceExts, 'cjs']
}
};
})();
This really is a bug in Metro. I'll think about changing this in Stylis just as a workaround but please report this to the Metro team.
They should load files using the node's algorithm (albeit the enhanced one, but basic stuff should work according to this algorithm): https://nodejs.org/api/modules.html#modules_all_together . This describes the first step of LOAD_AS_FILE as:
If X is a file, load X as its file extension format.
What "as its file extension format" means? It means that it should load it using the registered extensions but if the extensions i not being found as registered then it always default to .js:
https://github.com/nodejs/node/blob/423490423264d1b7624d578a421a1bedecbc5d2e/lib/internal/modules/cjs/loader.js#L395-L407
For anyone else trying to put this puzzle together, there are also open issues for this on stylis and metro.
https://github.com/facebook/metro/issues/535
https://github.com/thysultan/stylis.js/issues/233
Thanks @ioveracker, @Andarist for the details.
Edited: _Thank you @efoken_
If you're using Expo try changing your app.json or app.config.(ts|js):
{
"packagerOpts": {
"sourceExts": ["cjs"]
}
The newly published [email protected] should remedy this issue. Please check it out.
Great thanks..
Most helpful comment
Hello, I encountered this issue recently too. The problem is with the stylis depedency as their main module has a
cjsextension. The Metro config included in Create React App starter does not includecjsmodules by default, so you have to add it as such:metro.config.js