# atom-wm000001
**Repository Path**: mmstudio/atom-wm000001
## Basic Information
- **Project Name**: atom-wm000001
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: HEAD
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-09-15
- **Last Updated**: 2025-09-15
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# WebView
在原生页面嵌入浏览器
## 时序
### 初始化
原生应用启动 -> 原生页面初始化 -> webview组件初始化 -> web页面初始化 -> [web组件发送ready事件](https://www.npmjs.com/package/@mmstudio/aw000024)
### 原生应用调用web页面
初始化 -> 原生应用中触发事件 -> 原生应用调用web组件 -> web组件中的响应执行并返回值给原生应用
上面第二步提到的事件,可以是用户事件(比如用户点击了原生页面上某个按钮),也可以是系统事件(比如系统初始化)
示例
比如我们有一个页面,分为两部分,上面部分为原生部分实现,有一个展示文字和一个按钮
```tsx
<>
调用页面示例
>
```
因为react的函数式组件的策略的限制,我们暂时还不能通过更方便的方法拿到webview组件对象,暂时我们可以这样操作:
1. 在页面的tpl.tsx中引入函数
```ts
import React, { useRef } from 'react';
```
1. 在页面的tpl.tsx中使用全局函数生成引用对象
```ts
const ref001 = useRef(null);
```
1. 在webview组件添加属性ref
```tsx
<>
>
```
1. 在按钮事件上附加上该参数
```tsx
<>
>
```
完整的tpl.tsx如下:
```tsx
import am1 from '@mmstudio/am000001';
import React, { useRef } from 'react';
import { Button, Text } from 'react-native';
import WM000001 from '@mmstudio/wm000001';
export default function tpl(a: (action: string, ...args: unknown[]) => ((...args: unknown[]) => void), s: (...class_names: string[]) => {}, d: (d: string) => T, mm: am1) {
const ref001 = useRef(null);
return (<>
调用页面示例
>);
}
```
1. 在响应a002.ts中调用webview控件的fire方法
```ts
import am1 from '@mmstudio/am000001';
import { RefObject } from 'react';
import WM000001 from '@mmstudio/wm000001';
export default async function a002(mm: am1, e: unknown, ref: RefObject, ...args: unknown[]) {
const webview = ref.current!;
interface Result {
// todo
}
const r001 = await webview.fire('a002', { foo: 'bar' }, 3000);
}
}
```
### web页面调用原生应用
初始化 -> web页面触发事件 -> [调用原生应用](https://www.npmjs.com/package/@mmstudio/aw000025) -> 原生应用响应执行并返回值 -> web页面拿到原生应用返回值
相比较来说,web页面调用原生应用比较简单,首先,没有只能在一个web组件中调用的限制,其次,也没有必须发送ready事件的限制。第三,可以使用原子操作完成调用,更方便。
示例
比如我们有一个web页面,其中某个组件中有一个按钮,用户点击时调用响应a001
```html
```
那么我们在响应a001.ts中可以通过调用原子操作即可
```ts
import aw1 from '@mmstudio/aw000001';
import aw25 from '@mmstudio/aw000025';
export default async function a001(mm: aw1) {
// 调用原生响应
/**
* 原生响应结果
*/
const r1586312934 = await (() => {
const p1 = 'a005'; // 原生事件/响应名
const p2 = { foo: 'mm', bar: 123 }; // 原生事件/响应参数
const p3 = 3000; // 超时时间
interface Result {
mm: string;
}
return aw25(p1, p2, p3);
})();
alert(`原生响应返回结果${JSON.stringify(r1586312934)}`);
}
```
## 其它
在混合型app应用中,建议尽量将所有业务逻辑放置在web应用中,这样可以大大加速页面的开发过程。
每个web页面中必须有且只能有一个web组件[发送ready事件](https://www.npmjs.com/package/@mmstudio/aw000024)后,才可以实现从原生应用到web页面的调用,否则,只能单向从web页面调用原生应用
有动画及对时效性要求非常高的页面(如首页展示部分),需用原生实现。
web页面跳转如果需要动画,创建多个原生页面,嵌入不同的web页面来实现,页面跳转不使用超链接,而是[调用原生响应](https://www.npmjs.com/package/@mmstudio/aw000025),在原生响应中调用原子操作来实现页面跳转。
视频播放部分使用原生实现,可达到更流畅的效果,且支持视频格式更丰富。
调用系统功能使用原生实现,由web组件通过[原子操作](https://www.npmjs.com/package/@mmstudio/aw000025)调用
webview组件和原生应用共享cookie,所以,建议将所有服务将放置在web应用中。如果web应用占的比重较少,也可以通过nginx同域部署,在同域下共享cookie的方式来实现。