图像与设计
在 Flows 应用中集成 Cognite Reveal…
当需要在 React+TypeScript 的 Flows 应用中通过 @cognite/reveal-widget 嵌入交互式 Cognite Reveal 3D 查看器时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
在 Flows 应用中集成 Cognit特定
解决思路
- 检查目标应用:读取 `package.json`、`vite.config.ts`、`src/main.tsx` 以及应用的文件夹/别名约定。
- 用应用的包管理器安装包和 peers;复用已有 pinned React 和 SDK 版本,若满足 peer 范围。
- 读取 `references/vite-config.md`,在 `vite.config.ts` 中添加 `three`/`@cognite/reveal` 的 `resolve.dedupe` 条目;不需要 `process`/`util`/`assert` polyfills,包已提供浏览器可用版本。
- 读取 `references/csp-and-fixes.md`,根据场景/模型实际内容配置 `manifest.json` 的 CSP 允许项:场景地面/天空盒纹理、360° 图像集合;同时处理点云的 app 侧修复和 StrictMode 问题。
- 添加一个 controller class,包装 `RevealWidgetController`,从自己的事件处理器中命令式驱动它:加载资源、设置样式/高亮实例、控制相机;不要在 `useEffect` 中响应 prop 变化来驱动。参考 `references/implementation.md`。
- 挂载 `RevealWidget`:传入 `viewerOptions={{ sdk, useCoreDm }}`(`useCoreDm` 按项目设置,不能硬编码)和 `setControllerRef`,放在具有显式高度的容器中。
- 不要让 `RevealWidget` 嵌套在本包的另一层 provider 中;它自己管理内部 Reveal context。
- 选择资源模式:默认使用模型浏览器模式(`sdk.models3D.list()` + classic `modelId`/`revisionId`),除非用户已提供 CDM `externalId`/`space` 模型引用;完整示例见 `references/implementation.md`。
- 清理:当 `Reveal3DResourceHandle` 不再需要时(选择变化、卸载),对它调用 `.remove()`。
- 运行类型检查和构建(`tsc --noEmit`、`pnpm build` 等),修复依赖/peer 版本问题。
- 依赖版本:`@cognite/reveal-widget` 用 `^0.2.0`;`react`/`react-dom` 用 `^18.3.1`(peer);`@cognite/reveal` 固定 `4.36.0`;`@cognite/sdk` 用 `^10.14.0`(peer)。
- 其他传递依赖(`three`、`@tanstack/react-query`、`@base-ui/react`、`@floating-ui/react`、`@tabler/icons-react`、`dayjs`、`lodash-es`、`ml-matrix`、`random-seed`、`@cognite/aura`、`@cognite/reveal-components`)会自动安装;不要手动添加,除非应用需要 pin 版本,或应用代码直接导入它们。
- 如果使用模型浏览器模式并直接导入 `@tanstack/react-query`(`useInfiniteQuery`/`useQuery`),将它加为直接依赖,因为在 pnpm 等严格包管理器下从声明的传递依赖导入会破坏构建。
- 安装示例(按应用包管理器调整):`pnpm add @cognite/reveal-widget @cognite/reveal@4.36.0 @cognite/sdk react react-dom`。
- 确认 lockfile 只解析出一个 `@cognite/reveal` 版本;固定为 `4.36.0`,因为 `@cognite/reveal-widget@0.2.0` 的 peer 范围仍写 `4.35.3` 已过时,而其依赖 `@cognite/reveal-components` 内部硬编码 `4.36.0`;真实版本分裂会静默破坏 Reveal 共享查看器状态。
- 不要将任何源码 bundle 复制进应用;不要安装 `process`、`util`、`assert`、`ajv` 或 `vite-plugin-node-polyfills`。
- 通过 `setControllerRef` 获取 `RevealWidgetController` 并命令式驱动 widget;不要重建旧的声明式 provider 树(`CacheProvider`/`RevealProvider`/`RevealCanvas`/`Reveal3DResources`)。
- 在 `setControllerRef` 中,构造新 controller class 实例之前先 dispose 之前的实例(`.dispose()` 对跟踪的 handle 调用 `.remove()`);当 `widgetController` 为 `undefined`(卸载)时再次 dispose。
- 传给 `addResource` 的资源必须精确匹配其 `type`/`sourceType` 组合的标识符形状;混用 classic 和 CDM 字段会导致类型错误。
- 实例高亮只影响已 contextualized(映射)到已加载模型的实例;先加载模型,再调用 `styleByInstance`/`focusInstances`。
- `RevealWidget` 的容器必须有显式高度,因为它会填满父容器。
- 添加路由/页面时,用 `React.lazy` + `Suspense` 懒加载 canvas 较重的查看器内容。
- `useCoreDm` 必须匹配项目,不能默认 `true`;否则会出现错误 401 和 360 集合静默失败。没有单一 flag 可判断,按 `references/csp-and-fixes.md` 中的 SDK 调用检查。
- 不要在应用外包 `React.StrictMode`;它会在开发环境中于加载中途拆除 `RevealWidget` 的查看器并产生生产环境不存在的错误。
- 点云需要应用侧同源修复,因为 `manifest.json` 无法直接授予它们所需的 `data:` CSP 允许项;具体见 `references/csp-and-fixes.md`。
- 如果加载带地面/天空盒的场景,在 `manifest.json` 中为 `https://*.cognitedata.com` 授予 `img-src`;如果加载 360° 图像集合,按观察到的 CSP 违规中的实际签名 URL 主机授予 `connect-src`。
- 读取 `references/implementation.md` 获取完整资源标识符目录(CAD、点云、360 图像、scenes)、实例高亮和相机控制。
- 读取 `references/vite-config.md` 获取 Vite/dedupe 配置。
- 读取 `references/csp-and-fixes.md` 获取 CSP/`manifest.json` 允许项、`useCoreDm`/StrictMode 陷阱、点云 app 侧修复和 360 集合排障。
- 完成后验证:`@cognite/reveal-widget` 与 peers(`react`、`react-dom`、`@cognite/reveal`、`@cognite/sdk`)以兼容版本安装。
- 验证:`@cognite/reveal` 固定为 `4.36.0`(不是 `@cognite/reveal-widget` peer 范围里的 `4.35.3`),且 lockfile 中只有一个解析出的 `@cognite/reveal` 版本。
- 验证:没有源码 bundle 被复制进应用;所有导入来自 `@cognite/reveal-widget`,应用代码不直接导入 `@cognite/reveal-components`。
- 验证:`vite.config.ts` 包含 `resolve.dedupe: ['three', '@cognite/reveal']`(加上应用已有的 dedupe 条目)。
- 验证:没有为这个包添加 `process`/`util`/`assert` polyfills 或 `vite-plugin-node-polyfills`。
- 验证:`RevealWidget` 只挂载一次,不嵌套在另一个 Reveal provider 中,容器有显式高度。
- 验证:`viewerOptions.useCoreDm` 匹配目标项目是否实际基于 Core Data Model。
- 验证:应用没有包裹 `React.StrictMode`。
- 验证:如果加载带地面/天空盒的场景,`manifest.json` 为 `https://*.cognitedata.com` 授予 `img-src`;如果加载 360° 图像集合,按 CSP 违规中实际签名 URL 主机授予 `connect-src`;如果需要点云,同源 `Blob` 补丁已应用并验证。
- 验证:有一个 controller class 包装通过 `setControllerRef` 获取的 `RevealWidgetController`,并命令式驱动 `addResource`/`styleByInstance`/`focusInstances`/`cameraController`。
- 验证:controller class 在新 controller 设置时和卸载时都 dispose,并 `.remove()` 跟踪的资源 handle。
- 验证:资源标识符使用正确的 `type`/`sourceType` 形状。
- 验证:typecheck 和 build 通过。
适用边界 · 注意事项
- 不适用于静态图、图可视化或不相关的自定义 Three.js 场景。
- 不要用于旧的应用内复制 bundle 方案;已有复制 bundle 的应用应迁移到安装 `@cognite/reveal-widget`,而不是扩展旧实现。
- 当应用不是 React+TypeScript、未包在 `@cognite/app-sdk` 的 `CogniteSdkProvider` 中,或 CDF 项目没有可用的 3D 模型/未提供模型或 revision ID 时不适用。