模块类型
作为一个 Web 打包器,rolldown 不仅应接受 JavaScript 文件作为输入项,还应支持其他类型的输入项,如 CSS(将来)、JSON、DataUrl 等。
因此,如果 rolldown 无需任何额外插件便可识别输入项,则意味着 rolldown 将此输入项的类型视为一等公民。
我们称这些一等公民类型为模块类型
。
对用户的影响
在大多数情况下,用户无需关心这个概念,因为 rolldown 会自动为用户处理。
Rolldown 使用文件的扩展名来确定模块类型
,但有时这还不够。例如,某个文件包含 JSON 数据,但扩展名是.data
。在这种情况下,rolldown 无法将其识别为 JSON 文件,因为扩展名不是.json
。
在这种情况下,用户需要通过配置rolldown.config.mjs
中的moduleTypes
字段来告知 rolldown .data
扩展名的模块类型
是什么。
export default {
moduleTypes: {
'.data': 'json',
},
}
对于插件
插件作者还可以在许多地方指定文件的模块类型
,例如load
挂钩和transform
挂钩。
模块类型
为插件制定了正式约定,以便独立插件可以一致地处理特定类型的文件,无需考虑其他插件的详细信息。
例如,vite 会为.vue
文件创建一个虚拟 css 模块,并将?lang=css
附加到模块的 id,这使得 vue 插件将这些模块识别为 css 模块。但这只是 vue 插件的一种约定,其他插件可能不会遵循此约定。
现在有了 Module Type
,vite 可以将虚拟 css 模块的 Module Type
指定为 css
,其他插件(如 postcss 插件)可以在不知道 vue 插件的详细信息的情况下处理这些 css 模块。
Module Type
的另一个功能是,它使插件更容易支持新类型的文件。比如,要添加对 .jsonc
文件的支持,插件只需在 load
钩子中移除 .jsonc
文件的注释,并将 Module Type
指定为 json
。Rolldown 会处理其余部分。