You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用eval创建ES Module上下文以实现动态import?

解决方案:在ESM-based Scheme解释器中支持动态导入

首先明确:无法通过eval单独创建ESM上下文来解决这个问题,但有更直接的方式在Scheme环境中调用动态import,无需修改库核心代码。

为什么你的尝试失败

你写的eval("import")("fs")存在两个关键问题:

  1. import是ES模块的语法关键字,不是可直接引用的全局函数或变量,eval("import")会试图读取名为import的标识符,而非获取动态导入功能。
  2. 动态导入的正确写法是import("specifier"),这是一个特殊的表达式,不是普通函数调用,不能通过提取import标识符来调用。

可行方案

1. 直接暴露动态import给Scheme环境

因为你的LIPS本身基于ESM模块,动态import()可以在模块内直接调用。你可以在标准库或加载LIPS的入口代码中,把动态导入函数绑定到Scheme的全局作用域:

// 假设LIPS提供了注册全局函数的API,比如registerGlobal
import LIPS from './lips.js';

// 注册Scheme可调用的import函数
LIPS.registerGlobal('js-import', async (specifier) => {
  return await import(specifier);
});

之后在Scheme中就可以这样调用:

(js-import "fs")

如果LIPS没有现成的注册API,也可以直接修改其全局环境对象(比如LIPS.global之类的属性,具体看LIPS的内部实现),把import函数挂载上去。

2. 用new Function封装动态导入

如果不想直接修改LIPS的代码,可以创建一个封装动态导入的函数,再暴露给Scheme:

const dynamicImport = new Function('specifier', 'return import(specifier);');
// 把dynamicImport绑定到Scheme环境,步骤同上

这个函数在ESM模块中创建,内部可以正常调用import(),因为它继承了模块的上下文权限。

3. 用eval直接执行动态导入表达式

如果必须用eval,可以直接在eval中写入完整的动态导入语句,而非试图提取import:

// 在Scheme解释器中生成这样的代码执行
eval('import("fs").then(module => { /* 把模块内容传递给Scheme环境 */ })');

这种方式不需要额外绑定函数,但代码可读性和维护性不如直接暴露函数。

核心原理

动态import()是ES标准中允许在任意上下文(包括普通函数、eval)中调用的表达式,只要所在的宿主模块是ESM。因此不需要额外创建ESM上下文,只需要把这个调用能力暴露给Scheme解释器即可。

内容的提问来源于stack exchange,提问作者jcubic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 05:42:15