尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

F2 与 React 混用时的 TypeScript JSX 类型冲突:定位与解决方案(@antv/f2)

F2 与 React 混用时的 TypeScript JSX 类型冲突:定位与解决方案(@antv/f2) 数据可视化前端【免费下载链接】F2An elegant, interactive and flexible charting library for mobile.项目地址https://gitcode.com/gh_mirrors/f2/F2点击查看免费下载本文针对 F2 与 React 同时使用时出现的group、circle、rect等 JSX 标签类型报错问题给出完整的排查思路与两种编译模式下的修复方案。读完本文你将掌握如何根据项目的tsconfig.json判断 JSX 编译模式并通过/** jsx jsx */或/** jsxImportSource antv/f2 */注释消除类型冲突同时理解 F2 标签类型命名空间的底层来源以及“编译以文件为单位”的边界约束。问题现象F2 与 React 共存时标签类型报错F2 使用声明式 JSX 语法来构建图表详见 配置 JSX Transform图表内部大量使用group、circle、rect、text等基础图元标签。当你在一个同时安装并使用了 React 与antv/f2的项目中编写图表代码时TypeScript 会对这些标签给出类型提示错误报错大致指向“类型上不存在属性group/circle/rect”或 JSX 元素类型无法解析。问题原因两套 JSX 标签命名空间互相干扰之所以会报错是因为 React 的 SVG 标签类型中同样存在circle、rect等标签。React 内置的 JSX 类型声明React.JSX.IntrinsicElements与 F2 通过 JSX runtime 定义的图元标签类型发生了冲突TypeScript 在同一个编译单元内只能依据某个确定的jsxImportSourceAutomatic 模式或jsxFactoryClassic 模式来解析 JSX 标签当解析目标落在 React 的命名空间上时F2 独有的group、circle等标签便无法被识别。F2 自身的标签类型定义来自antv/f2对antv/f-engineJSX runtime 的转发。在仓库中可以看到jsx-runtime.js 内容为export * from antv/f-engine/jsx-runtime;jsx-runtime.d.ts 内容为export * from antv/f-engine/jsx-runtime;jsx-dev-runtime.d.ts 同样转发自antv/f-engine/jsx-dev-runtime也就是说antv/f2包已经为 JSX runtime 模式Automatic准备好了独立于 React 的标签命名空间。开发者需要做的是“让 TypeScript 在某一个文件里明确使用 F2 的命名空间”而不是依赖全局默认的 React 解析。这也正是下面两种解决方式的出发点。第 1 步确定当前项目的 JSX 编译模式在动手修改之前先打开项目的tsconfig.json找到compilerOptions下的jsx配置项若jsx的值为react或该项未配置此时默认即react则项目处于Classic 编译模式若jsx的值为react-jsx则项目处于Automatic 编译模式。两种模式的区别在官方文档 配置 JSX Transform 中有详细说明Classic 模式每个文件必须显式引入jsx工厂函数或通过pragma指定编译时调用jsx(type, props)形式Automatic 模式编译时自动从jsxImportSource指定的模块导入jsx运行时函数无需在每个文件手动引入。在 Babel 一侧两种模式分别对应babel/plugin-transform-react-jsx插件的pragma/pragmaFrag配置与runtime: automatic/importSource配置在 TypeScript 一侧则对应jsxFactory/jsxFragmentFactory与jsx: react-jsx/jsxImportSource配置。第 2 步Classic 模式文件顶部声明 jsx pragma 并引入工厂函数如果你的项目是 Classic 编译模式jsx: react在每个用到 F2 图表 JSX 的文件顶部添加如下注释与模块引用/** jsx jsx */ import { jsx } from antv/f2;/** jsx jsx */是 TypeScript 支持的 pragma 注释它告诉编译器本文件内所有 JSX 都调用jsx函数来创建元素import { jsx } from antv/f2从 F2 包中引入该工厂函数使类型解析指向 F2 的标签命名空间。作为佐证仓库site下的官方示例几乎全部采用这种写法例如 area.jsx、gradient.jsx 等文件的第一行都是/** jsx jsx */。如果你同时使用 Babel 编译还可以在babel.config.json中全局配置 Classic 模式的 pragma从而免去逐个文件加注释{ plugins: [ [ babel/plugin-transform-react-jsx, { pragma: jsx, pragmaFrag: Fragment } ] ] }对应的 TypeScript 全局配置方式等价于逐文件jsx注释为{ compilerOptions: { jsxFactory: jsx, jsxFragmentFactory: Fragment } }第 3 步Automatic 模式文件顶部声明 jsxImportSource如果你的项目是 Automatic 编译模式jsx: react-jsx只需在每个用到 F2 图表 JSX 的文件顶部添加一行注释/** jsxImportSource antv/f2 */Automatic 模式下编译器会根据jsxImportSource自动导入jsx/jsxs运行时。将导入源指向antv/f2后编译器会从 F2 的 JSX runtime 命名空间解析标签类型与 React 的 SVG 标签类型不再冲突。如果你希望全局生效而不是逐文件加注释可以在tsconfig.json中配置{ compilerOptions: { jsx: react-jsx, jsxImportSource: antv/f2 } }Babel 侧的等价配置为{ plugins: [ [ babel/plugin-transform-react-jsx, { runtime: automatic, importSource: antv/f2 } ] ] }需要注意的是全局把jsxImportSource设置为antv/f2会让项目中所有JSX 都按 F2 语义解析这与 React 项目共存时往往不可取。因此更稳妥的做法是保持全局配置不变指向 React仅在 F2 图表代码所在文件顶部添加/** jsxImportSource antv/f2 */注释实现“按文件切换命名空间”。完成上述修改后重新运行 TypeScript 编译group、circle、rect等标签的类型错误即消失代码补全与类型检查恢复正常。注意事项编译以文件为单位同文件不可混用两套标签一个需要牢记的边界是代码编译是以文件为单位的在一个文件里只能使用一种标签类型。对于 Classic 模式/** jsx jsx */作用于整个文件对于 Automatic 模式/** jsxImportSource antv/f2 */同样作用于整个文件。因此你不能在同一个文件中既写 React 的div、svg组件又写 F2 的Chart、Interval等图表 JSX反之亦然二者只能取其一。如果业务上确实需要在同一页面混用 React 组件与 F2 图表标准做法是将 F2 图表代码拆分到独立的文件中例如单独的ChartView.jsx在该文件顶部按上文添加对应注释React 组件文件保持默认解析即可通过组件边界实现两套 JSX 命名空间的隔离。关于 F2 与 React 生态的常规组合方式可参考 如何在 React 中使用先安装antv/f2与antv/f-react再通过Canvas包裹Chart使用图表内部标签的解析则由上文所述的方式保证。小结场景解决方案Classic 模式jsx: react或未配置文件顶部添加/** jsx jsx */import { jsx } from antv/f2;Automatic 模式jsx: react-jsx文件顶部添加/** jsxImportSource antv/f2 */同文件混用 React 与 F2 标签不支持需将 F2 图表代码拆分到独立文件全局配置Classictsconfig.json配置jsxFactory: jsx或 Babel 配置pragma: jsx全局配置Automatictsconfig.json配置jsxImportSource: antv/f2或 Babel 配置runtime: automaticimportSource: antv/f2核心要点一句话总结F2 的图元标签类型独立于 React 命名空间通过jsx或jsxImportSource注释按文件声明编译目标即可在同一个 React TypeScript 项目中安全地使用 F2 的声明式图表 JSX。赞分享数据可视化前端【免费下载链接】F2An elegant, interactive and flexible charting library for mobile.项目地址https://gitcode.com/gh_mirrors/f2/F2点击查看免费下载相关推荐在React项目中优雅使用AntV F2图表库在React项目中优雅使用AntV F2图表库 前言 AntV F2是一个专注于移动端可视化方案的轻量级图表库它采用声明式语法构建图表UI与React的组件数据可视化前端使用 antv/f2-algorithm 为 F2 移动端图表做高性能数据采样使用 antv/f2 algorithm 为 F2 移动端图表做高性能数据采样 数据采样down sampling / data sampling是移动端数据可视化前端深入 F2 算法扩展包 antv/f2-algorithmLTTB 与常见统计降采样的原理、配置与实战深入 F2 算法扩展包 antv/f2 algorithmLTTB 与常见统计降采样的原理、配置与实战 本文以 F2 仓库中 antv/f2 algori数据可视化前端上一篇录屏总被观众追问按的哪个键Keyviz 免费开源工具让键盘鼠标操作实时可视化下一篇WorkshopDL终极指南免费Steam创意工坊模组下载快速上手手册创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表