Vm2: 使vm2与Webpack兼容

创建于 2017-04-26  ·  5评论  ·  资料来源: patriksimek/vm2

  • [x]找出如何在不破坏向后兼容性的情况下删除coffee-script require
  • []了解如何指示Webpack捆绑通过fs-sandbox.js和contextify.js加载的脚本
feature request help wanted

最有用的评论

在这个问题上有什么进展吗? 这是我发现使vm2Webpack兼容的最好,也可能是最简单的方法。 它不需要对vm2本身进行任何更改,仅需要三行附加配置和一个简单的NPM脚本即可:

  1. output/目录中创建一个package.json
{
    "dependencies": {
        "vm2": "latest"
    }
}
  1. 在Webpack配置中将vm2标记为外部库:
externals: {
    "vm2": "require('vm2')"
}
  1. Webpack完成所有操作后,在NPM中添加一个附加脚本,该脚本将依赖关系安装在output/目录中:
"scripts": {
    "prepare-output": "cd output && npm install",
    "prepare": "webpack --progress && npm run prepare-output"
}

所有5条评论

另一个问题是require 。 尽管webpack只是针对这些警告生成警告,但需要:

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实际上将这些require替换exceptions
例如,在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)
        });

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

require替换eval('require')可以为我解决问题。 我想知道是否有更好的解决方案。

在这个问题上有什么进展吗? 这是我发现使vm2Webpack兼容的最好,也可能是最简单的方法。 它不需要对vm2本身进行任何更改,仅需要三行附加配置和一个简单的NPM脚本即可:

  1. output/目录中创建一个package.json
{
    "dependencies": {
        "vm2": "latest"
    }
}
  1. 在Webpack配置中将vm2标记为外部库:
externals: {
    "vm2": "require('vm2')"
}
  1. Webpack完成所有操作后,在NPM中添加一个附加脚本,该脚本将依赖关系安装在output/目录中:
"scripts": {
    "prepare-output": "cd output && npm install",
    "prepare": "webpack --progress && npm run prepare-output"
}

你好 !

我遇到了同样的问题,这是我如何解决的问题:

  1. 首先,我不能直接将该模块用作npm模块,因为我必须修改源代码,因此我将c / c lib放在我项目的文件夹中(只有几个文件,这没问题)

  2. 关于sandbox.js / contextify.js的文件系统:我将它们重命名为sandbox.txt和contextify.txt,然后使用raw-loader将其作为纯文本加载。

main.js(在顶部)

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

webpack.config.js

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

不要忘记在main.js中将sandbox.js / contextify.js的所有引用更改为sandbox.txt / contextify.txt。

  1. 最后一个棘手的部分,要求:对于NodeVM,我更改了一行

main.js(约250行)

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

我将“ require”更改为“ require:eval('require')”,因此webpack不会对其进行修改(如Coxxs的建议),并且它成功了。

现在,我可以正确使用vm2,而无需将其用作外部库。
我知道这很棘手,也不是很干净,但这是我到目前为止唯一的解决方案。
我希望它可以对您的某些人有所帮助,也可以帮助您进行真正的修复。

如果您有更好的解决方案,我们很乐意听听他们的意见! :)

由于此问题最近没有活动,因此已被自动标记为陈旧。 如果没有其他活动发生,它将关闭。 感谢你的贡献。

FWIW-与Webpack 5捆绑在一起,目标node似乎可行。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

unxcepted picture unxcepted  ·  11评论

seanc picture seanc  ·  3评论

ghost picture ghost  ·  23评论

wintertime-inc picture wintertime-inc  ·  5评论

KonradLinkowski picture KonradLinkowski  ·  10评论