developit / microbundle

📦 Zero-configuration bundler for tiny modules.
https://npm.im/microbundle
MIT License
8.04k stars 362 forks source link

react-jsx does not work with Preact #857

Open Klukies opened 3 years ago

Klukies commented 3 years ago

Hi

Error

I've recently made the switch to microbundle for a project that uses Preact and TypeScript. Following the docs, and me having the latest version of TypeScript, I put the following in my tsconfig:

{
  "compilerOptions": {
    "jsx": "react-jsx",
    "jsxImportSource": "preact",
    //...
  }
}

However when building with microbundle I get the following error: rpt2: options error TS5089: Option 'jsxFactory' cannot be specified when option 'jsx' is 'react-jsx'. This seems weird behaviour as I have not specified the jsxFactory.

Combined with this I also get an error about the 'jsxFragmentFactory' having to be provided to use JSX Fragments, but I presume that is due to the fact the the jsxFactory is somehow incorrect.

I tried hardcoding the values from the config in my script (without success) by doing the following

microbundle --jsx react-jsx --jsxImportSource preact

Possible solution

I've been able to get microbundle working if I switch back to the tsconfig for older versions of TypeScript, so I'll be opting into this behaviour for now. For reference this is what the old config is:

{
  "compilerOptions": {
    "jsx": "react",
    "jsxFactory": "h",
    "jsxFragmentFactory": "Fragment",
    //...
  }
}
rschristian commented 3 years ago

Hmm, we set jsxFactory by default, and I guess rpt2 doesn't realize this needs to be removed if the tsconfig.json sets the jsx key to react-jsx.

https://github.com/developit/microbundle/blob/81088002d3581a093e177407308a934331b6b843/src/index.js#L518-L535

It's likely an upstream issue, but I haven't yet had time to delve into rpt2 yet to double check on that.

Thanks for providing the work around in case anyone else runs into this in the meantime.

fuunnx commented 3 years ago

Another workaround that worked for me (with React 17), is to provide an empty string for jsxFactory and jsxFragmentFactory :

{
    "jsx": "react-jsx",
    "jsxFactory": "",
    "jsxFragmentFactory": ""
}