news 2026/9/20 2:26:39

react-spring 移除废弃渲染目标与 umbrella 包:从 `@react-spring/web` / `@react-spring/three` 直装的迁移指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
react-spring 移除废弃渲染目标与 umbrella 包:从 `@react-spring/web` / `@react-spring/three` 直装的迁移指南

react-spring 移除废弃渲染目标与 umbrella 包:从@react-spring/web/@react-spring/three直装的迁移指南

【免费下载链接】react-spring✌️ A spring physics based React animation library项目地址: https://gitcode.com/gh_mirrors/re/react-spring

本篇指南基于本仓库 .changeset/remove-deprecated-targets.md 中记录的破坏性变更(breaking change)展开:react-spring 的next主分支已正式移除被标记为废弃的@react-spring/native@react-spring/konva@react-spring/zdog三个渲染目标及其 React Native Hook 变体,同时移除了react-spring伞形(umbrella)包。文章将结合仓库内真实的 package 结构与源码(packages/coretargets/webtargets/threedocs/app/routes/docs.getting-started.mdx等)说明迁移路径:直接安装@react-spring/web@react-spring/three作为目标包,并针对 React Native 场景给出官方推荐的替代方案(Reanimated,其 spring 运行在 UI 线程而非 react-spring 的 JS 线程引擎)。

变更一览:这是一次major级别的破坏性变更

该 changeset 位于 .changeset/remove-deprecated-targets.md,frontmatter 声明:

--- '@react-spring/web': major ---

即该变更只以@react-spring/web为发布锚点、按major(主版本号)发布。注意,由于仓库根目录的 .changeset/config.json 配置了:

"fixed": [["@react-spring/*"]]

