davidmyersdev/vite-plugin-node-polyfills

Bug: importing 'crypto' polyfill leads to error `exports is not defined` with yarn build && yarn preview in nuxt

clangenb opened this issue · 7 comments

The following commit breaks yarn build && yarn preview: integritee-network/incognitee-campaign-page@87272d0.

However, unlike #90, I can't opt out of crypto as I need its function.

The code runs fine with yarn dev.

@clangenb did you find any solutions for this?
I am encountering this as well.

I finally re-implemented our rsa crypto with the webcrypto api, so we don't need any polyfills at all. I would recommend such an approach if it is feasible in your case.

same issue , any idea?

I can only repeat what I mentioned above. If the crypto polyfill is needed because of a 3rd party dependency, I recommend looking for another dependency, as most maintained libraries should have switched to use the WebCrypto Api. If it is because of your own code (like in my case), I suggest rewriting the crypto stuff with WebCrypto API as I did here encointer/encointer-js#101, with a follow-up fix in encointer/encointer-js#105.

@clangenb I can't rewrite the code because it's subpackage dependent.

After two hours of code retracing I found that the crypto-broserify dependent randomfill package was not transpiled by rollup.

sourcecode: randomfill:L39

the Error: image

Does that mean exports can't work with if by rollup?

I am not an JS expert, but I would assume that this is a bug in either browserify or randomfill and that this should work in general.

I used the replace plugin to change the code in question,

nuxt.config.ts

import { replaceCodePlugin } from 'vite-plugin-replace';

...
vite: {
    plugins: [
      replaceCodePlugin({
        replacements: [
          {
            from: `if ((crypto && crypto.getRandomValues) || !process.browser) {
  exports.randomFill = randomFill
  exports.randomFillSync = randomFillSync
} else {
  exports.randomFill = oldBrowser
  exports.randomFillSync = oldBrowser
}`,
            to: `exports.randomFill = randomFill
exports.randomFillSync = randomFillSync`,
          },
        ],
      }),
}