Skip to content

共享依赖机制

编程式场景的 React、zustand、lucide-react 等依赖不打包进场景包,而是由客户端注入。

原理

构建时

  • 共享依赖被标记为 external
  • import 语句被重写为全局变量引用
javascript
// 源码
import React from 'react'

// 构建后
const React = __AWEECLAW_SHARED__.modules.react

运行时

客户端启动时注入共享依赖:

javascript
window.__AWEECLAW_SHARED__ = {
  modules: {
    react: require('react'),
    'react-dom': require('react-dom'),
    'react/jsx-runtime': require('react/jsx-runtime'),
    zustand: require('zustand'),
    'lucide-react': require('lucide-react'),
  },
}

配置

scenario.json 中声明共享依赖:

json
{
  "sharedDeps": {
    "react": "^18.3.0",
    "react-dom": "^18.3.0",
    "zustand": "^5.0.0",
    "lucide-react": "^0.562.0"
  }
}

当前共享依赖

依赖版本说明
react^18.3.0React 核心
react-dom^18.3.0React DOM
react/jsx-runtime^18.3.0JSX 运行时
zustand^5.0.0状态管理
lucide-react^0.562.0图标库

优势

  1. 减少包大小:不重复打包 React 等大型库
  2. 避免版本冲突:所有场景使用同一版本 React
  3. 避免 hooks 崩溃:React 要求单例,共享依赖保证这一点
  4. 加载更快:共享依赖已在客户端预加载

自定义依赖

如果需要使用共享依赖列表之外的库,需要自行打包:

json
{
  "sharedDeps": {
    "react": "^18.3.0",
    "react-dom": "^18.3.0"
  }
}

其他依赖(如 lodashdayjs 等)会被打包进场景包。

注意事项

  1. 版本兼容:确保场景使用的共享依赖版本与客户端兼容
  2. 不要修改共享依赖:不能修改 __AWEECLAW_SHARED__ 对象
  3. 类型声明:SDK 已包含共享依赖的类型声明

AweeClaw AI 应用构建平台