coffee-script
require sans interrompre la rétrocompatibilité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:
package.json
dans le répertoire output/
:{
"dependencies": {
"vm2": "latest"
}
}
vm2
comme bibliothèque externe dans la configuration Webpack:externals: {
"vm2": "require('vm2')"
}
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:
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)
À 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.
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.
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 avecWebpack
. Il ne nécessite aucun changement dansvm2
lui-même, seulement 3 lignes de configuration supplémentaire et un simple script NPM:package.json
dans le répertoireoutput/
:vm2
comme bibliothèque externe dans la configuration Webpack:output/
une fois que Webpack a terminé tout le travail: