Giter Site home page Giter Site logo

megalo's Introduction

Megalo

Megalo 是基于 Vue([email protected]) 的小程序开发框架,让开发者可以用 Vue 的开发方式开发小程序应用。Megalo 是为了跨 H5 和小程序两端的应用提供一个高效的解决方案,只需要少量改动即可完成 H5 和小程序之间的代码迁移。

Megalo 目前支持微信小程序支付宝小程序百度智能小程序字节跳动小程序

配套设施

支持

  • megalo 经公司内部大项目验证,可在你的公司或个人项目中使用
  • 如果你觉得还不错,请点下「star」以表支持
  • 任何技术问题均可在交流群内讨论

Join the chat at dingtalk Join the chat at wechat

灵感来源

名字来源于动画 Megalo Box。项目启发自 mpvue

megalo's People

Contributors

blake-newman avatar chrisvfritz avatar clarkdo avatar defcc avatar dsonet avatar elcarim5efil avatar fnlctrl avatar gebilaoxiong avatar hanks10100 avatar hcysunyang avatar herringtondarkholme avatar imyzf avatar javoski avatar jinjiang avatar jkzing avatar justineo avatar kaelwd avatar kazupon avatar kingwl avatar ktsn avatar mingmingwon avatar nickmessing avatar phanan avatar posva avatar s-you avatar sodatea avatar vue-bot avatar yyx990803 avatar znck avatar zwwill avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

megalo's Issues

[BUG] v-if 和 slot,scoped-slot 一起使用时,fallback slot 不生效

code:

测试用例

export default {
      data: {
        ok: false
      },
      template: `
        <test>
          <template v-if="ok" slot-scope="foo">
            <p>{{ foo.text }}</p>
          </template>
        </test>
      `,
      components: {
        test: {
          data () {
            return { msg: 'hello' }
          },
          template: `
            <div>
              <slot :text="msg">
                <span>{{ msg }} fallback</span>
              </slot>
            </div>
          `
        }
      }
}

现象:

test 组件内部的 fallback slot 不生效。

新建项目,报Module not found: Error: Can't resolve 'octoParse'

仅新建项目,运行npm run dev:wechat

就会有

ERROR in ./node_modules/@megalo/vhtml-plugin/index.js
Module not found: Error: Can't resolve 'octoParse' in '/home/lujian/wechatproj/genchain.wechat.todo/node_modules/@megalo/vhtml-plugin'
@ ./node_modules/@megalo/vhtml-plugin/index.js 3:16-36
@ ./src/app.js

错误提示。

百度小程序在编译时报错

image

-百度小程序编译后报错,应该时async/await的问题,但是我已经引入run-time支持。微信、支付宝平台下无报错。

  • 版本信息如下
    "@megalo/target": "^0.3.0",
    "@megalo/template-compiler": "^0.2.2",
    "megalo": "^0.4.0",

Mpvue 迁移指北

获取小程序相关数据

this.$root.$mp.query; 改成 this.$mp.options; 写法

Typescript工程 入口需要增加下面配置

import { Component } from 'vue-property-decorator';

declare module "megalo/types/vue" {
    interface Vue {
        $mp: any
    }
}

//
Component.registerHooks([
    'onShow',
    'onHide',
    'onShareAppMessage',
    'onReachBottom',
    'onPullDownRefresh'
])

复杂模块可以拆得细一点了

v-if 不能解析条件

问题描述:

  • 多次使用 v-if 时,只有第一次能够正常解析,第二次开始无论条件是否为 true 时,都默认为 false.

软件版本:

{
    "megalo": "^0.3.0",
    "@megalo/target": "^0.2.2",
    "@megalo/template-compiler": "^0.3.0"    
}

问题复现代码:

<template>
  <div>
     // 第一次正常显示
    <div v-if="test1"> {{ test1 }} </div>

    // 第二次开始不能正常显示
    <div v-if="test2 !== ''"> {{ test2 }} </div>
    <div v-else-if="test2 !== ''"> {{ test2 }} </div>
    <div v-else-if="true"> {{ test2 }} </div>
    <div v-else>没有正确显示</div> 
  </div>
