# transform

类型: (code: string, id: string) => TransformResult
类别: async, sequential
上一个钩子: load,用于加载当前处理的文件。如果使用缓存并且该模块有一个缓存副本,则为 shouldTransformCachedModule,如果插件为该钩子返回了 true
下一个钩子: moduleParsed,一旦文件已被处理和解析
type TransformResult = string | null | Partial<SourceDescription>;

interface SourceDescription {
	code: string;
	map?: string | SourceMap;
	ast?: ESTree.Program;
	assertions?: { [key: string]: string } | null;
	meta?: { [plugin: string]: any } | null;
	moduleSideEffects?: boolean | 'no-treeshake' | null;
	syntheticNamedExports?: boolean | string | null;
}

可用于转换单个模块。为了避免额外的解析开销,例如此钩子已经使用 this.parse 生成了 AST,此钩子可以选择性地返回一个 { code, ast, map } 对象。ast 必须是一个标准的 ESTree AST,每个节点都有 start 和 end 属性。如果转换不移动代码,则可以通过将 map 设置为 null 来保留现有的源映射。否则,你可能需要生成源映射。请参见 源代码转换 一节。

请注意,在观察模式下或明确使用缓存时,当重新构建时,此钩子的结果会被缓存,仅当模块的 code 发生更改或上次触发此钩子时添加了通过 this.addWatchFile 添加的文件时,才会再次触发该模块的钩子。

在所有其他情况下,将触发 shouldTransformCachedModule 钩子,该钩子可以访问缓存的模块。从 shouldTransformCachedModule 返回 true 将从缓存中删除该模块,并再次调用 transform。

你还可以使用返回值的对象形式来配置模块的其他属性。请注意,可能只返回属性而没有代码转换。

如果对于 moduleSideEffects 返回 false,并且没有其他模块从该模块导入任何内容,则即使该模块具有副作用,该模块也不会被包含。

如果返回 true,则 Rollup 将使用其默认算法,包括模块中具有副作用的所有语句(例如修改全局或导出变量)。

如果返回 "no-treeshake",则将关闭此模块的除屑优化,并且即使为空,它也将包含在生成的块之一中。

如果返回 null 或省略标志,则 moduleSideEffects 将由加载此模块的 load 钩子、解析此模块的第一个 resolveId 钩子、treeshake.moduleSideEffects 选项或最终默认为 true 确定。

assertions 包含导入此模块时使用的导入断言。目前,它们不会影响产物模块的呈现,而是用于文档目的。如果返回 null 或省略标志,则 assertions 将由加载此模块的 load 钩子、解析此模块的第一个 resolveId 钩子或此模块的第一个导入中存在的断言确定。

有关 syntheticNamedExports 选项的影响,请参见 合成命名导出。如果返回 null 或省略标志,则 syntheticNamedExports 将由加载此模块的 load 钩子、解析此模块的第一个 resolveId 钩子、treeshake.moduleSideEffects 选项或最终默认为 false 确定。

有关如何使用 meta 选项,请参见 自定义模块元数据。如果返回 null 或省略选项,则 meta 将由加载此模块的 load 钩子、解析此模块的第一个 resolveId 钩子或最终默认为空对象确定。

你可以使用 this.getModuleInfo 在此钩子中查找 assertions、meta、moduleSideEffects 和 syntheticNamedExports 的先前值。

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