11# 插件 API {#plugin-api}
22
3- Vite 插件扩展了设计出色的 Rollup 接口,带有一些 Vite 独有的配置项 。因此,你只需要编写一个 Vite 插件,就可以同时为开发环境和生产环境工作 。
3+ Vite 插件扩展了 Rolldown 的插件接口,添加了一些 Vite 特有的选项 。因此,您只需编写一次 Vite 插件,即可使其同时适用于开发环境和构建环境 。
44
5- ** 推荐在阅读下面的章节之前,首先阅读下 [ Rollup 插件文档] ( https://cn.rollupjs.org/plugin-development/ ) **
6-
7- <!-- TODO: update the link above to Rolldown's documentation -->
5+ ** 建议先阅读 [ Rolldown 的插件文档] ( https://rolldown.rs/apis/plugin-api ) ,然后再阅读以下章节。**
86
97## 致插件创作者 {#authoring-a-plugin}
108
@@ -19,12 +17,12 @@ Vite 努力秉承开箱即用的原则,因此在创作一款新插件前,请
1917
2018## 约定 {#conventions}
2119
22- 如果插件不使用 Vite 特有的钩子,可以作为 [ 兼容 Rollup 的插件 ] ( #rollup -plugin-compatibility ) 来实现,推荐使用 [ Rollup 插件名称约定 ] ( https://cn.rollupjs.org/ plugin-development/ #conventions ) 。
20+ 如果插件不使用 Vite 特定的钩子,并且可以作为 [ 兼容的 Rolldown 插件 ] ( #rolldown -plugin-compatibility ) 实现,则建议使用 [ Rolldown 插件命名约定 ] ( https://rolldown.rs/apis/ plugin-api #conventions ) 。
2321
24- - Rollup 插件应该有一个带 ` rollup -plugin-` 前缀、语义清晰的名称。
25- - 在 package.json 中包含 ` rollup -plugin` 和 ` vite-plugin ` 关键字。
22+ - Rolldown 插件应该有一个带 ` rolldown -plugin-` 前缀、语义清晰的名称。
23+ - 在 package.json 的 ` keywords ` 字段中包含 ` rolldown -plugin` 和 ` vite-plugin ` 关键字。
2624
27- 这样,插件也可以用于纯 Rollup 或基于 WMR 的项目。
25+ 这样,插件也可以用于纯 Rollup 或基于 Rollup 的项目。
2826
2927对于 Vite 专属的插件:
3028
@@ -79,7 +77,7 @@ export default defineConfig({
7977## 简单示例 {#simple-examples}
8078
8179::: tip
82- 通常的惯例是创建一个 Vite/Rollup 插件作为一个返回实际插件对象的工厂函数。该函数可以接受允许用户自定义插件行为的选项。
80+ 通常的惯例是创建一个 Vite/Rolldown/ Rollup 插件作为一个返回实际插件对象的工厂函数。该函数可以接受允许用户自定义插件行为的选项。
8381:::
8482
8583### 转换自定义文件类型 {#transforming-custom-file-types}
@@ -140,37 +138,37 @@ import { msg } from 'virtual:my-module'
140138console .log (msg)
141139```
142140
143- 虚拟模块在 Vite(以及 Rollup)中都以 ` virtual: ` 为前缀,作为面向用户路径的一种约定。如果可能的话,插件名应该被用作命名空间,以避免与生态系统中的其他插件发生冲突。举个例子,` vite-plugin-posts ` 可以要求用户导入一个 ` virtual:posts ` 或者 ` virtual:posts/helpers ` 虚拟模块来获得编译时信息。在内部,使用了虚拟模块的插件在解析时应该将模块 ID 加上前缀 ` \0 ` ,这一约定来自 rollup 生态。这避免了其他插件尝试处理这个 ID(比如 node 解析),而例如 sourcemap 这些核心功能可以利用这一信息来区别虚拟模块和正常文件。` \0 ` 在导入 URL 中不是一个被允许的字符,因此我们需要在导入分析时替换掉它们。一个虚拟 ID 为 ` \0{id} ` 在浏览器中开发时,最终会被编码为 ` /@id/__x00__{id} ` 。这个 id 会被解码回进入插件处理管线前的样子,因此这对插件钩子的代码是不可见的。
141+ 虚拟模块在 Vite(以及 Rolldown/ Rollup)中都以 ` virtual: ` 为前缀,作为面向用户路径的一种约定。如果可能的话,插件名应该被用作命名空间,以避免与生态系统中的其他插件发生冲突。举个例子,` vite-plugin-posts ` 可以要求用户导入一个 ` virtual:posts ` 或者 ` virtual:posts/helpers ` 虚拟模块来获得编译时信息。在内部,使用了虚拟模块的插件在解析时应该将模块 ID 加上前缀 ` \0 ` ,这一约定来自 rollup 生态。这避免了其他插件尝试处理这个 ID(比如 node 解析),而例如 sourcemap 这些核心功能可以利用这一信息来区别虚拟模块和正常文件。` \0 ` 在导入 URL 中不是一个被允许的字符,因此我们需要在导入分析时替换掉它们。一个虚拟 ID 为 ` \0{id} ` 在浏览器中开发时,最终会被编码为 ` /@id/__x00__{id} ` 。这个 id 会被解码回进入插件处理管线前的样子,因此这对插件钩子的代码是不可见的。
144142
145143请注意,直接从真实文件派生出来的模块,就像单文件组件中的脚本模块(如.vue 或 .svelte SFC)不需要遵循这个约定。SFC 通常在处理时生成一组子模块,但这些模块中的代码可以映射回文件系统。对这些子模块使用 ` \0 ` 会使 sourcemap 无法正常工作。
146144
147145## 通用钩子 {#universal-hooks}
148146
149- 在开发中,Vite 开发服务器会创建一个插件容器来调用 [ Rollup 构建钩子] ( https://cn.rollupjs.org/ plugin-development/ #build-hooks ) ,与 Rollup 如出一辙。
147+ 在开发中,Vite 开发服务器会创建一个插件容器来调用 [ Rolldown 构建钩子] ( https://rolldown.rs/apis/ plugin-api #build-hooks ) ,与 Rolldown 如出一辙。
150148
151149以下钩子在服务器启动时被调用:
152150
153- - [ ` options ` ] ( https://cn.rollupjs.org/plugin-development/ #options )
154- - [ ` buildStart ` ] ( https://cn.rollupjs.org/plugin-development/ #buildstart )
151+ - [ ` options ` ] ( https://rolldown.rs/reference/interface.plugin #options )
152+ - [ ` buildStart ` ] ( https://rolldown.rs/reference/Interface.Plugin #buildstart )
155153
156154以下钩子会在每个传入模块请求时被调用:
157155
158- - [ ` resolveId ` ] ( https://cn.rollupjs.org/plugin-development/ #resolveid )
159- - [ ` load ` ] ( https://cn.rollupjs.org/plugin-development/ #load )
160- - [ ` transform ` ] ( https://cn.rollupjs.org/plugin-development/ #transform )
156+ - [ ` resolveId ` ] ( https://rolldown.rs/reference/Interface.Plugin #resolveid )
157+ - [ ` load ` ] ( https://rolldown.rs/reference/Interface.Plugin #load )
158+ - [ ` transform ` ] ( https://rolldown.rs/reference/Interface.Plugin #transform )
161159
162160它们还有一个扩展的 ` options ` 参数,包含其他特定于 Vite 的属性。你可以在 [ SSR 文档] ( /guide/ssr#ssr-specific-plugin-logic ) 中查阅更多内容。
163161
164162一些 ` resolveId ` 调用的 ` importer ` 值可能是根目录下的通用 ` index.html ` 的绝对路径,这是由于 Vite 非打包的开发服务器模式无法始终推断出实际的导入者。对于在 Vite 的解析管道中处理的导入,可以在导入分析阶段跟踪导入者,提供正确的 ` importer ` 值。
165163
166164以下钩子在服务器关闭时被调用:
167165
168- - [ ` buildEnd ` ] ( https://cn.rollupjs.org/plugin-development/ #buildend )
169- - [ ` closeBundle ` ] ( https://cn.rollupjs.org/plugin-development/ #closebundle )
166+ - [ ` buildEnd ` ] ( https://rolldown.rs/reference/Interface.Plugin #buildend )
167+ - [ ` closeBundle ` ] ( https://rolldown.rs/reference/Interface.Plugin #closebundle )
170168
171- 请注意 [ ` moduleParsed ` ] ( https://cn.rollupjs.org/plugin-development/ #moduleparsed ) 钩子在开发中是 ** 不会** 被调用的,因为 Vite 为了性能会避免完整的 AST 解析。
169+ 请注意 [ ` moduleParsed ` ] ( https://rolldown.rs/reference/Interface.Plugin #moduleparsed ) 钩子在开发中是 ** 不会** 被调用的,因为 Vite 为了性能会避免完整的 AST 解析。
172170
173- [ Output Generation Hooks] ( https://cn.rollupjs.org/ plugin-development/ #output-generation-hooks ) (除了 ` closeBundle ` ) 在开发中是 ** 不会** 被调用的。你可以认为 Vite 的开发服务器只调用了 ` rollup.rollup() ` 而没有调用 ` bundle.generate() ` 。
171+ [ Output Generation Hooks] ( https://rolldown.rs/apis/ plugin-api #output-generation-hooks ) ( ` closeBundle ` 除外)在开发期间 ** 不会** 被调用 。
174172
175173## Vite 独有钩子 {#vite-specific-hooks}
176174
@@ -485,8 +483,7 @@ Vite 插件也可以提供钩子来服务于特定的 Vite 目标。这些钩子
485483- 带有 ` enforce: 'post'` 的用户插件
486484- Vite 后置构建插件(最小化,manifest,报告)
487485
488- 请注意,这与钩子的排序是分开的,钩子的顺序仍然会受到它们的 ` order` 属性的影响,这一点 [和 Rollup 钩子的表现一样](https: // cn.rollupjs.org/plugin-development/#build-hooks)。
489-
486+ 请注意,这与钩子排序是分开的,钩子仍然像往常一样单独受其 [` order` 属性](https: // rolldown.rs/reference/TypeAlias.ObjectHook#order) 的约束。
490487## 情景应用 {#conditional- application}
491488
492489默认情况下插件在开发(serve)和构建(build)模式中都会调用。如果插件只需要在预览或构建期间有条件地应用,请使用 ` apply` 属性指明它们仅在 ` 'build'` 或 ` 'serve'` 模式时调用:
@@ -509,21 +506,22 @@ apply(config, { command }) {
509506}
510507` ` `
511508
512- ## Rollup 插件兼容性 {#rollup - plugin- compatibility}
509+ ## Rolldown 插件兼容性 {#rolldown - plugin- compatibility}
513510
514- 相当数量的 Rollup 插件将直接作为 Vite 插件工作(例如:` @rollup/plugin-alias` 或 ` @rollup/plugin-json` ),但并不是所有的,因为有些插件钩子在非构建式的开发服务器上下文中没有意义。
511+ 相当数量的 Rolldown / Rollup 插件将直接作为 Vite 插件工作(例如:` @rollup/plugin-alias` 或 ` @rollup/plugin-json` ),但并不是所有的,因为有些插件钩子在非构建式的开发服务器上下文中没有意义。
515512
516- 一般来说,只要 Rollup 插件符合以下标准,它就应该像 Vite 插件一样工作:
513+ 一般来说,只要 Rolldown / Rollup 插件符合以下标准,它就应该像 Vite 插件一样工作:
517514
518- - 没有使用 [` moduleParsed` ](https: // cn.rollupjs.org/plugin-development/#moduleparsed) 钩子。
515+ - 它不使用 ` moduleParsed` 钩子。
516+ - 它不依赖 Rolldown 特有的选项,例如 ` transform.inject` 。
519517- 它在打包钩子和输出钩子之间没有很强的耦合。
520518
521- 如果一个 Rollup 插件只在构建阶段有意义,则在 ` build.rollupOptions .plugins` 下指定即可。它的工作原理与 Vite 插件的 ` enforce: 'post'` 和 ` apply: 'build'` 相同。
519+ 如果一个 Rolldown / Rollup 插件只在构建阶段有意义,则在 ` build.rolldownOptions .plugins` 下指定即可。它的工作原理与 Vite 插件的 ` enforce: 'post'` 和 ` apply: 'build'` 相同。
522520
523- 你也可以用 Vite 独有的属性来扩展现有的 Rollup 插件:
521+ 你也可以用 Vite 独有的属性来扩展现有的 Rolldown / Rollup 插件:
524522
525523` ` ` js [vite.config.js]
526- import example from 'rollup -plugin-example'
524+ import example from 'rolldown -plugin-example'
527525import { defineConfig } from 'vite'
528526
529527export default defineConfig({
@@ -556,7 +554,7 @@ Vite 暴露了 [`@rollup/pluginutils` 的 `createFilter`](https://github.com/rol
556554
557555### 钩子过滤功能 {#hook- filters}
558556
559- Rolldown 引入了[钩子过滤器功能](https: // rolldown.rs/plugins /hook-filters) ,以减少 Rust 和 JavaScript 运行时之间的通信开销。此功能允许插件指定确定何时调用钩子的模式,从而通过避免不必要的钩子调用来提高性能。
557+ Rolldown 引入了[钩子过滤器功能](https: // rolldown.rs/apis/plugin-api /hook-filters) ,以减少 Rust 和 JavaScript 运行时之间的通信开销。此功能允许插件指定确定何时调用钩子的模式,从而通过避免不必要的钩子调用来提高性能。
560558
561559Rollup 4.38 .0 + 和 Vite 6.3 .0 + 也支持此功能。为了使你的插件向后兼容旧版本,请确保在钩子处理程序中也运行该过滤器。
562560
0 commit comments