# renderDynamicImport
类型: | renderDynamicImportHook |
---|---|
类别: | sync, first |
上一个钩子: | 如果这是第一个块,则为 renderStart,否则为上一个块的 banner,footer,intro,outro |
下一个钩子: | 对于每个 import.meta.ROLLUP_FILE_URL_referenceId 的使用,为 resolveFileUrl,对于当前块中所有其他访问import.meta,为 resolveImportMeta |
type renderDynamicImportHook = (options: {
customResolution: string | null;
format: string;
moduleId: string;
targetModuleId: string | null;
}) => { left: string; right: string } | null;
此钩子通过提供导入表达式参数左侧(import()和右侧())的代码替换,提供了对动态导入如何呈现的细粒度控制。返回null将推迟到此类型的其他钩子,最终呈现特定于格式的默认值。
format 是呈现的输出格式, moduleId 是执行动态导入的模块的 ID。如果导入可以解析为内部或外部 ID,则 targetModuleId 将设置为此 ID,否则将为 null。如果动态导入包含由 resolveDynamicImport 钩子解析为替换字符串的非字符串表达式,则 customResolution 将包含该字符串。
以下代码将使用自定义处理程序替换所有动态导入,添加 import.meta.url 作为第二个参数,以允许处理程序正确解析相对导入:
function dynamicImportPolyfillPlugin() {
return {
name: 'dynamic-import-polyfill',
renderDynamicImport() {
return {
left: 'dynamicImportPolyfill(',
right: ', import.meta.url)'
};
}
};
}
// 输入
import('./lib.js');
// 输出
dynamicImportPolyfill('./lib.js', import.meta.url);
下一个插件将确保所有 esm-lib 的动态导入都被标记为外部模块,并保留为导入表达式,以便允许 CommonJS 构建在 Node 13+中导入 ES 模块,参见 Node 文档中的 从 CommonJS 导入 ES 模块。
function retainImportExpressionPlugin() {
return {
name: 'retain-import-expression',
resolveDynamicImport(specifier) {
if (specifier === 'esm-lib') return false;
return null;
},
renderDynamicImport({ targetModuleId }) {
if (targetModuleId === 'esm-lib') {
return {
left: 'import(',
right: ')'
};
}
}
};
}
请注意,当此钩子在非 ES 格式中重写动态导入时,不会生成任何交互代码以确保例如默认导出可用作.default。插件有责任确保重写的动态导入返回一个 Promise,该 Promise 解析为适当的命名空间对象。