Vm2: vm2をWebpackと互換性のあるものにする

作成日 2017年04月26日  ·  5コメント  ·  ソース: patriksimek/vm2

  • [x]下位互換性を損なうことなくcoffee-script requireを削除する方法を理解する
  • [] fsを介してロードされたスクリプトをバンドルするようにwebpackに指示する方法を理解する--sandbox.jsおよびcontextify.js
feature request help wanted

最も参考になるコメント

この問題に関する進展はありますか? これは、 vm2Webpackと互換性を持たせるために私が見つけた最良かつおそらく最も簡単な方法です。 vm2自体を変更する必要はなく、3行の追加構成と単純なNPMスクリプトだけが必要です。

  1. output/ディレクトリにpackage.jsonを作成します。
{
    "dependencies": {
        "vm2": "latest"
    }
}
  1. vm2をWebpack構成の外部ライブラリとしてマークします。
externals: {
    "vm2": "require('vm2')"
}
  1. Webpackがすべての作業を完了したら、依存関係をoutput/ディレクトリにインストールするスクリプトをNPMに追加します。
"scripts": {
    "prepare-output": "cd output && npm install",
    "prepare": "webpack --progress && npm run prepare-output"
}

全てのコメント5件

もう1つの問題はrequireです。 webpackはこれらの要求に対して警告を生成するだけですが、

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は実際にこれらのrequireexceptionsに置き換えました:
たとえば、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)
        });

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

requireeval('require')置き換えると、問題を解決できます。 もっと良い解決策があるのだろうか。

この問題に関する進展はありますか? これは、 vm2Webpackと互換性を持たせるために私が見つけた最良かつおそらく最も簡単な方法です。 vm2自体を変更する必要はなく、3行の追加構成と単純なNPMスクリプトだけが必要です。

  1. output/ディレクトリにpackage.jsonを作成します。
{
    "dependencies": {
        "vm2": "latest"
    }
}
  1. vm2をWebpack構成の外部ライブラリとしてマークします。
externals: {
    "vm2": "require('vm2')"
}
  1. Webpackがすべての作業を完了したら、依存関係をoutput/ディレクトリにインストールするスクリプトをNPMに追加します。
"scripts": {
    "prepare-output": "cd output && npm install",
    "prepare": "webpack --progress && npm run prepare-output"
}

こんにちは !

私は同じ問題を抱えています、そしてこれが私がそれを解決した方法です:

  1. まず、ソースを変更する必要があったため、モジュールをnpmモジュールとして直接使用することはできません。そのため、プロジェクトのフォルダーにライブラリをc / cします(ファイルは数個で問題ありません)

  2. sandbox.js / contextify.jsのfsについて:名前をsandbox.txtとcontextify.txtに変更し、rawローダーを使用してプレーンテキストとしてロードしました。

main.js(上部)

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

webpack.config.js

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

main.jsのsandbox.js / contextify.jsのすべての参照をsandbox.txt / contextify.txtに変更することを忘れないでください。

  1. 最後のトリッキーな部分、必要:NodeVMの場合、1行変更しました

main.js(250行目あたり)

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

「require」を「require:eval( 'require')」に変更したので、webpackはそれを変更せず(Coxxsが提案したように)、それでうまくいきました。

これで、外部ライブラリとして使用しなくても、vm2を適切に使用できます。
私はそれがかなりトリッキーであまりきれいではないことを知っています、しかしそれは私がこれまでに得た唯一の解決策です。
私はそれがあなたの何人かを助け、そしてまた本当の修正に役立つことを願っています。

より良い解決策があれば、ぜひお聞かせください。 :)

この問題は、最近のアクティビティがないため、自動的に古いものとしてマークされています。 それ以上のアクティビティが発生しない場合は閉じられます。 貢献していただきありがとうございます。

FWIW- nodeターゲットにしたWebpack5とのバンドルは機能しているようです。

このページは役に立ちましたか?
0 / 5 - 0 評価