caoccao / Javet

Javet is Java + V8 (JAVa + V + EighT). It is an awesome way of embedding Node.js and V8 in Java.
https://www.caoccao.com/Javet/
Apache License 2.0
750 stars 70 forks source link

Dynamic Imports #313

Open aghasemi opened 8 months ago

aghasemi commented 8 months ago

Hello,

it seems imports in general are supported in Javet, but it is not clear whether dynamic imports are as well or not. May I ask please if there is a minimal example using dynamic imports? More specifically, I want to evaluate the following expression:

import('https://cdn.jsdelivr.net/npm/@xenova/transformers').then(({pipeline}) => {
    pipeline('sentiment-analysis').then(pipe => {
        pipe('I detest it!').then(out => {
            console.log(out)
        })
    })

})

, which takes a few seconds to complete and eventually prints a JSON object to the console. However, so far I only get the "not supported" error message.

Regarding normal import, running import { pipeline } from 'https://esm.sh/@xenova/transformers@2.16.0' returns Cannot find package 'https://esm.sh/@xenova/transformers@2.16.0'. Is there something I am missing?

Thanks

caoccao commented 8 months ago

May I know which mode you were using?

Both Node.js and V8 modes don't have the built-in support to importing from arbitrary resource because:

  1. V8 is a pure script engine that doesn't know file system or network.
  2. Javet is designed to be secure by default. Allowing the guest scripts to access storage or network is not secure at all.

I suggest you write your own module resolver to empower the ESM by fetching the resource in the module resolution. Please refer to this doc for details.