oracle / graaljs

GraalJS – A high-performance, ECMAScript compliant, and embeddable JavaScript runtime for Java
https://www.graalvm.org/javascript/
Universal Permissive License v1.0
1.81k stars 190 forks source link

graaljs inside JVM dynamicImport import() broken CJS interop. #339

Closed frank-dspeed closed 4 years ago

frank-dspeed commented 4 years ago

graaljs inside JVM dynamic import broken interop

ESM & CJS can not dynamic import additional CJS modules inside it also accessing module object inside cjs breaks graalvm silent when loaded via dynamic import inside ESM

JS can also not dynamic import CJS same behavior!

Reproduce able example

module.js

module.exports = { str: 'myString'}
// When the following line gets uncommented the secund console log will not get called silent fails when this file gets imported via dynamic import() no matter if from CJS or ESM
//console.log('ctx',module)
console.log('The Import works correct as this sideEffect gets executed')

index.mjs

//then does not even get called sideEffects do execute
import('./module.js').then(function(x) { console.log('t',x)}) // then does not get called { default: { str: 'myString'}}
export const esm = 'Works' 

index.js

// Will not work
//then does not even get called sideEffects do execute
import('./module.js').then(function(x) { console.log('t',x)}) // then does not get called { default: { str: 'myString'}}

//This will work 
console.log(require('module.js'))
import('./index.esm.js').then(function ({esm}) { console.log(esm) })

Conclusion

dynamicImport import() at present only supports ESM no matter if used in ESM context or CJS i think also that the current dynamic import implementation does not hornor .mjs === ESM and .cjs === commonjs(require,module)

frank-dspeed commented 4 years ago

a little extra info maybe related if we would add into module.js

console.log('ctx',module) // befor the console.log('sideEffect')

it will silent fail all other instructions that come after that and so will not execute the secund console call any access to module when loaded via dynamic import makes graal simply fail silent while it would all work with require from cjs

eleinadani commented 4 years ago

Thanks @frank-dspeed, we'll have a look

frank-dspeed commented 4 years ago

Solved sorry for creating that issue it is related to a other project