跳转到内容

模块类型

作为一个 Web 打包器,rolldown 不仅应接受 JavaScript 文件作为输入项,还应支持其他类型的输入项,如 CSS(将来)、JSON、DataUrl 等。

因此,如果 rolldown 无需任何额外插件便可识别输入项,则意味着 rolldown 将此输入项的类型视为一等公民。

我们称这些一等公民类型为模块类型

对用户的影响

在大多数情况下,用户无需关心这个概念,因为 rolldown 会自动为用户处理。

Rolldown 使用文件的扩展名来确定模块类型,但有时这还不够。例如,某个文件包含 JSON 数据,但扩展名是.data。在这种情况下,rolldown 无法将其识别为 JSON 文件,因为扩展名不是.json

在这种情况下,用户需要通过配置rolldown.config.mjs中的moduleTypes字段来告知 rolldown .data扩展名的模块类型是什么。

rolldown.config.mjs
js
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 会处理其余部分。

遵循 MIT 许可证发布。