Vm2: اجعل vm2 متوافقًا مع Webpack

تم إنشاؤها على ٢٦ أبريل ٢٠١٧  ·  5تعليقات  ·  مصدر: patriksimek/vm2

  • [x] اكتشف كيفية إزالة طلب coffee-script بدون كسر التوافق مع الإصدارات السابقة
  • [] تعرف على كيفية توجيه webpack إلى حزم البرامج النصية المحملة عبر fs - sandbox.js و Contextify.js
feature request help wanted

التعليق الأكثر فائدة

أي تقدم في هذه المسألة؟ هذه هي الطريقة الأفضل وربما الأبسط التي وجدتها لجعل vm2 متوافقًا مع Webpack . لا يتطلب أي تغييرات في vm2 نفسه ، فقط 3 أسطر من التكوين الإضافي ونص NPM بسيط:

  1. أنشئ package.json في الدليل output/ :
{
    "dependencies": {
        "vm2": "latest"
    }
}
  1. ضع علامة vm2 كمكتبة خارجية في تهيئة Webpack:
externals: {
    "vm2": "require('vm2')"
}
  1. أضف نصًا برمجيًا إضافيًا في NPM والذي يقوم بتثبيت التبعيات في دليل output/ بمجرد انتهاء Webpack من جميع الأشياء:
"scripts": {
    "prepare-output": "cd output && npm install",
    "prepare": "webpack --progress && npm run prepare-output"
}

ال 5 كومينتر

مشكلة أخرى هي require . على الرغم من أن حزمة الويب تقوم فقط بإنشاء تحذيرات لهذه تتطلب:

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

استبدلت حزمة الويب هذه require بـ exceptions :
على سبيل المثال ، قبل حزمة الويب:

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

بعد حزمة الويب:

        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 بسيط:

  1. أنشئ package.json في الدليل output/ :
{
    "dependencies": {
        "vm2": "latest"
    }
}
  1. ضع علامة vm2 كمكتبة خارجية في تهيئة Webpack:
externals: {
    "vm2": "require('vm2')"
}
  1. أضف نصًا برمجيًا إضافيًا في NPM والذي يقوم بتثبيت التبعيات في دليل output/ بمجرد انتهاء Webpack من جميع الأشياء:
"scripts": {
    "prepare-output": "cd output && npm install",
    "prepare": "webpack --progress && npm run prepare-output"
}

أهلا !

لدي نفس المشكلة وإليك كيفية حلها:

  1. أولاً ، لا يمكنني استخدام الوحدة مباشرةً كوحدة نمطية npm ، لأنني اضطررت إلى تعديل المصادر ، لذلك أنا c / c lib في مجلد من مشروعي (إنها ملفات قليلة فقط ، ولا توجد مشكلة في ذلك)

  2. حول fs لـ sandbox.js / Contextify.js: لقد أعدت تسميتها sandbox.txt & Contextify.txt ، ثم استخدمت أداة تحميل أولية لتحميلها كنص عادي.

main.js (في الأعلى)

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

webpack.config.js

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

لا تنس تغيير جميع مراجع sandbox.js / Contextify.js إلى sandbox.txt / Contextify.txt في main.js.

  1. يتطلب الجزء الأخير الصعب: بالنسبة لـ NodeVM ، قمت بتغيير سطر واحد

main.js (حول السطر 250)

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

لقد غيرت "طلب" إلى "يتطلب:" EVAL ("تتطلب") "لذلك لم تعدل حزمة الويب (على النحو الذي اقترحه Coxxs) وفعلت الحيلة.

يمكنني الآن استخدام vm2 بشكل صحيح ، دون الحاجة إليه كمكتبة خارجية.
أعلم أنه صعب جدًا وليس نظيفًا جدًا ، لكنه الحل الوحيد الذي حصلت عليه حتى الآن.
آمل أن يساعد بعضكم ويساعد أيضًا في إصلاح حقيقي.

إذا كانت لديك حلول أفضل ، فنحن نحب أن نسمعها! :)

تم وضع علامة على هذه المشكلة تلقائيًا على أنها قديمة نظرًا لعدم وجود نشاط حديث لها. سيتم إغلاقه إذا لم يحدث أي نشاط آخر. شكرا لمساهماتكم.

FWIW - يبدو أن التجميع مع Webpack 5 ، بهدف node يعمل.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات