coffee-script
require sem quebrar a compatibilidade com versões anterioresOutro problema é require
. Embora o webpack apenas gere avisos para estes requerem:
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
na verdade, o webpack substituiu estes require
por exceptions
:
Por exemplo, antes do 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)
});
Depois do 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)
});
Substituir require
por eval('require')
pode resolver o problema para mim. Eu me pergunto se existe uma solução melhor.
Algum progresso neste assunto? Aqui está a melhor e provavelmente a maneira mais simples que encontrei de tornar vm2
compatível com Webpack
. Não requer nenhuma alteração no próprio vm2
, apenas 3 linhas de configuração adicional e um script NPM simples:
package.json
no diretório output/
:{
"dependencies": {
"vm2": "latest"
}
}
vm2
como uma biblioteca externa na configuração do Webpack:externals: {
"vm2": "require('vm2')"
}
output/
assim que o Webpack terminar tudo:"scripts": {
"prepare-output": "cd output && npm install",
"prepare": "webpack --progress && npm run prepare-output"
}
Oi !
Eu tenho o mesmo problema e aqui está como resolvi:
Em primeiro lugar, não posso usar o módulo diretamente como um módulo npm, porque tive que modificar os fontes, então eu c / c o lib em uma pasta do meu projeto (são apenas alguns arquivos, não há problema com isso)
Sobre o fs para sandbox.js / contextify.js: Eu os renomei sandbox.txt & contextify.txt e, em seguida, usei um carregador bruto para carregá-los como texto simples.
main.js (no topo)
const sb = require('./sandbox.txt');
const cf = require('./contextify.txt');
webpack.config.js
{
test: /\.txt$/,
use: 'raw-loader'
}
Não se esqueça de alterar todas as referências de sandbox.js / contextify.js para sandbox.txt / contextify.txt em main.js.
main.js (em torno da linha 250)
[...]
const host = {
version: parseInt(process.versions.node.split('.')[0]),
require: eval('require'),
process,
console,
[...]
Mudei "require" para "require: eval ('require')" para que o webpack não o modifique (como sugerido pelo Coxxs) e funcionou.
Agora posso usar o vm2 corretamente, sem precisar dele como biblioteca externa.
Eu sei que é bastante complicado e não muito limpo, mas é a única solução que tenho até agora.
Espero que possa ajudar alguns de vocês e também ajudar em uma solução real.
Se você tiver soluções melhores, adoraríamos ouvi-las! :)
Este problema foi automaticamente marcado como obsoleto porque não teve atividades recentes. Ele será fechado se nenhuma outra atividade ocorrer. Obrigado por suas contribuições.
FWIW - empacotar com Webpack 5, com um alvo de node
parece funcionar.
Comentários muito úteis
Algum progresso neste assunto? Aqui está a melhor e provavelmente a maneira mais simples que encontrei de tornar
vm2
compatível comWebpack
. Não requer nenhuma alteração no própriovm2
, apenas 3 linhas de configuração adicional e um script NPM simples:package.json
no diretóriooutput/
:vm2
como uma biblioteca externa na configuração do Webpack:output/
assim que o Webpack terminar tudo: