我正在尝试创建一个库,该库公开一个函数,该函数根据传递的参数动态导入其他库。就像是:
export function foo(deps){
deps.forEach(dep => import(dep).then(doSomething))
}
//usage:
foo(['bar', 'baz']);
库不应该提前知道 deps,但是使用它的应用程序肯定会并且会导入 foo 和任何 deps。
当我尝试创建这样的东西时,我收到一条错误消息“找不到模块栏”。我知道 webpack 使用静态分析来捆绑动态导入,但我知道它可以在导入中有变量。
如果有办法提前列出依赖关系,那很好。我尝试过这样的事情(来自我使用 foo 的应用程序)
function doNotRun(){
import('bar');
import('baz');
}
foo(['bar', 'baz'])
希望 webpack 在运行时发现它已经捆绑了这个模块,但它似乎与模块 ID 不匹配。我看到 bar 和 baz 捆绑成块,但实际导入使用不同的模块 ID。
我还尝试让 foo 了解所有可能的 deps(按名称,但不导入它们),但它失败了,因为它需要在构建时了解它们。像这样:
function getImportPromise(subapp){
switch(subapp){
case 'baz':
return import('baz');
case 'bar':
return import('bar');
default:
return Promise.reject(dep + ' is not known');
}
}
export function foo(deps){
deps.forEach(dep => getImportPromise(dep).then(doSomething))
}
有可能做我要求的吗?
编辑:我刚刚意识到像我最后一个想法这样的东西可以奏效,只是感觉很奇怪。更一般地说,我认为 import() 可以接受变量。
export function foo(deps, getImportPromise){
deps.forEach(dep => getImportPromise(dep).then(doSomething))
}
//usage
function getImportPromise(subapp){
switch(subapp){
case 'baz':
return import('baz');
case 'bar':
return import('bar');
default:
return Promise.reject(dep + ' is not known');
}
}
foo(['bar', 'baz'], getImportPromise);
如果这是推荐的解决方案,那还不错。我只是希望有一种方法可以让 foo 自己进行导入。