Vm2: Hacer que vm2 sea compatible con Webpack

Creado en 26 abr. 2017  ·  5Comentarios  ·  Fuente: patriksimek/vm2

  • [x] descubre cómo eliminar coffee-script require sin romper una compatibilidad con versiones anteriores
  • [] figura cómo instruir a webpack para agrupar los scripts cargados a través de fs - sandbox.js y contextify.js
feature request help wanted

Comentario más útil

¿Algún progreso en este tema? Esta es la mejor y probablemente la forma más sencilla que he encontrado para hacer que vm2 compatible con Webpack . No requiere ningún cambio en vm2 sí, solo 3 líneas de configuración adicional y un script NPM simple:

  1. Cree un package.json en el directorio output/ :
{
    "dependencies": {
        "vm2": "latest"
    }
}
  1. Marque vm2 como una biblioteca externa en la configuración de Webpack:
externals: {
    "vm2": "require('vm2')"
}
  1. Agregue un script adicional en NPM que instale las dependencias en el directorio output/ una vez que Webpack haya terminado todas las cosas:
"scripts": {
    "prepare-output": "cd output && npm install",
    "prepare": "webpack --progress && npm run prepare-output"
}

Todos 5 comentarios

Otro problema es require . Aunque el paquete web solo genera advertencias para estos, se requieren:

WARNING in ./~/vm2/lib/main.js
147:26-33 Critical dependency: require function is used in a way in which dependencies cannot be statically extracted

WARNING in ./~/vm2/lib/main.js
251:3-10 Critical dependency: require function is used in a way in which dependencies cannot be statically extracted

WARNING in ./~/vm2/lib/main.js
295:26-33 Critical dependency: require function is used in a way in which dependencies cannot be statically extracted

webpack en realidad reemplazó estos require con exceptions :
Por ejemplo, antes del paquete web:

        Reflect.defineProperty(this, '_internal', {
            value: vm.runInContext(`(function(require, host) { ${cf} \n})`, this._context, {
                filename: `${__dirname}/contextify.js`,
                displayErrors: false
            }).call(this._context, require, host)
        });

Después del paquete web:

        Reflect.defineProperty(this, '_internal', {
            value: vm.runInContext(`(function(require, host) { ${cf} \n})`, this._context, {
                filename: `${__dirname}/contextify.js`,
                displayErrors: false
            }).call(this._context, !(function webpackMissingModule() { var e = new Error("Cannot find module \".\""); e.code = 'MODULE_NOT_FOUND'; throw e; }()), host)
        });

Reemplazar require con eval('require') puede resolver el problema por mí. Me pregunto si hay una mejor solución.

¿Algún progreso en este tema? Esta es la mejor y probablemente la forma más sencilla que he encontrado para hacer que vm2 compatible con Webpack . No requiere ningún cambio en vm2 sí, solo 3 líneas de configuración adicional y un script NPM simple:

  1. Cree un package.json en el directorio output/ :
{
    "dependencies": {
        "vm2": "latest"
    }
}
  1. Marque vm2 como una biblioteca externa en la configuración de Webpack:
externals: {
    "vm2": "require('vm2')"
}
  1. Agregue un script adicional en NPM que instale las dependencias en el directorio output/ una vez que Webpack haya terminado todas las cosas:
"scripts": {
    "prepare-output": "cd output && npm install",
    "prepare": "webpack --progress && npm run prepare-output"
}

Hola !

Tengo el mismo problema y así es como lo resolví:

  1. Primero, no puedo usar directamente el módulo como un módulo npm, porque tuve que modificar las fuentes, así que c / c la biblioteca en una carpeta de mi proyecto (son solo unos pocos archivos, no hay problema con eso)

  2. Acerca de los fs para sandbox.js / contextify.js: los renombré sandbox.txt y contextify.txt, luego usé un cargador sin formato para cargarlos como texto sin formato.

main.js (en la parte superior)

const sb = require('./sandbox.txt');
const cf = require('./contextify.txt');

webpack.config.js

{
    test: /\.txt$/,
    use: 'raw-loader'
}

No olvide cambiar todas las referencias de sandbox.js / contextify.js a sandbox.txt / contextify.txt en main.js.

  1. Última parte complicada, requiere: para NodeVM, cambié una línea

main.js (alrededor de la línea 250)

[...]
const host = {
    version: parseInt(process.versions.node.split('.')[0]),
    require: eval('require'),
    process,
    console,
[...]

Cambié el "require" a "require: eval ('require')" para que webpack no lo modifique (como sugirió Coxxs) e hizo el truco.

Ahora puedo usar vm2 correctamente, sin necesitarlo como biblioteca externa.
Sé que es bastante complicado y no muy limpio, pero es la única solución que tengo hasta ahora.
Espero que pueda ayudar a algunos de ustedes y también ayudar en una solución real.

Si tiene mejores soluciones, ¡nos encantaría escucharlas! :)

Este problema se ha marcado automáticamente como obsoleto porque no ha tenido actividad reciente. Se cerrará si no se produce más actividad. Gracias por sus aportaciones.

FWIW: el paquete con Webpack 5, con un objetivo de node parece funcionar.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

KonradLinkowski picture KonradLinkowski  ·  10Comentarios

wojpawlik picture wojpawlik  ·  4Comentarios

wintertime-inc picture wintertime-inc  ·  5Comentarios

keyosk picture keyosk  ·  64Comentarios

vshymanskyy picture vshymanskyy  ·  8Comentarios