live-mp

鹅直播 2.0

Usage no npm install needed!

<script type="module">
  import liveMp from 'https://cdn.skypack.dev/live-mp';
</script>

README

鹅直播小程序

wx13a74d0d3ab0942e (现网) 鹅直播
wxb58a41ffda339bf5 (测试) 鹅推流
wx0c3417205d9852a9 (主干) 鹅推流助手

注意:由于每个环境对应的union_id唯一,所以大车进各个环境时需要提交代码至对应环境

加开发者权限找**小白**

整体架构

Live

风格指南

  • 【modal】和【store】都放在根目录然后分好区,具体看项目目录

变量命名

  • 【文件夹】小写字母横杠命名:live-room-horizon

  • 【组件内主文件命名】 统一采用index.*: index.*

  • 【纯js(非组件)文件命名】:统一采用小驼峰命名: voiceSpeed.js

  • 【类名】首字母大写驼峰命名: TestClass

  • 【变量】首字母小写驼峰命名: testValue

  • 【私有变量】下划线开头驼峰命名: _privateValue

  • 【常量】大写字母下划线写法: TEST_CONST

  • 【样式类名】小写字母横杠命名: style-class

图片资源

分包异步化

由于主包限制2M,有些比较大的包在多个分包里都有用到,遂引入了分包异步化 大型SDK通用文件统一放在sdkpkg文件夹下,需要使用的包通过异步的方式引入使用,这里是异步载入的包进行执行,和import使用方式有所不一样,需要格外注意 示例代码

let Imsdk = null
require.async("../../sdkpkg/xiaoe-im-sdk.js").then(res => {
    ImSdk = res
    ImSdk.initReady({
        config: config
    })
})

项目目录

|- api                      // 统一接口封装(只允许在 store 内请求使用)
|- components               // 公共组件(各模块内部的自行维护)
|- constants                // 常量定义
|- libs                     // 通用函数
|- model                    // 核心业务逻辑封装
    |- userinfo                 // 用户信息相关model, 基于功能模块进行分块即可,不用分具体页面这样,可以参考api目录的分层结构
    |- layout                   // layout布局相关业务逻辑梳理
|- pages                    // 组件页面
    |- example                  // 示例页面
        |- components               // 页面私有组件
        |- index.js                   // Js 逻辑
        |- index.wxml                 // 页面
|- store                    // 数据仓库
    |- global                   // 所有页面共用store,存在于小程序的整个生命周期
    |- page
        |- common               // 2个&2个以上的页面共用的store类放在这里,只是代码的复用,没有数据复现,需要销毁的场景数据还是得销毁
        |- live-room-horizon    // 横屏直播间页面store
            |- discussion
                |- messageStore.js  // 具体的Store文件
        |- live-room-vertical   // 直播列表页面store 
|- subpkg                   // 分包内容
    |- live-pusher-h            // 横屏推流页
    |- live-pusher-v            // 竖屏推流页
    |- live-room-horizon              // 横屏直播间
        | - components          // 页面私有组件
        | - index.js            // js逻辑
        | - index.wxml          // 页面
    |- live-room-vertical       // 竖屏直播间
|- sdkpkg
    |- xiaoe-im-sdk.js          // 各种静态sdk包,一些较大的SDK包可以放这里,然后通过分包异步化的方式引入执行 [分包异步化]() 
|- workers                  // web-worker 预留文件夹

目录说明 - api

统一存放所有接口 URL,调用时使用对象的 Key 指代,避免接口发生变化需要修改多处地方

目录说明 - components

存放全局组件

模块内部的组件不允许放在该目录,应自行在模块内部新建 components 文件夹进行管理

目录说明 - constant

用于存放业务中需要使用的常量,统一收归,业务代码内需要写死参数的地方需要统一使用常量替代

目录说明 - libs

全局通用函数存放

目录说明 - model

全局通用的 Model,业务逻辑尽量按实例的维度收归在这里,Page进行负责页面渲染,Store充当中介用于斜街Page & Model;

  • Model 应该继承自 CommonModel类(外部通过subscribe方法进行变更监听,model类通过inform通知外部更新)

目录说明 - store

数据仓库,用于衔接Model&Page,以共享数据的方式暴露,多个页面可以基于单个Store进行响应式页面更新,一个Page可能依赖多个Store进行数据更新

Store设计应该遵循以下原则

  • Store constructor里面应该只提供 data 的默认值设置工作
  • Store 应该提供一个init方法用于业务逻辑初始化,需要基于业务逻辑在 Page/Component 生命周期内调用
  • Store 应该关注 Page/Component 销毁的时候遗留的数据状态 (这些状态会停留在内存中)
  • 整个应用应关注定时器相关的销毁工作,小程序多个页面共用一个执行环境,离开一个页面不会销毁当前页面的环境状态

代码实例

// MyStore
import Store from "/libs/westore/index"

class MyStore extends Store {
    constructor() {
        super()
        this.data = {
            name: "默认名称",
            remainTime: {
                days: 0,
                hours: 0,
                minutes: 0,
                seconds: 0
            }
        }
    }
    init() {
        this.model = new Model()
        this.model.subscribe(() => {
            this.name = this.model.name
            this.remainTime = this.model.remainTime
            this.update()
        })
    }
}

expoort default new MyStore()
// Page
import myStore from '/path/myStore'

let data = myStore.data
// 依赖多个store的情况
/*
    let data = {
        my: myStore.data,
        tab: tabStore.data
    }
*/
Page({
    data: data,
    onLoad() {
        // 需要手动赋值一下
        this.data = data
        myStore.bind(this)
        // 多个store需要依次绑定
        tabStore.bind(this)
        myStore.init()
    }
})

目录说明 - pages

存放主包页面

目录说明 - subpkg

子包目录, 存放子包,注意加载时机

目录说明

目录说明 - workers

web-worker 备用

接入组件

Npm 包接入规范

npm 包的大小会合并计算入 主/分包,未避免整体包体积超过 2M,引用的 npm 包不允许引用外部组件,如有特殊需求,请于 BokunLin 联系对齐。 以下规范了包的一些既定规则,建议按照规范开发,避免引起下层系统异常以及联调失败。

接口(interfacePre)

接口名必须以 _alive/mp/ 开头,该接口会通过直播网关转发到对应的下层系统,自定义接口名可以在通过接收参数 interfacePre 来获取;

网关侧接口对齐请联系 JessicaZhou 对齐,会有基本的流量管控,不按规范请求可能引起下层系统承载压力过大产生异常

组件参数

固定事件

open

closed

待支持能力

  • 助教能力