coffee-script
require tanpa merusak kompatibilitas ke belakangMasalah lainnya adalah require
. Meskipun webpack hanya menghasilkan peringatan untuk kebutuhan ini:
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 benar-benar mengganti require
dengan exceptions
:
Misalnya, sebelum 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)
});
Setelah 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)
});
Ganti require
dengan eval('require')
dapat menyelesaikan masalah bagi saya. Saya ingin tahu apakah ada solusi yang lebih baik.
Ada kemajuan dalam masalah ini? Ini adalah cara terbaik dan mungkin yang paling sederhana yang saya temukan untuk membuat vm2
kompatibel dengan Webpack
. Itu tidak memerlukan perubahan apa pun dalam vm2
itu sendiri, hanya 3 baris konfigurasi tambahan dan skrip NPM sederhana:
package.json
di direktori output/
:{
"dependencies": {
"vm2": "latest"
}
}
vm2
sebagai perpustakaan eksternal di konfigurasi Webpack:externals: {
"vm2": "require('vm2')"
}
output/
setelah Webpack menyelesaikan semua hal:"scripts": {
"prepare-output": "cd output && npm install",
"prepare": "webpack --progress && npm run prepare-output"
}
Hai!
Saya mendapat masalah yang sama dan inilah cara saya menyelesaikannya:
Pertama, saya tidak bisa langsung menggunakan modul sebagai modul npm, karena saya harus memodifikasi sumbernya, jadi saya c / c lib di folder proyek saya (ini hanya beberapa file, tidak masalah dengan itu)
Tentang fs untuk sandbox.js / contextify.js: Saya menamainya sandbox.txt & contextify.txt, kemudian menggunakan raw-loader untuk memuatnya sebagai teks biasa.
main.js (di atas)
const sb = require('./sandbox.txt');
const cf = require('./contextify.txt');
webpack.config.js
{
test: /\.txt$/,
use: 'raw-loader'
}
Jangan lupa untuk mengubah semua referensi sandbox.js / contextify.js menjadi sandbox.txt / contextify.txt di main.js.
main.js (sekitar baris 250)
[...]
const host = {
version: parseInt(process.versions.node.split('.')[0]),
require: eval('require'),
process,
console,
[...]
Saya mengubah "require" menjadi "require: eval ('require')" sehingga webpack tidak memodifikasinya (seperti yang disarankan oleh Coxxs) dan itu berhasil.
Sekarang saya dapat menggunakan vm2 dengan benar, tanpa membutuhkannya sebagai perpustakaan eksternal.
Saya tahu ini cukup rumit dan tidak terlalu bersih, tetapi itu satu-satunya solusi yang saya dapatkan sejauh ini.
Saya harap ini dapat membantu sebagian dari Anda & juga membantu dalam perbaikan yang nyata.
Jika Anda memiliki solusi yang lebih baik, kami akan senang mendengarnya! :)
Masalah ini secara otomatis ditandai sebagai usang karena tidak ada aktivitas terbaru. Ini akan ditutup jika tidak ada aktivitas lebih lanjut. Terima kasih atas kontribusi Anda.
FWIW - bundling dengan Webpack 5, dengan target node
tampaknya berhasil.
Komentar yang paling membantu
Ada kemajuan dalam masalah ini? Ini adalah cara terbaik dan mungkin yang paling sederhana yang saya temukan untuk membuat
vm2
kompatibel denganWebpack
. Itu tidak memerlukan perubahan apa pun dalamvm2
itu sendiri, hanya 3 baris konfigurasi tambahan dan skrip NPM sederhana:package.json
di direktorioutput/
:vm2
sebagai perpustakaan eksternal di konfigurasi Webpack:output/
setelah Webpack menyelesaikan semua hal: