ai / nanoid

A tiny (124 bytes), secure, URL-friendly, unique string ID generator for JavaScript
https://zelark.github.io/nano-id-cc/
MIT License
24.22k stars 790 forks source link

TypeError: nanoid is not a function when using react native web and styled components #429

Open eshankvaish opened 1 year ago

eshankvaish commented 1 year ago

This seems to be related to https://github.com/postcss/postcss/issues/1727. So I was using react native on the web along with styled-components that use postcss. While everything was working as expected on Android and iOS but each time I tried using the app on the web, I kept on getting the error nanoid is not a function at https://github.com/postcss/postcss/blob/main/lib/input.js#L58. Upon debugging, I figured out that the nanoid version 3.3.6 was causing the issue due to breaking CJS support probably as mentioned in https://github.com/ai/nanoid/issues/422 as well. Upon adding the following resolutions to my package.json file, the error was finally resolved:

"resolutions": {
    "**/nanoid": "3.3.5"
}

Here is the link to a sample repository to reproduce the issue: https://github.com/eshankvaish/nanoid-issue and how I fixed the issue: https://github.com/eshankvaish/nanoid-issue/pull/1.

image

ai commented 1 year ago

It looks like a bug in package manager.

PostCSS already requires only 3.x branch. Package manager should not provide 4.x for PostCSS.

eshankvaish commented 1 year ago

I was actually mentioning about 3.x branch only and here it points out to ^3.3.6 specifically: https://github.com/postcss/postcss/blob/main/package.json#L82. Further, the issue is found in 3.3.6 only

ai commented 1 year ago

I got the reason (sorry, I missed with https://github.com/postcss/postcss/issues/1727 where we had broken lock file)! 3.3.5 was broken. You just need to update to 3.3.6.

eshankvaish commented 1 year ago

But the issue seems to be caused on 3.3.6 itself and working fine on 3.3.5 if you check the attached repo for reproduction along with the lock file in the same repo. I guess there was some breaking change in the 3.3.6 release as compared to 3.3.5. I noticed that when I was using 3.3.6, I was getting the link to the file instead of the object exposed by it when using:

const { nanoid } = require('nanoid/no-secure')

I tried finding the diff between the 3.3.5 and 3.3.6 but couldn't find the later tag 🧐

eshankvaish commented 1 year ago

Also just to mention again, I had to downgrade to 3.3.5 to make the code work.

ai commented 1 year ago

Very strange. The issue of 3.3.5 that it was released without dual CJS+ESM support (only CJS files), which we do on publish state.

Maybe you have some issues with building ESM for RN?

ai commented 1 year ago

Unfortunatelly, I can’t help you in debug since I have no RN and iOS dev tools.

The best way to check content is Code tab

eshankvaish commented 1 year ago

Very strange. The issue of 3.3.5 that it was released without dual CJS+ESM support (only CJS files), which we do on publish state.

Maybe you have some issues with building ESM for RN?

This maybe possible, I'll check and update here by tomorrow with an update.

eshankvaish commented 1 year ago

Unfortunatelly, I can’t help you in debug since I have no RN and iOS dev tools.

The best way to check content is Code tab

Oh, got it. I'll try to figure out on my own then. Just FYI, the RN repo I shared uses expo internally so you can run the app on web to the least with couple of yarn commands if you want but anyways thanks for providing the details.

eshankvaish commented 1 year ago

So just in order to confirm the working, I imported the nanoid using the import statement side by side with the existing require statement as in the attached screenshot: image

I noticed that while the import statement was working fine, the regular import didn't work.

image

I'll try further to figure out if my setup is unable to bundle the ESM because the same set up of styled components works with a React based app out of the box.

dev-willyy commented 11 months ago

This doesn't seem to work at the moment. I have added

"resolutions": { "**/nanoid": "3.3.5" }

into the package.json file of my root directory, yet I still get this error. It's been almost a week now, and I'm yet to get a fix. I'll be glad if anyone could be of help

ai commented 4 months ago

@neeraj500 there is something different wrong in your system. I am removing this suggestion because it is dangerous (you should not use nanoid instead of nanoid/non-secure).

Open another issue, since you have a non-relevant bug.

ai commented 4 months ago

Use resolutions carefully, it could lead to unexpected behavior of libraries.

eusouoviana commented 2 months ago

Still happening.