【发布时间】:2021-11-03 21:11:17
【问题描述】:
我正在制作一个动态系统,该系统需要执行在浏览器应用程序(Edge 或 Chrome 最新版本)中动态生成的 JS 代码。 从另一个例子来看,我已经做到了这一点:
async function doIt()
{
let code = "";
code += "import { MyClass } from './MyClass.js' ;\n";
code += 'export default function hello() { console.log( "Hello World" ); console.log( MyClass.test() ); }';
const dataUri = 'data:text/javascript;charset=utf-8,' + encodeURIComponent(code);
let module = await import(dataUri);
console.log(module); // property default contains function hello now
const myHello = module.default;
myHello(); // puts "Hello World" to console
}
MyClass.js 有一个简单的 ES6 模块类:
export class MyClass {
static test() { return 42; }
}
当我运行 doIt() 函数时,没有第二行带有 import 语句, 它运行良好,直到它尝试调用 MyClass.test() ,当然这是未知的。 启用第二个导入行后,Edge 或 Chrome 会出现错误:
"Uncaught TypeError: Failed to resolve module specifier './MyClass.js'.
Invalid relative url or base scheme isn't hierarchical."
我尝试创建模块引用的绝对路径,但错误仍然相同。 . 那么,如何使这项工作?或者也许是替代解决方案? 但是使用 ES6 模块是一个硬性要求。
【问题讨论】:
-
在
await import(dataUri)之前从未见过,太酷了! -
正如错误消息所说,基本方案必须是分层的,但是当您动态
import时没有关联的方案,因此静态导入无法解决,如果您尝试使用绝对路径或相对路径。 -
也许使用require?
-
@UrielChami 使用 ES6 模块系统是我的硬性要求...
-
@GuerricP 你是说(目前)不可能将格式化字符串中的 import(...) 与任何用 ES6 模块实现的 JS 代码一起使用?
标签: javascript dynamic import