</template>

<script>
  export default {
    mpType: 'page',
    data (){
      return {
        test1: '第一次会显示',
        test2: '第二次开始不显示'
      }
    }
  }
</script>

支付宝小程序内的 web-view 属性无法动态更新

原生支付宝小程序在使用 web-view 组件时,src 属性只能在,页面初次渲染完成前进行更新。即必须在 onReady 触发以前。

<web-view src="{{url}}" onMessage="onmessage"></web-view>
Page({
  data: {
    url: 'xxx' // 有效
  },
  onLoad() {
    this.setData({ url: 'aaa' }) // 有效
  },
  onReady() {
    this.setData({ url: 'bbb' }) // 无效
  }
})

目前,megalo 的 $mount 的触发时机是在 onReady 触发时,此时才会首次将 vnode 上的数据同步到小程序视图层,使得 web-viewsrc 无法修改。

  1. 支付宝小程序 wev-view 属性后期是否有可能支持动态绑定(微信小程序是 ok 的,如果官方支持 megalo 就不修改了)
  2. 将数据更新的时机提前到 onLoad 阶段。本身不需要操作 DOM 节点,只是同步数据,所以实现上将 $mount 提前到 onLoad 阶段执行是没什么问题的,但这样的修改会改变生命周期钩子的顺序(onLoad -> created -> mounted -> onReady)。有待验证其影响。

[email protected] 遍历组件,组件里的点击事件失效

代码复现

/megalo-demo/src/packageA/pages/a/components/ComA.vue

<template>
  <div @tap="handleTap">点击我{{ index }}</div>
</template>

<script>
export default {
  props: {
    index: Number
  },
  methods: {
    handleTap() {
      console.log("点击了:", this.index);
    }
  }
};
</script>

<style>
</style>

/megalo-demo/src/packageA/pages/a/index.vue

<template>
  <div class="app">
    <div>v-for 组件,组件里的点击事件失效</div>
    <com-a v-for="n in 9" :key="n" :index="n"/>
    <div v-for="n in 9" :key="n" @tap="handleTap(n)">点击我---{{ n }}</div>
  </div>
</template>

<script>
import ComA from "./components/ComA";
export default {
  components: {
    ComA
  },
  methods: {
    handleTap(i) {
      console.log('点击了---' + i)
    }
  }
};
</script>

<style lang="less" scoped>
</style>

问题现象

组件ComA里的点击事件失效了

版本

操作系统

  • mac 10.14.1

首页执行了详情页的代码,导致没有 $mp

进入小程序的时候 首页没去点击去详情页, 反而执行了 详情页的代码,

执行顺序为: app.vue created ==> detail.vue created ==> index.vue created

首页的created反而更晚执行

image

dataset 自动转换 camelCase

百度小程序

<button :data-index="index">

更新是更新路径是 $root.0.h['data-index'],会有问题。需要转换成 dataIndex

代码组织与可读性问题

提个小建议,感觉源码阅读起来还是很吃力的,大部分都是 Vue 的源码,不知道 megalo 的代码具体分布在哪里, 开源的目的应该就是要让大家发现问题找到问题, 这样好像不太好提 pr😂

建议 | 给出相应的开发工具【项目设置】标准

如图,这里的配置是否有一个标准,如果我开启或关闭某些设置,是否对项目的运行会造成影响?

301542768690_ pic_hd

例如:我的项目中使用了 vant-weapp 的组件,需要开启 es6 转 es5 才能正常使用 vant-weapp 。

建议与疑问

建议

修改.github目录下的 issue 模版等,现在还是 vue 的。

疑问

请问除了支持支付宝小程序外与 mpvue 有什么明显却别/设计思路差异吗?

v-for嵌套报错

<div class="cell-group"
     v-for="(cellGroup,index) in cells"
     :style="{marginBottom:groupGap+'rpx'}">
  <div v-for="(cell,cellIndex) in cellGroup">>
    <text>test</text>
  </div>
</div>

百度小程序报错
21

建议新增对async/await的支持

