Vm2: Buat vm2 kompatibel dengan Webpack

Dibuat pada 26 Apr 2017  ·  5Komentar  ·  Sumber: patriksimek/vm2

  • [x] mencari cara untuk menghapus coffee-script require tanpa merusak kompatibilitas ke belakang
  • [] mencari cara menginstruksikan webpack untuk memaketkan skrip yang dimuat melalui fs - sandbox.js dan contextify.js
feature request help wanted

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 dengan Webpack . Itu tidak memerlukan perubahan apa pun dalam vm2 itu sendiri, hanya 3 baris konfigurasi tambahan dan skrip NPM sederhana:

  1. Buat package.json di direktori output/ :
{
    "dependencies": {
        "vm2": "latest"
    }
}
  1. Tandai vm2 sebagai perpustakaan eksternal di konfigurasi Webpack:
externals: {
    "vm2": "require('vm2')"
}
  1. Tambahkan skrip tambahan di NPM yang menginstal dependensi di direktori output/ setelah Webpack menyelesaikan semua hal:
"scripts": {
    "prepare-output": "cd output && npm install",
    "prepare": "webpack --progress && npm run prepare-output"
}

Semua 5 komentar

Masalah 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:

  1. Buat package.json di direktori output/ :
{
    "dependencies": {
        "vm2": "latest"
    }
}
  1. Tandai vm2 sebagai perpustakaan eksternal di konfigurasi Webpack:
externals: {
    "vm2": "require('vm2')"
}
  1. Tambahkan skrip tambahan di NPM yang menginstal dependensi di direktori 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:

  1. 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)

  2. 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.

  1. Bagian rumit terakhir, require: untuk NodeVM, saya mengubah satu baris

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.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat