Vm2: Rendre vm2 compatible avec Webpack

Créé le 26 avr. 2017  ·  5Commentaires  ·  Source: patriksimek/vm2

  • [x] découvrez comment supprimer coffee-script require sans interrompre la rétrocompatibilité
  • [] figure comment demander à Webpack de regrouper les scripts chargés via fs - sandbox.js et contextify.js
feature request help wanted

Commentaire le plus utile

Des progrès sur cette question? Voici le moyen le meilleur et probablement le plus simple que j'ai trouvé pour rendre vm2 compatible avec Webpack . Il ne nécessite aucun changement dans vm2 lui-même, seulement 3 lignes de configuration supplémentaire et un simple script NPM:

  1. Créez un package.json dans le répertoire output/ :
{
    "dependencies": {
        "vm2": "latest"
    }
}
  1. Marquez vm2 comme bibliothèque externe dans la configuration Webpack:
externals: {
    "vm2": "require('vm2')"
}
  1. Ajoutez un script supplémentaire dans NPM qui installe les dépendances dans le répertoire output/ une fois que Webpack a terminé tout le travail:
"scripts": {
    "prepare-output": "cd output && npm install",
    "prepare": "webpack --progress && npm run prepare-output"
}

Tous les 5 commentaires

Un autre problème est require . Bien que webpack ne génère que des avertissements pour ceux-ci nécessitent:

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 a en fait remplacé ces require par exceptions :
Par exemple, avant le 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)
        });

Après le 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)
        });

Remplacer require par eval('require') peut résoudre le problème pour moi. Je me demande s'il existe une meilleure solution.

Des progrès sur cette question? Voici le moyen le meilleur et probablement le plus simple que j'ai trouvé pour rendre vm2 compatible avec Webpack . Il ne nécessite aucun changement dans vm2 lui-même, seulement 3 lignes de configuration supplémentaire et un simple script NPM:

  1. Créez un package.json dans le répertoire output/ :
{
    "dependencies": {
        "vm2": "latest"
    }
}
  1. Marquez vm2 comme bibliothèque externe dans la configuration Webpack:
externals: {
    "vm2": "require('vm2')"
}
  1. Ajoutez un script supplémentaire dans NPM qui installe les dépendances dans le répertoire output/ une fois que Webpack a terminé tout le travail:
"scripts": {
    "prepare-output": "cd output && npm install",
    "prepare": "webpack --progress && npm run prepare-output"
}

Salut !

J'ai eu le même problème et voici comment je l'ai résolu:

  1. Premièrement, je ne peux pas utiliser directement le module comme module npm, car j'ai dû modifier les sources, donc j'ai c / c la lib dans un dossier de mon projet (ce n'est que quelques fichiers, pas de problème avec ça)

  2. À propos des fs pour sandbox.js / contextify.js: Je les ai renommés sandbox.txt & contextify.txt, puis j'ai utilisé un chargeur brut pour les charger en texte brut.

main.js (en haut)

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

webpack.config.js

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

N'oubliez pas de remplacer toutes les références de sandbox.js / contextify.js par sandbox.txt / contextify.txt dans main.js.

  1. Dernière partie délicate, nécessite: pour NodeVM, j'ai changé une ligne

main.js (vers la ligne 250)

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

J'ai changé le "require" en "require: eval ('require')" pour que webpack ne le modifie pas (comme suggéré par Coxxs) et il a fait l'affaire.

Maintenant, je peux utiliser vm2 correctement, sans en avoir besoin en tant que bibliothèque externe.
Je sais que c'est assez délicat et pas très propre, mais c'est la seule solution que j'ai jusqu'à présent.
J'espère que cela peut aider certains d'entre vous et également aider à une vraie solution.

Si vous avez de meilleures solutions, nous serions ravis de les entendre! :)

Ce problème a été automatiquement marqué comme obsolète car il n'a pas eu d'activité récente. Il sera fermé si aucune autre activité ne se produit. Merci pour vos contributions.

FWIW - le regroupement avec Webpack 5, avec un objectif de node semble fonctionner.

Cette page vous a été utile?
0 / 5 - 0 notes