2018-11-10 10:26:28 +08:00
|
|
|
|
# omi-mp - 微信小程序开发和生成 Web
|
2018-11-07 12:51:41 +08:00
|
|
|
|
|
2018-11-11 08:48:01 +08:00
|
|
|
|
> 通过微信小程序开发和一键生成 Web 的 H5 SPA (基于 omi + [omi-router](https://github.com/Tencent/omi/tree/master/packages/omi-router))
|
2018-11-09 10:14:59 +08:00
|
|
|
|
|
2018-11-10 20:24:29 +08:00
|
|
|
|
看下官方模板的转换例子:
|
2018-11-09 14:35:27 +08:00
|
|
|
|
|
2018-11-07 12:51:41 +08:00
|
|
|
|
|
2018-11-11 08:50:20 +08:00
|
|
|
|
| **Index** | **Logs** |
|
|
|
|
|
| ------------------------------- | ----------------------------------- |
|
|
|
|
|
|![](../../assets/mp1.jpg)| ![](../../assets/mp2.jpg)|
|
|
|
|
|
|
2018-11-09 10:13:08 +08:00
|
|
|
|
|
2018-11-10 20:24:29 +08:00
|
|
|
|
因为 Web 里拉取不到用户登录态,更换了用户头像和名称。
|
|
|
|
|
|
|
|
|
|
再看下豆瓣 DEMO 转换的例子:
|
|
|
|
|
|
|
|
|
|
| **小程序** | **Web SPA** |
|
|
|
|
|
| ------------------------------- | ----------------------------------- |
|
|
|
|
|
|![](../../assets/mp-db1.jpg)| ![](../../assets/web-db1.jpg)|
|
|
|
|
|
|![](../../assets/mp-db2.jpg)|![](../../assets/web-db2.jpg)|
|
|
|
|
|
|
|
|
|
|
你可以[在这里找](https://github.com/Tencent/omi/tree/master/packages/omi-mp-douban)到这个豆瓣小程序。
|
|
|
|
|
|
2018-11-09 10:16:41 +08:00
|
|
|
|
# 快速体验
|
|
|
|
|
|
2018-11-13 20:04:29 +08:00
|
|
|
|
```bash
|
|
|
|
|
$ npm i omi-cli -g
|
|
|
|
|
$ omi init-mp your_project_name
|
|
|
|
|
$ cd your_project_name
|
|
|
|
|
$ npm start
|
|
|
|
|
$ npm run build
|
|
|
|
|
```
|
|
|
|
|
|
2018-11-10 20:42:42 +08:00
|
|
|
|
把小程序项目拷贝到 src-mp 目录,如果是新的小程序,可以在 src-mp 目录创建小程序,目录要求:
|
|
|
|
|
|
|
|
|
|
目录说明:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
├─ components //存放所有组件,每个组件一个文件夹,暂不支持乱放
|
|
|
|
|
├─ pages //存放所有页面,每个页面一个文件夹,暂不支持乱放
|
|
|
|
|
│ ├─ index
|
|
|
|
|
│ └─ logs
|
|
|
|
|
├─ utils
|
|
|
|
|
├─ app.js
|
|
|
|
|
├─ app.json
|
|
|
|
|
├─ app.wxss
|
|
|
|
|
├─ project.config.json
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
请严格按照上面目录约定,然后就可以使用小程序开发或生产 Web 了:
|
2018-11-09 14:35:27 +08:00
|
|
|
|
|
2018-11-09 10:16:41 +08:00
|
|
|
|
```bash
|
|
|
|
|
npm start //开发
|
|
|
|
|
npm build //发布
|
|
|
|
|
```
|
|
|
|
|
|
2018-11-09 10:13:08 +08:00
|
|
|
|
# 原理
|
2018-11-07 12:51:41 +08:00
|
|
|
|
|
2018-11-10 20:24:29 +08:00
|
|
|
|
## WXML 编译
|
2018-11-07 12:51:41 +08:00
|
|
|
|
|
|
|
|
|
举个99乘法表的例子:
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
compile(`
|
|
|
|
|
<view wx:for="{{[1, 2, 3, 4, 5, 6, 7, 8, 9]}}" wx:for-item="i">
|
|
|
|
|
<view wx:for="{{[1, 2, 3, 4, 5, 6, 7, 8, 9]}}" wx:for-item="j">
|
|
|
|
|
<view wx:if="{{i <= j}}">
|
|
|
|
|
{{i}} * {{j}} = {{i * j}}
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
</view>`)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
编译之后:
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
function render() {
|
|
|
|
|
return (
|
2018-11-11 08:48:01 +08:00
|
|
|
|
h('div', {}, [1, 2, 3, 4, 5, 6, 7, 8, 9].map((i, index) => {
|
|
|
|
|
h('div', {}, [1, 2, 3, 4, 5, 6, 7, 8, 9].map((j, index) => {
|
|
|
|
|
i <= j && h('div', {}, [`${i} * ${j} = ${i * j}`])
|
2018-11-07 12:51:41 +08:00
|
|
|
|
}))
|
|
|
|
|
}))
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
2018-11-11 08:48:01 +08:00
|
|
|
|
Wxml 会被编译成 hyperscript,并且对应的标签会被[转换成 HTML 标签](https://github.com/Tencent/omi/blob/master/packages/omi-mp/scripts/mp/tag-mapping.js#L1-L17)。
|
|
|
|
|
|
2018-11-10 20:24:29 +08:00
|
|
|
|
## WXSS 编译
|
|
|
|
|
|
|
|
|
|
编译前:
|
|
|
|
|
|
|
|
|
|
```css
|
|
|
|
|
view image .image{
|
|
|
|
|
color: red;
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
编译后:
|
|
|
|
|
|
|
|
|
|
```css
|
|
|
|
|
div img .image{
|
|
|
|
|
color: red;
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
2018-11-10 20:42:42 +08:00
|
|
|
|
不仅仅标签会进行替换,rpx 也会在运行时替换成 px。
|
|
|
|
|
|
2018-11-09 09:40:34 +08:00
|
|
|
|
## 小程序生命周期
|
|
|
|
|
|
|
|
|
|
### 页面生命周期函数
|
|
|
|
|
|
2018-11-13 19:33:29 +08:00
|
|
|
|
| 名称 | 描述 | Omi 是否支持 |
|
2018-11-13 09:16:41 +08:00
|
|
|
|
| ------ | ------ |------ |
|
2018-11-13 19:33:29 +08:00
|
|
|
|
| onLoad | 监听页面加载| 支持 |
|
|
|
|
|
| onShow | 监听页面显示 | 支持 |
|
|
|
|
|
| onReady | 监听页面初次渲染完成 | 支持 |
|
|
|
|
|
| onHide | 监听页面隐藏 | 支持|
|
|
|
|
|
| onUnload | 监听页面卸载 | 支持 |
|
2018-11-09 09:40:34 +08:00
|
|
|
|
|
|
|
|
|
### 组件生命周期函数
|
|
|
|
|
|
2018-11-13 19:33:29 +08:00
|
|
|
|
| 名称 | 描述 |Omi 是否支持 |
|
2018-11-13 09:16:41 +08:00
|
|
|
|
| ------ | ------ |------ |
|
2018-11-13 19:33:29 +08:00
|
|
|
|
| created | 在组件实例进入页面节点树时执行,注意此时不能调用 setData | 支持 |
|
|
|
|
|
| attached | 在组件实例进入页面节点树时执行 | 支持 |
|
|
|
|
|
| ready | 在组件布局完成后执行,此时可以获取节点信息(使用 SelectorQuery ) | 支持 |
|
|
|
|
|
| moved | 在组件实例被移动到节点树另一个位置时执行 | 支持|
|
|
|
|
|
| detached | 在组件实例被从页面节点树移除时执行 | 支持 |
|
2018-11-09 09:40:34 +08:00
|
|
|
|
|
2018-11-13 19:44:05 +08:00
|
|
|
|
## 支持的 API
|
|
|
|
|
|
|
|
|
|
- [x] wx.request
|
|
|
|
|
- [x] wx.navigateTo
|
|
|
|
|
- [x] wx.getSystemInfo
|
|
|
|
|
- [x] wx.getSystemInfoSync
|
|
|
|
|
- [x] wx.setNavigationBarTitle
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- [x] this.setData
|
|
|
|
|
- [x] this.triggerEvent
|
|
|
|
|
|
2018-11-13 19:46:04 +08:00
|
|
|
|
支持事件绑定,自定义事件绑定,支持 props、data 属性等等。
|
|
|
|
|
|
2018-11-10 20:24:29 +08:00
|
|
|
|
## 注意
|
|
|
|
|
|
2018-11-13 19:44:05 +08:00
|
|
|
|
目前不支持导入 template 标签和一些原生组件标签,需要一些时间翻译成对应的 HTML 自定义元素,欢迎试用反馈或 PR。
|
2018-11-10 20:24:29 +08:00
|
|
|
|
|
2018-11-07 12:51:41 +08:00
|
|
|
|
## License
|
|
|
|
|
MIT [@dntzhang](https://github.com/dntzhang)
|