Vm2: Machen Sie vm2 kompatibel mit Webpack

Erstellt am 26. Apr. 2017  ·  5Kommentare  ·  Quelle: patriksimek/vm2

  • [x] Finden Sie heraus, wie Sie coffee-script entfernen können, ohne die Abwärtskompatibilität zu beeinträchtigen
  • [] Abbildung, wie Webpack angewiesen wird, über fs - sandbox.js und contextify.js geladene Skripte zu bündeln
feature request help wanted

Hilfreichster Kommentar

Irgendwelche Fortschritte in diesem Bereich? Hier ist der beste und wahrscheinlich einfachste Weg, vm2 mit Webpack kompatibel zu machen. Es sind keine Änderungen an vm2 selbst erforderlich, nur 3 zusätzliche Konfigurationszeilen und ein einfaches NPM-Skript:

  1. Erstellen Sie ein package.json im Verzeichnis output/ :
{
    "dependencies": {
        "vm2": "latest"
    }
}
  1. Markieren Sie vm2 als externe Bibliothek in der Webpack-Konfiguration:
externals: {
    "vm2": "require('vm2')"
}
  1. Fügen Sie ein zusätzliches Skript in NPM hinzu, das Abhängigkeiten im Verzeichnis output/ installiert, sobald Webpack alle Aufgaben erledigt hat:
"scripts": {
    "prepare-output": "cd output && npm install",
    "prepare": "webpack --progress && npm run prepare-output"
}

Alle 5 Kommentare

Ein weiteres Problem ist require . Obwohl Webpack nur Warnungen für diese generiert, erfordern:

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

Das Webpack hat diese require tatsächlich durch exceptions :
Zum Beispiel vor dem Webpack:

        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)
        });

Nach dem Webpack:

        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)
        });

Ersetzen Sie require durch eval('require') um das Problem für mich zu lösen. Ich frage mich, ob es eine bessere Lösung gibt.

Irgendwelche Fortschritte in diesem Bereich? Hier ist der beste und wahrscheinlich einfachste Weg, vm2 mit Webpack kompatibel zu machen. Es sind keine Änderungen an vm2 selbst erforderlich, nur 3 zusätzliche Konfigurationszeilen und ein einfaches NPM-Skript:

  1. Erstellen Sie ein package.json im Verzeichnis output/ :
{
    "dependencies": {
        "vm2": "latest"
    }
}
  1. Markieren Sie vm2 als externe Bibliothek in der Webpack-Konfiguration:
externals: {
    "vm2": "require('vm2')"
}
  1. Fügen Sie ein zusätzliches Skript in NPM hinzu, das Abhängigkeiten im Verzeichnis output/ installiert, sobald Webpack alle Aufgaben erledigt hat:
"scripts": {
    "prepare-output": "cd output && npm install",
    "prepare": "webpack --progress && npm run prepare-output"
}

Hallo !

Ich habe das gleiche Problem und habe es folgendermaßen gelöst:

  1. Erstens kann ich das Modul nicht direkt als npm-Modul verwenden, da ich die Quellen ändern musste, sodass ich die Bibliothek in einem Ordner meines Projekts c / c (es sind nur wenige Dateien, kein Problem damit).

  2. Informationen zu den fs für sandbox.js / contextify.js: Ich habe sie in sandbox.txt & contextify.txt umbenannt und sie dann mit einem Raw-Loader als einfachen Text geladen.

main.js (oben)

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

webpack.config.js

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

Vergessen Sie nicht, alle Verweise von sandbox.js / contextify.js in main.js in sandbox.txt / contextify.txt zu ändern.

  1. Letzter kniffliger Teil, erforderlich: Für NodeVM habe ich eine Zeile geändert

main.js (um Zeile 250)

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

Ich habe "require" in "require: eval ('require')" geändert, damit das Webpack es nicht ändert (wie von Coxxs vorgeschlagen), und es hat den Trick gemacht.

Jetzt kann ich vm2 richtig verwenden, ohne es als externe Bibliothek zu benötigen.
Ich weiß, dass es ziemlich knifflig und nicht sehr sauber ist, aber es ist die einzige Lösung, die ich bisher bekommen habe.
Ich hoffe, es kann einigen von Ihnen helfen und auch bei einer echten Lösung helfen.

Wenn Sie bessere Lösungen haben, würden wir sie gerne hören! :) :)

Dieses Problem wurde automatisch als veraltet markiert, da es in letzter Zeit keine Aktivitäten gab. Es wird geschlossen, wenn keine weitere Aktivität stattfindet. Vielen Dank für Ihre Beiträge.

FWIW - Die Bündelung mit Webpack 5 mit einem Ziel von node scheint zu funktionieren.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

ozsay picture ozsay  ·  5Kommentare

patriksimek picture patriksimek  ·  15Kommentare

unxcepted picture unxcepted  ·  11Kommentare

somebody1234 picture somebody1234  ·  4Kommentare

keyosk picture keyosk  ·  64Kommentare