Tiny virtual machine for browser to execute javascript modules in Web Worker.
- Run code in a isolated scope without pollute your environment
- Support CommonJS and ESModules (by plugin)
- Support TypeScript and Flow (by plugin)
- Based on Web Worker
App.js
import VM from 'vm-worker'
const vm = VM({
debug: false, // default false
timeout: 100000, // default 100000ms
})
await vm.require([
{
path: 'module-one/index.js',
src: 'module.exports = 1',
},
{
path: '/dirA/a.js',
url: 'https://xxx.com/a.js',
},
{
path: '/dirB/b.js',
src: 'module.exports = require("../dirA/a")',
},
])
await vm.exec('/dirB/b.js', 1, 2) // => 4
vm.terminate()
a.js
module.exports = (a, b) => (a + b + require('module-one'))
App.js
import VM from 'vm-worker'
import ESMPlugin from 'vm-worker/dist/plugins/esmodule.esm'
const vm = VM({
plugins: [
ESMPlugin(),
],
})
await vm.require([
{
path: 'module-one/index.js',
src: `export const ONE = 1`
},
{
path: '/dirA/a.js',
url: 'https://xxx.com/a.js',
},
{
path: '/dirB/b.js',
src: `import { plus } from "../dirA/a"
export default plus`,
},
])
await vm.exec('/dirB/b.js', 1, 2) // => 4
vm.terminate()
a.js
import { ONE } from 'module-one'
export function plus(a, b) {
return a + b + ONE
}
Sucrase is similar to Babel, which compiles TypeScript, Flow and JSX to standard JavaScript.
Sucrase transform options document
App.js
import VM from 'vm-worker'
import SucrasePlugin from 'vm-worker/dist/plugins/sucrase.esm'
const vm = VM({
plugins: [
SucrasePlugin({
... // Sucrase transform options
}),
],
})
await vm.require([
{
path: 'module-one/index.js',
src: `export const ONE: number = 1`
},
{
path: '/dirA/a.js',
url: 'https://xxx.com/a.js',
},
{
path: '/dirB/b.js',
src: `import { plus } from "../dirA/a"
export default plus`,
},
])
await vm.exec('/dirB/b.js', 1, 2) // => 4
vm.terminate()
a.js
import { ONE } from 'module-one'
export function plus(a: number, b: number) {
return a + b + ONE
}
npm i vm-worker