# 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 解析为适当的命名空间对象。

Last Updated: 6/14/2023, 8:56:23 AM