问题描述
import { functionTest } from './function_test'
function runnerFunctiontest() {
console.log("Test");
}
export class Runner {
run(source : string) {
eval(source);
}
}
如果我实例化一个Runner
并调用run("runnerFunctiontest();")
,该函数将正确运行,但是如果我调用run("functiontest();")
(应运行导入的函数),则会出现一个错误,提示{{1} }未定义。
我该如何解决?
我尝试过的一件事是用functionTest
替换了run
中的代码,但是必须添加所有这样的导入函数实在很烦人-它们大约有20个,并且数字只会随着时间的流逝而增加。
此外,我知道调用new Function('functionTest',source).(functionTest);
的安全性-这是(至少我知道)做我想要的事情的唯一方法,该方法运行用户在其中生成的任意JavaScript代码用户的浏览器。
解决方法
由于import
不是本机运算符,因此webpack(或其他方式)会为您转换它。
通过webpack编译后,您的代码将变为:
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__,"Runner",function() { return Runner; });
/* harmony import */ var _function_test__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
function runnerFunctionTest() {
console.log("Test");
}
class Runner {
run(source) {
eval(source);
}
}
functionTest
这个名字已经不存在了,这就是为什么您不能评估它的原因。
一种可能的解决方案是为其赋予本地名称:
import { functionTest } from './function_test'
const function_test = functionTest;
function runnerFunctionTest() {
console.log("Test");
}
export class Runner {
run(source : string) {
eval(source);
}
}
然后您可以运行runner.run('function_test()')