Vm2: Tornar vm2 compatível com Webpack

Criado em 26 abr. 2017  ·  5Comentários  ·  Fonte: patriksimek/vm2

  • [x] descobrir como remover coffee-script require sem quebrar a compatibilidade com versões anteriores
  • [] descobrir como instruir o webpack a agrupar scripts carregados via fs - sandbox.js e contextify.js
feature request help wanted

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 com Webpack . Não requer nenhuma alteração no próprio vm2 , apenas 3 linhas de configuração adicional e um script NPM simples:

  1. Crie um package.json no diretório output/ :
{
    "dependencies": {
        "vm2": "latest"
    }
}
  1. Marque vm2 como uma biblioteca externa na configuração do Webpack:
externals: {
    "vm2": "require('vm2')"
}
  1. Adicione um script adicional no NPM que instala dependências no diretório output/ assim que o Webpack terminar tudo:
"scripts": {
    "prepare-output": "cd output && npm install",
    "prepare": "webpack --progress && npm run prepare-output"
}

Todos 5 comentários

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

  1. Crie um package.json no diretório output/ :
{
    "dependencies": {
        "vm2": "latest"
    }
}
  1. Marque vm2 como uma biblioteca externa na configuração do Webpack:
externals: {
    "vm2": "require('vm2')"
}
  1. Adicione um script adicional no NPM que instala dependências no diretório 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:

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

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

  1. Última parte complicada, requer: para NodeVM, mudei uma linha

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.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

CapacitorSet picture CapacitorSet  ·  13Comentários

keyosk picture keyosk  ·  64Comentários

somebody1234 picture somebody1234  ·  4Comentários

KonradLinkowski picture KonradLinkowski  ·  10Comentários

wojpawlik picture wojpawlik  ·  4Comentários