共享依赖机制
编程式场景的 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.0 | React 核心 |
| react-dom | ^18.3.0 | React DOM |
| react/jsx-runtime | ^18.3.0 | JSX 运行时 |
| zustand | ^5.0.0 | 状态管理 |
| lucide-react | ^0.562.0 | 图标库 |
优势
- 减少包大小:不重复打包 React 等大型库
- 避免版本冲突:所有场景使用同一版本 React
- 避免 hooks 崩溃:React 要求单例,共享依赖保证这一点
- 加载更快:共享依赖已在客户端预加载
自定义依赖
如果需要使用共享依赖列表之外的库,需要自行打包:
json
{
"sharedDeps": {
"react": "^18.3.0",
"react-dom": "^18.3.0"
}
}其他依赖(如 lodash、dayjs 等)会被打包进场景包。
注意事项
- 版本兼容:确保场景使用的共享依赖版本与客户端兼容
- 不要修改共享依赖:不能修改
__AWEECLAW_SHARED__对象 - 类型声明:SDK 已包含共享依赖的类型声明