所有@react-spring/*包会被固定为一组、同步提升主版本,因此这次移除废弃目标与 umbrella 包的动作实际上影响整个@react-spring/*发布组。变更的具体内容:

  1. 移除废弃的渲染目标@react-spring/native@react-spring/konva@react-spring/zdog三个包被删除;
  2. 移除对应的 React Native Hook 变体(如useSpringuseSpringsuseTrailuseTransition在 native 目标下的导出);
  3. 移除react-springumbrella 包(旧版本中用于统一转发到具体目标包的一层壳);
  4. 明确替代方式:直接安装目标包 ——@react-spring/web@react-spring/three
  5. React Native 用户:改用 Reanimated(官方文档见 changeset 中的链接,仓库内不携带),其 spring 运行在 UI 线程,而 react-spring 的引擎运行在 JS 线程。

从仓库当前目录结构看,targets/下仅保留 targets/web/ 与 targets/three/ 两个目标包,packages/下保留animatedcoresharedtypesrafz等核心与工具包,与变更声明完全一致。

为什么会有「目标包」与「umbrella 包」之分?

react-spring 采用「核心引擎 + 渲染目标」的分层架构:

  • 核心与工具包(平台无关):
    • packages/core/:@react-spring/core,Spring 物理引擎、useSpring/useSprings/useTrail/useTransition等 Hook、Controller/SpringValue等核心类。其入口 packages/core/src/index.ts 统一导出 hooks、components、interpolateControllerSpringValueSpringContextSpringRefFrameValueInterpolation等;
    • packages/animated/:@react-spring/animated,将 Spring 值映射到具体渲染层的适配层(Animated/AnimatedValue/createHost等);
    • packages/shared/、packages/types/、packages/rafz/:工具函数、类型定义与 raf 调度。
  • 渲染目标包(绑定具体平台):
    • targets/web/:@react-spring/web,其入口 targets/web/src/index.ts 通过createHost(primitives, ...)构建animated组件,并export * from '@react-spring/core'把核心 API 一并转发出去;
    • targets/three/:@react-spring/three,面向 react-three-fiber / three.js 场景。

因此用户通常只需要安装一个目标包即可拿到完整 API。而旧版本中额外的react-springumbrella 包只是再包一层转发,除了让import { useSpring } from 'react-spring'的写法成立之外,并没有提供额外能力,反而带来多包维护与版本对齐成本 —— 这正是本次将其移除的动机。

迁移指南:从安装/导入层面直装目标包

第一步:更新安装命令

删除对废弃包的引用,改为直接安装目标包:

# 旧写法(已移除,勿再使用) # npm install react-spring # npm install @react-spring/native @react-spring/konva @react-spring/zdog # 新写法:按你的渲染平台选择 npm install @react-spring/web # Web (DOM / CSS / SVG / HTML) npm install @react-spring/three # three.js / @react-three/fiber

使用 Yarn 或 pnpm 时同理:

yarn add @react-spring/web # 或 pnpm add @react-spring/three

当前仓库内各包的package.json已统一为 ESM-only(见 .changeset/esm-only.md 与 targets/web/package.json 中的"type": "module""exports"字段),并在 package.json 中声明"packageManager": "pnpm@9.15.9""engines": { "node": ">=24.16.0" },请确保包管理器与 Node 版本满足要求。

第二步:修改 import 语句

  • Web 项目:import { useSpring, animated } from 'react-spring'import { useSpring, animated } from '@react-spring/web'
  • Three.js 项目:import { useSpring } from 'react-spring/three'import { useSpring, animated } from '@react-spring/three'
  • 任何from '@react-spring/native'from '@react-spring/konva'from '@react-spring/zdog'的导入均需删除或替换。

以仓库官方入门文档 docs/app/routes/docs.getting-started.mdx 为准,Web 侧的标准用法如下:

import { useSpring, animated } from '@react-spring/web' export default function MyComponent() { const springs = useSpring({ from: { x: 0 }, to: { x: 100 }, }) return ( <animated.div style={{ width: 80, height: 80, background: '#ff6d6d', borderRadius: 8, ...springs, }} /> ) }

注意:animated必须来自目标包(@react-spring/web导出animated及其别名a,见 targets/web/src/index.ts),而useSpring等核心 Hook 通过export * from '@react-spring/core'一并可用,用户无需关心核心包细节。

第三步:检查package.json依赖清单

dependencies中删除:

"react-spring": "...", "@react-spring/native": "...", "@react-spring/konva": "...", "@react-spring/zdog": "..."

保留或新增(按平台二选一):

{ "dependencies": { "@react-spring/web": "^11.0.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }

目标包对 React 的 peer 依赖可见 targets/web/package.json(支持 React 16.8 及以上,含 19);@react-spring/three则额外要求@react-three/fiber >= 6.0three >= 0.126,见 targets/three/package.json。

迁移示例:从 umbrella 到@react-spring/web

迁移前(已废弃写法)

import { useSpring, animated } from 'react-spring' export default function Card() { const props = useSpring({ from: { opacity: 0, transform: 'translateY(20px)' }, to: { opacity: 1, transform: 'translateY(0px)' }, }) return <animated.div style={props}>Hello</animated.div> }

迁移后

import { useSpring, animated } from '@react-spring/web' export default function Card() { const props = useSpring({ from: { opacity: 0, transform: 'translateY(20px)' }, to: { opacity: 1, transform: 'translateY(0px)' }, }) return <animated.div style={props}>Hello</animated.div> }

除 import 来源外,API 形态完全不变 —— 这正是移除 umbrella 包对用户影响最小的原因。仓库 demo 目录下所有沙箱示例(如 demo/src/sandboxes/simple-transition/src/App.tsx、demo/src/sandboxes/trail/src/App.tsx 等)均已统一从@react-spring/web导入,可作为迁移后的真实参考。

React Native 用户:官方推荐的替代方案

changeset 明确给出结论:React Native 场景不再由 react-spring 提供支持,官方推荐使用Reanimated,理由是:

its springs run on the UI thread, unlike react-spring's JS-thread engine.

即 Reanimated 的 spring 动画运行在UI 线程,而 react-spring 的引擎运行在JS 线程,因此在 React Native 上 Reanimated 具备更优的性能基础。这属于该 changeset 中唯一一条带明确论据的替代建议(其官方文档链接见 changeset 原文,仓库内不包含该依赖)。迁移时需将原有@react-spring/native的动画代码逐步改写为 Reanimated 的 API(如useSharedValueuseAnimatedStylewithSpring等),并注意两者 API 形态不同,无法机械替换。

迁移后的仓库结构参考

移除废弃目标后,本仓库的可发布包组织如下:

  • 核心与工具:@react-spring/core(packages/core/)、@react-spring/animated(packages/animated/)、@react-spring/shared(packages/shared/)、@react-spring/types(packages/types/)、@react-spring/rafz(packages/rafz/)
  • 渲染目标:@react-spring/web(targets/web/)、@react-spring/three(targets/three/)
  • 附加:@react-spring/parallax(packages/parallax/)
  • 示例与文档:demo/docs/(在 .changeset/config.json 中被ignore,不随@react-spring/*组发布)

快速自检清单

迁移完成后,可通过以下方式快速确认没有残留:

  1. 全局搜索代码中是否还存在from 'react-spring'from '@react-spring/native'from '@react-spring/konva'from '@react-spring/zdog'的导入;
  2. package.json中不再出现上述四个包名;
  3. 锁文件(package-lock.json/yarn.lock/pnpm-lock.yaml)重新生成后无相关包残留;
  4. npm ls react-spring(或pnpm why react-spring)无输出,或仅剩间接依赖时核实其来源。

总结

本次 changeset 是一次面向下一个主版本(major)的清理型破坏性变更:删除三个早已废弃的渲染目标(native / konva / zdog)及其 React Native Hook 变体,并移除多余的react-springumbrella 包。对绝大多数 Web / Three.js 用户而言,迁移动作收敛为「把 import 来源改成@react-spring/web@react-spring/three」这一条;React Native 用户则需要切换到 UI 线程驱动的 Reanimated。仓库当前 targets/ 目录只保留 web 与 three 两个目标,与变更声明完全吻合,也印证了 react-spring「核心引擎 + 渲染目标」架构向更精简方向收敛的趋势。

【免费下载链接】react-spring✌️ A spring physics based React animation library项目地址: https://gitcode.com/gh_mirrors/re/react-spring

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/20 2:26:22

AssetRipper完整指南:如何快速提取Unity游戏资源

AssetRipper完整指南&#xff1a;如何快速提取Unity游戏资源 【免费下载链接】AssetRipper GUI application to analyze game files 项目地址: https://gitcode.com/GitHub_Trending/as/AssetRipper 手里只有一个 Unity 游戏的发布目录&#xff0c;看不到工程源码&#…

作者头像 李华
网站建设 2026/9/20 2:25:57

IEC 61508-2010功能安全母标准:SIL定级与工程落地全解析

简介&#xff1a;这是一份S IEC 61508-2010功能安全完整英文版标准文档&#xff0c;共669页&#xff0c;面向工业自动化、汽车电子、医疗设备等安全相关系统的设计、开发与认证工程师。资源覆盖IEC 61508全部七个部分&#xff0c;从一般要求、电气/电子/可编程电子安全相关系统…

作者头像 李华
网站建设 2026/9/20 2:25:19

NextAI Translator:3 条命令跑通 ChatGPT 划词翻译工具

NextAI Translator&#xff1a;3 条命令跑通 ChatGPT 划词翻译工具 【免费下载链接】nextai-translator 基于 ChatGPT API 的划词翻译浏览器插件和跨平台桌面端应用 - Browser extension and cross-platform desktop application for translation based on ChatGPT API. 项目…

作者头像 李华
网站建设 2026/9/20 2:25:00

B站直播推流全攻略:OBS配置与RTMP协议详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/20 2:24:36

从Codex到WorkBuddy:多模型AI编程助手实战对比与配置指南

1. 项目背景&#xff1a;为什么放弃 Codex 转向 WorkBuddy先说下我的使用背景。过去大半年我一直在用 Codex 做开发辅助&#xff0c;主要是让它帮我改 bug、写测试、做代码审查这类耗时但相对机械的活。Codex 刚出来那会儿确实惊艳&#xff0c;OpenAI 官方出品&#xff0c;终端…

作者头像 李华
网站建设 2026/9/20 2:23:51

AI行业高薪岗位解析与就业趋势

1. 行业背景与就业趋势分析人工智能行业正在经历从技术探索到规模化商用的关键转折期。根据全球知名调研机构的数据显示&#xff0c;2023年全球AI市场规模已达到1500亿美元&#xff0c;预计到2026年将突破3000亿美元大关。这种爆炸式增长直接带动了人才需求的激增&#xff0c;特…

作者头像 李华