【发布时间】:2021-09-28 09:46:53
【问题描述】:
使用节点,我转译了一个 typescript tsx 文件 int javascript。然后我需要调用该 javascript 代码中描述的函数。使用 ES6 模块。
我用
writeFileSync('./temp/page1.js', js) // js is the module source code
import page from '../temp/page1.js'
page 是这里的默认导出,这是我要调用的函数。
这很好,但我想知道是否有更好的方法来调用模块源代码中的函数?一种避免将源代码保存到临时文件中的方法。
eval 不会是安全问题,但我认为它不会给我默认导出,在这个旧函数中不考虑模块。
也许与节点有关?
我发现 https://www.npmjs.com/package/node-eval 可以避免文件保存,尽管它仍然需要文件名,这会导致我的代码有些脆弱。
节点:模块 节点:虚拟机
可能很有希望,看看https://github.com/node-eval/node-eval/blob/master/index.js,但我还没有弄清楚是否以及如何。
类似,但与 require 更相关:Load node.js module from string in memory
https://github.com/floatdrop/require-from-string 也没有用
所有带有 node:vm 的变体
import vm from 'node:vm'
let context = vm.createContext({}, {name:"temp1.mjs"})
vm.runInContext(js, context, {filename: "temp2.mjs"})
导致“无法在模块外使用 import 语句”
【问题讨论】:
-
你在什么环境下运行它?网页?
-
在节点中。最后,这将是一个打包插件,比如一个雪包插件。
-
rtm vm: nodejs.org/api/vm.html - 取决于您的使用情况,您可能正在寻找 vm.runInNewContext,看来您本质上想以安全的方式执行
jsvar 中的内容,您可以在上下文、新内容或此上下文中使用 vm 模块。 -
是的,我可能会找到一种方法,会挖掘它。谢谢
标签: javascript node.js eval es6-modules