developit / developit/microbundle

Imports within try blocks are hoisted incorrectly

Abierto
#639 3 comentarios 0 reacciones 0 asignados Ver en GitHub
upstream
Lenguaje dominante
JavaScript
Estrellas
8.1k
Forks
358
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

### Problem

Microbundle hoists a `require()` call out of a `try {}` block in a dependency. When that `require()` call throws, it is not caught by the `try {}` block anymore.

I'm not sure whether this is an issue with microbundle or rollup. A solution to this would be not to hoist `require()` calls if they are in a nested block or wrap them in a function to evaluate them lazily.

### How to reproduce

Make sure you have `yarn` installed globally, then run following commands:

```sh
mkdir bug-test
cd bug-test
yarn add microbundle esm
echo "import 'esm'" > test.js
yarn microbundle test.js --format cjs --target node --external none
node dist/bug-test.js
```

### Expected behaviour

Commands above should execute and exit without error code.

### Actual behaviour

The `node dist/bug-test.js` command throws this error:

```
internal/modules/cjs/loader.js:969
throw err;
^

Error: Cannot find module 'internal/bootstrap/loaders'
Require stack:
- /Users/dany/code/bug-test/dist/bug-test.js
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:966:15)
at Function.Module._load (internal/modules/cjs/loader.js:842:27)
at Module.require (internal/modules/cjs/loader.js:1026:19)
at require (internal/modules/cjs/helpers.js:72:18)
at Object. (/Users/dany/code/bug-test/dist/bug-test.js:7:31)
at Module._compile (internal/modules/cjs/loader.js:1138:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1158:10)
at Module.load (internal/modules/cjs/loader.js:986:32)
at Function.Module._load (internal/modules/cjs/loader.js:879:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12) {
code: 'MODULE_NOT_FOUND',
requireStack: [ '/Users/dany/code/bug-test/dist/bug-test.js' ]
```

The reason for this error is that there is this code in the `esm` module:

```js
[…] function q(e){let t;try{const{internalBinding:n}=require("internal/bootstrap/loaders"),r=n("natives");x(r,e)&&(t=r[e])}catch(e){}return"string"==typeof t?t:""} […]

// Simplified:
try { require("internal/bootstrap/loaders") } catch (e) {}
```

which is modified to this by microbundle in `dist/bug-test.js`:

```js
[…] var loaders = _interopDefault(require('internal/bootstrap/loaders')); […] function q(e){let t;try{const{internalBinding:n}=loaders,r=n("natives");x(r,e)&&(t=r[e]);}catch(e){}return "string"==typeof t?t:""} […]

// Simplified:
var loaders = require("internal/bootstrap/loaders")
try { loaders } catch (e) {}
```

### Additional info

microbundle v0.12.0
Node v12.17.0
Mac OS 10.15.5
Related: https://github.com/nodejs/node/issues/33656

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.