Search code examples
babeljscreate-react-appparceljs

A constructor from a node module I'm importing works when using Create React App, but errors in ParcelJS. What is going on?


I'm converting a project that was built using Create React App to use ParcelJS as a bundler instead. Strangely, a dependency that I imported during development (@twilio/voice-sdk) works fine in the CRA version of the application, but I get the following error when I try to invoke the constructor in the Parcel version:

TypeError: (this._options.AudioHelper || audiohelper_1.default) is not a constructor

The package is identical between both (@v2.1.1, the latest). I'm importing using ESM syntax, so:

import { Device } from '@twilio/voice-sdk'

I trying using CommonJS syntax (require) and it still didn't work. I've dug into the compiled code, and that seems to be the issue. I imagine there are a lot of differences, but one that I've noticed is here:

Side by side comparison of CRA and ParcelJS compiled code

On the left is the code compiled by Create React App, which does seem to be exporting something more substantial than on the left - is the export just an empty object? If so, it's no wonder I'm getting a constructor error.

Unfortunately, no amount of googling and SO sleuthing has clarified what I could do to make ParcelJS transpile this dependency properly, if that's the issue. I've tried to make the babel config for ParcelJS match CRA more closely by adding the following to a babel.config.json

{
  "plugins": [
    "@babel/plugin-transform-modules-commonjs"
  ]
}

But no luck. Any ideas from where to go from here, or is it time to switch to Webpack?


Solution

  • It looks like Twilio package has a problem when using Parcel 2: https://github.com/twilio/twilio-voice.js/issues/101