ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Vite Breaking Changes 指南:用 future 选项提前迁移,平滑过渡到下一个大版本

Vite Breaking Changes 指南:用 future 选项提前迁移,平滑过渡到下一个大版本 Vite Breaking Changes 指南用 future 选项提前迁移平滑过渡到下一个大版本【免费下载链接】viteNext generation frontend tooling. Its fast!项目地址: https://gitcode.com/GitHub_Trending/vi/vite在 Vite 的升级过程中插件作者和框架维护者最关心的问题是下一个大版本会移除什么如何提前感知并迁移Vite 官方文档的 Breaking Changes 页面给出了答案它系统性地列出了 Vite 中所有计划中的 API 弃用、移除与变更并且这些变更大多可以通过配置项future选项 以“可选开启”的方式提前落地。读完全文你能掌握 Vite 破坏性变更的三级分类体系Planned / Considering / Past、future选项的工作原理以及this.environment、hotUpdate钩子、ModuleRunner、Per-environment APIs 等核心迁移方案的完整代码示例。Breaking Changes 文档的组织方式docs/changes/index.md 将整个破坏性变更清单划分为三个部分每一部分对应不同的成熟度Planned已计划这些变更计划在下一个大版本中实施。弃用警告或使用警告会尽可能引导开发者完成迁移同时 Vite 团队会主动向框架作者、插件作者和用户推广这些变更。当前列出的三项是this.environmentin HooksHMRhotUpdatePlugin HookSSR UsingModuleRunnerAPIConsidering评估中这些变更仍处于实验阶段通常是旨在改进当前使用模式的实验性 API。由于并非所有变更都列在文档中完整的实验性提案列表维护在 Vite GitHub Discussions 的 Experimental 标签下官方明确建议目前不建议切换到这些 API它们被加入 Vite 是为了收集反馈鼓励开发者在实际用例中试用并反馈。当前列出的是Move to Per-environment APIsShared Plugins During Build共享构建期间的插件对应docs/changes下的提案页Past历史变更已完成或被回滚的变更会归入这一部分它们在当前大版本中已不再相关。截至当前仓库状态该部分标注为 “No past changes yet”即还没有已经走完整个生命周期的变更。这一 “Planned → Considering → Past” 的流转机制本质上是 Vite 对破坏性变更的渐进式弃用流程新 API 先作为实验 API 引入并收集反馈确认后进入 Planned 阶段给出明确迁移指引待大版本移除旧 API 后归档到 Past。核心机制future选项让破坏性变更可提前开启Breaking Changes 页面的开篇即指出清单中的大部分变更都可以通过 Vite 配置中的future选项以 opt-in 方式启用。该选项的文档定义见 docs/config/shared-options.md类型Recordstring, warn | undefined说明启用未来的破坏性变更以便平滑迁移到 Vite 的下一个大版本。该列表可能随着新功能的开发而随时更新、新增或移除。在源码中配置字段声明于 packages/vite/src/node/config.tsfuture?: FutureOptions | warnFutureOptions的具体键值则由 packages/vite/src/node/deprecations.ts 完整定义——每个键对应一项破坏性变更提案const deprecationCode { // 对应 this.environment-in-hooks 提案 removePluginHookSsrArgument: this-environment-in-hooks, removePluginHookHandleHotUpdate: hotupdate-hook, // 对应 per-environment-apis 提案 removeServerModuleGraph: per-environment-apis, removeServerReloadModule: per-environment-apis, removeServerPluginContainer: per-environment-apis, removeServerHot: per-environment-apis, removeServerTransformRequest: per-environment-apis, removeServerWarmupRequest: per-environment-apis, // 对应 ssr-using-modulerunner 提案 removeSsrLoadModule: ssr-using-modulerunner, } satisfies Recordkeyof FutureOptions, string这套结构的意义在于当你在配置中把某个键设为warn后Vite 会在你每次触及对应旧 API 的位置打印弃用警告。警告的生成逻辑见 warnFutureDeprecation只有当config.future[type] warn时才会输出警告文案形如[vite future] Plugin hookoptions.ssris replaced withthis.environment.config.consumer server.并附带指向docs/changes对应提案页的文档链接。也就是说future选项既是迁移开关也是迁移检测工具——官方文档中每一项提案都会提示 “To identify your usage, setfuture.xxxtowarn”。Planned 变更详解以下三项是已进入计划阶段、面向Vite Plugin Authors的破坏性变更每一项都源自 Environment APIVite 6 引入的多环境架构对旧插件接口的替代。this.environmentin Hooks用环境上下文取代options.ssr背景在 Vite 6 之前一个 Vite 应用只有client和ssr两个环境插件作者通过在resolveId、load、transform钩子中传入的options.ssr参数来区分这两种环境。Vite 6 开始应用可以定义任意数量的命名环境因此引入了插件上下文中的this.environment来访问当前模块所处的环境。迁移方式见 docs/changes/this-environment-in-hooks.md将options.ssr替换为this.environment.config.consumer serverimport { Plugin } from vite export function myPlugin(): Plugin { return { name: my-plugin, resolveId(id, importer, options) { const isSSR this.environment.config.consumer server if (isSSR) { // SSR specific logic } else { { // Client specific logic } }, } }this.environment的价值不仅在于知道当前环境名称它还能访问环境配置选项、模块图信息和 transform 管线environment.config、environment.moduleGraph、environment.transformRequest()。插件作者因此可以避免对整个 dev server 的依赖通常需要在configureServer钩子中缓存server实例。检测用法在配置中设置future.removePluginHookSsrArgument: warn。注意this.environment自v6.0引入options.ssr的弃用计划在未来的大版本执行。HMRhotUpdatePlugin Hook从handleHotUpdate迁移docs/changes/hotupdate-hook.md 计划弃用handleHotUpdate插件钩子改为环境感知的hotUpdate钩子。两者的差异维度handleHotUpdatehotUpdate调用次数对所有环境只调用一次每个环境各调用一次入参类型HmrContextHotUpdateOptionsmodules内容Client 与 SSR 环境混合的ModuleNode仅当前环境的EnvironmentModuleNode事件覆盖仅 updatetype: create \| update \| delete覆盖更多 watch 事件环境访问server字段通过this.environment新旧入参类型定义interface HmrContext { file: string timestamp: number modules: ArrayModuleNode read: () string | Promisestring server: ViteDevServer } interface HotUpdateOptions { type: create | update | delete file: string timestamp: number modules: ArrayEnvironmentModuleNode read: () string | Promisestring server: ViteDevServer }三种典型迁移模式过滤模块列表最常用的简单迁移handleHotUpdate({ modules }) { return modules.filter(condition) } // Migrate to: hotUpdate({ modules }) { return modules.filter(condition) }返回空数组并触发全量刷新将server.moduleGraph/server.ws替换为this.environment上的同名能力hotUpdate({ modules, timestamp }) { const invalidatedModules new Set() for (const mod of modules) { this.environment.moduleGraph.invalidateModule( mod, invalidatedModules, timestamp, true ) } this.environment.hot.send({ type: full-reload }) return [] }完全自定义 HMR 处理通过this.environment.hot.send向客户端发送自定义事件而不是旧 API 的server.ws.send。检测用法future.removePluginHookHandleHotUpdate: warn。官方明确提示目前不推荐立即离开handleHotUpdate可以先用warn模式实验并反馈。SSR UsingModuleRunnerAPI取代server.ssrLoadModuledocs/changes/ssr-using-modulerunner.md 指出server.ssrLoadModule已被 Module Runner 取代。动机在于server.ssrLoadModule(url)只能在ssr环境中导入模块且只能在 dev server 同进程中执行而拥有自定义环境的应用中每个环境都关联一个ModuleRunner它可能运行在独立的线程或进程中对应的新 API 是moduleRunner.import(url)。另一个重要的行为变更使用 Module Runner API 时不再需要调用server.ssrFixStacktrace和server.ssrRewriteStacktrace——除非将sourcemapInterceptor设为false否则堆栈跟踪会自动更新。检测用法future.removeSsrLoadModule: warn。Considering 变更详解Move to Per-environment APIsdocs/changes/per-environment-apis.md 描述的是ViteDevServer上多个与模块图、模块转换相关的 API 迁移到DevEnvironment实例的过程。动机Vite v5 及之前dev server 固定拥有client和ssr两个环境server.moduleGraph混合了两个环境的模块节点通过clientImportedModules和ssrImportedModules关联但每个模块只维护单一的importers列表转换后的模块用idssr布尔值表示调用 API 时必须显式传ssr标志如server.moduleGraph.getModuleByUrl(url, ssr)、server.transformRequest(url, { ssr })。Vite v6 允许创建任意数量的自定义环境client、ssr、edge等单一的ssr布尔值不再够用。Vite 的选择不是把 API 改成server.transformRequest(url, { environment })而是把这些方法直接移到环境实例上使其可以脱离 dev server 被调用。官方给出的迁移映射表旧 API新 APIserver.moduleGraphenvironment.moduleGraphserver.reloadModule(module)environment.reloadModule(module)server.pluginContainerenvironment.pluginContainerserver.transformRequest(url, ssr)environment.transformRequest(url)server.warmupRequest(url, ssr)environment.warmupRequest(url)server.hotserver.client.environment.hot检测用法注意这是一个完整的future配置块示例future: { removeServerModuleGraph: warn, removeServerReloadModule: warn, removeServerPluginContainer: warn, removeServerHot: warn, removeServerTransformRequest: warn, removeServerWarmupRequest: warn, }与 deprecations.ts 中的键一一对应可互相印证removeServerModuleGraph等六个键全部映射到per-environment-apis提案页。Shared Plugins During BuildBreaking Changes 页面在 Considering 一节还列出了 Shared Plugins During Build 提案插件在构建期间跨环境共享该提案处于实验评估阶段官方同样不建议提前切换仅作为反馈渠道存在。从源码看future选项的完整链路结合 packages/vite/src/node/deprecations.ts 的实现可以还原出future选项的运行时行为判定开关isFutureDeprecationEnabled 检查config.future?.[type]是否为真值内部各子系统据此决定是否启用新行为路径。打印警告warnFutureDeprecation 在config.future[type] warn时输出黄色[vite future]前缀的弃用消息附具体替换建议如The server.moduleGraph is replaced with this.environment.moduleGraph.和文档链接并支持携带调用栈以便定位触发点。键值与提案页绑定deprecationCode将每个FutureOptions键映射到docs/changes下的提案文档路径警告中的文档链接即由此生成——源码、配置文档与提案文档三者形成闭环。从源码结构看FutureOptions的键集合就是当前所有“待废弃旧 API”的完整清单options.ssr参数、handleHotUpdate钩子、server上的六个方法/属性以及server.ssrLoadModule。迁移实践建议结合 Breaking Changes 文档给出的信息可以归纳出一套可操作的迁移自查流程盘点先阅读各提案页的 “Affected scope” 标注当前所有 Planned 项均面向Vite Plugin Authors确认自己是否受影响。开启警告按提案提示逐项将future中对应键设为warn例如removePluginHookSsrArgument、removePluginHookHandleHotUpdate、removeSsrLoadModule及removeServer*系列在开发/构建日志中收集全部命中点。按映射表迁移使用各提案页 Migration Guide 中的代码示例替换旧调用options.ssr→this.environment.config.consumer serverhandleHotUpdate→hotUpdatethis.environmentserver.ssrLoadModule→moduleRunner.import(url)server.*→environment.*。留意行为差异如hotUpdate会新增create/delete事件用type区分Module Runner 场景下堆栈修复变为自动行为对 Considering 阶段的 API官方建议保持观察而非立即切换。关注清单变化future选项列表“可能随时更新、新增或移除”Breaking Changes 页面本身也会随版本演进更新Planned 项完成归档后会移入 Past 一节升级 Vite 大版本前应重新核对该清单。需要说明的是所有提案均标注了引入版本this.environment、hotUpdate、ModuleRunner、Environment实例均自v6.0引入与弃用计划“planned for a future major”即旧 API 在当前大版本仍可用warn模式只是提前体检工具而非强制开关。【免费下载链接】viteNext generation frontend tooling. Its fast!项目地址: https://gitcode.com/GitHub_Trending/vi/vite创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表