为避免过多的回调地狱,建议新增对async/await语法的支持,我的做法如下:

  1. 引入transform-runtime
npm i babel-plugin-transform-runtime 
  1. 修改babel配置文件
{
  "plugins": ["transform-runtime"],
  "presets": [ "env", "stage-0" ]
}
  1. 修改webpack配置文件(createBaseConfig.js)
     {
          test: /\.js$/,
          exclude: /(node_modules|bower_components)/,
          use: [
            {
              loader: 'babel-loader',
              options: {
                babelrc: true
              }
            }
          ]
    },

不知官方后期是否考虑列为新特性?

[BUG] v-if 嵌套时执行逻辑错误

代码:

<template>
  <div>
    <div v-if="obj">
      <div v-if="obj.a"></div>
    </div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      obj: null
    }
  }
}
</script>

现象:

报错 Cannot read property 'a' of undefined;

原因:

第一个调整判断为 false 时,后面的条件判断不应该执行,但是在 render 方法里没有对 v-if 嵌套关系进行判断。

components不支持短横线

在components中用驼峰模式声明组件

    components: {
      mediaHead
    },

在template中用短横线方式使用

       <media-head
                :data="categoryData"
                v-model="curCategoryIndex"
                :searchText="searchText"
        >
        </media-head>

在编辑器中无法被解释出来
image
只有驼峰模式使用才能被解释

        <mediaHead
                :data="categoryData"
                v-model="curCategoryIndex"
                :searchText="searchText"
        >
        </mediaHead>

有解决mpvue页面数据源的问题吗?

如题!mpvue使用开始会先初始化所有页面实例,与小程序的page绑定在一起,但开发中会出现一个问题,就是我一个页面,比如商品详情,打开了一个A商品的详情,然后我要再打开一个B商品的详情,因为他们是同一个page,所以在mpvue中会出现我打开的第二个B商品的详情会将vue实例上的data改掉,这样我再回到A商品的详情时数据其实已经被改掉了。
描述可能有点复杂,主要问题就是我一个页面打开两个的时候,想做到他们有独立的id,相互间数据不干扰!
大神们这次有处理这个问题吗?万分感谢

微信小程序Picker组件range参数无法响应其绑定对象的变化

微信小程序 Picker组件,动态绑定的range对象无法响应对象的变化 ,点击addcity按钮,picker里的选项没有增加。

测试组件代码

<template>
  <div>
    <picker
      class="_picker"
      mode="multiSelector"
      range-key="name"
      :value="mindex"
      :range="range"
    >testing</picker>

    <div @click="addCity">add City</div>
  </div>
</template>

<style>
._picker {
  padding: 13px;
  background-color: #ffffff;

  height: 100rpx;
  width: 200rpx;
  border: 1rpx solid red;
}
</style>

<script>
export default {
  methods: {
    addCity() {
      this.range[0].push({ id: 9, name: "云南" });
    }
  },
  data() {
    return {
      range: [
        [{ id: 0, name: "北京" }, { id: 1, name: "上海" }],
        [{ id: 2, name: "海淀区" }, { id: 3, name: "玄武区" }]
      ],
      mindex: [0, 0]
    };
  }
};
</script>

从mpvue 迁移的项目时遇到的主要问题

迁移后的主要问题

  1. px 无法自动转为rpx 需要手动替换
  2. 在mpvue 中布局好的样式,迁移后大部分出现异常,布局错乱
    3.页面部分插值没有渲染

优点:
解决了mpvue 共用同一个page导致的问题,和数据diff 问题

建议增加 ‘端能力 API’ 的自动处理

3端小程序各自有各自的 Api 写法,如拍照、扫描二维码等等,建议提供统一处理方式
否则 均需要 手动 判断 platform,会形成大量无用代码且繁琐。

可参考 Taro 的处理方式
https://nervjs.github.io/taro/docs/native-api.html

其中路由跳转部分 我已经单独 抽出了一个插件,megalo-router-patch,mpvue 也有类似插件,便于迁移 ,希望可以 加入到 本项目的 readme 或 demo 中。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.