coffee-script
requireを削除する方法を理解するもう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は実際にこれらのrequire
をexceptions
に置き換えました:
たとえば、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)
});
require
をeval('require')
置き換えると、問題を解決できます。 もっと良い解決策があるのだろうか。
この問題に関する進展はありますか? これは、 vm2
をWebpack
と互換性を持たせるために私が見つけた最良かつおそらく最も簡単な方法です。 vm2
自体を変更する必要はなく、3行の追加構成と単純なNPMスクリプトだけが必要です。
output/
ディレクトリにpackage.json
を作成します。{
"dependencies": {
"vm2": "latest"
}
}
vm2
をWebpack構成の外部ライブラリとしてマークします。externals: {
"vm2": "require('vm2')"
}
output/
ディレクトリにインストールするスクリプトをNPMに追加します。"scripts": {
"prepare-output": "cd output && npm install",
"prepare": "webpack --progress && npm run prepare-output"
}
こんにちは !
私は同じ問題を抱えています、そしてこれが私がそれを解決した方法です:
まず、ソースを変更する必要があったため、モジュールをnpmモジュールとして直接使用することはできません。そのため、プロジェクトのフォルダーにライブラリをc / cします(ファイルは数個で問題ありません)
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に変更することを忘れないでください。
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とのバンドルは機能しているようです。
最も参考になるコメント
この問題に関する進展はありますか? これは、
vm2
をWebpack
と互換性を持たせるために私が見つけた最良かつおそらく最も簡単な方法です。vm2
自体を変更する必要はなく、3行の追加構成と単純なNPMスクリプトだけが必要です。output/
ディレクトリにpackage.json
を作成します。vm2
をWebpack構成の外部ライブラリとしてマークします。output/
ディレクトリにインストールするスクリプトをNPMに追加します。