mpvue-native:小程序原生和mpvue代码共存

问题描述

mpvue和wepy等框架是在小程序出来一段时间之后才开始有的,所以会出现的问题有:需要兼容已有的老项目,有些场景对小程序的兼容要求特别高的时候需要用原生的方式开发

解决思路

  1. mpvue的入口文件导入旧版路由配置文件

  2. 公共样式 字体图标迁移 app.wxss -> app.vue中less(mpvue的公共样式)

  3. 旧项目导入 旧项目(native)拷贝到dist打包的根目录

这个要注意的就是拷贝的旧项目不能覆盖mpvue打包文件,只要避免文件夹名字冲突即可

mpvue-native使用

yarn dev xiejun // 本地启动
yarn build xiejun // 打包

开发者工具指向目录

/dist/xiejun

github地址: https://github.com/xiejun-net/mpvue-native

mpvue-native目录结构

|----build
|----config
|----dist 打包后项目目录
|----<projetc1>
|----<projetc2>
|----src 源码
|----assets 通用资源目录
|----components 组件
|----pages 公共页面页面
|----utils 常用库
|----<project> 对应单个项目的文件
|----home mpvue页面
|----assets
|----App.vue
|----main.js
|----native 原生目录
|----test 小程序原生页面
|---web.js
|---web.wxml
|---web.wxss
|---web.json
|----app.json 路径、分包
|----App.vue
|----main.js mpvue项目入口文件
|----static 静态文件
|----package.json

拷贝旧项目到根目录下

 new CopyWebpackPlugin([
{
from: path.resolve(__dirname, `../src/${config.projectName}/native`),
to: "",
ignore: [".*"]
}
]),

入口及页面

const appEntry = { app: resolve(`./src/${config.projectName}/main.js`) } // 各个项目入口文件
const pagesEntry = getEntry(resolve('./src'), 'pages/**/main.js') // 各个项目的公共页面
const projectEntry = getEntry(resolve('./src'), `${config.projectName}/**/main.js`) // 某个项目的mpvue页面
const entry = Object.assign({}, appEntry, pagesEntry, projectEntry)

多项目共用页面

参考web中一个项目可以有多个spa,我们也可以一个项目里包含多个小程序,多个小程序之间可以共用组件和公用页面,在某些场景下可以节省很多开发时间和维护时间。

打包的时候根据项目入口打包 yarn dev <project>

分包

旧项目作为主包

其他根据文件夹 pages xiejun 分包作为两个包加载

具体根据实际情况来分

// app.json文件配置 pages 为主包
"pages": [
"test/web"
],
"subPackages": [
{
"root": "pages",
"pages": [
"about/main"
]
},
{
"root": "xiejun",
"pages": [
"home/main"
]
}
],

其他有关小程序开发坑和技巧

字体图标的使用

网页我们直接引用css就好//at.alicdn.com/t/font_263892_1oe6c1cnjiofxbt9.css

小程序只需要新建一个css文件把在线的css代码拷贝过来放置全局即可

关于小程序和mpvue生命周期

点此查看mpvue的生命周期

从官方文档上生命周期的图示上可以看到created是在onLaunch之前,也就是说每个页面的created 出发时机都是整个应用开启的时机,所以一般页面里面都是用mouted 来请求数据的。

如何判断小程序当前环境

问题描述

发布小程序的时候经常担心配置错误的服务器环境

而小程序官方没有提供任何关于判断小程序是体验版还是开发版本的api

解决方案

熟悉小程序开发的不难发现小程序https请求的时候的referer是有规律的:https://servicewechat.com/${appId}/${env}/page-frame.html

即链接中包含了当前小程序的appId

  • 开发工具中 appId紧接着的dev是 devtools

  • 设备上 开发或者体验版 appId紧接着的env是 0

  • 设备上 正式发布版本 appId紧接着的env是数字 如: 20 发现是小程序的发布版本次数,20代表发布了20次

由此我们可以通过env 这个参数来判断当前是什么环境,

前端是无法获取到referer的,所以需要后端提供一个接口,返回得到referer

代码

// https://servicewechat.com/${appId}/${env}/page-frame.html
// 默认是正式环境,微信官方并没有说referer规则一定如此,保险起见 try catch
async getEnv() {
try {
let referer = await userService.getReferer() // 接口获取referer
let flag = referer.match(/wx2312312312\/(\S*)\/page-frame/)[1]
if (flag === 'devtools') { // 开发工具
// setHostDev()
} else if (parseInt(flag) > 0) { // 正式版本
// setHostPro()
} else { // 开发版本和体验版本
// setHostTest()
}
} catch (e) {
console.log(e)
}
}

Promise

官方文档上说Promise 都支持

实际测试发现其实在ios8上是有问题的

所以request.js

import Es6Promise from 'es6-promise'
Es6Promise.polyfill()

wx.navigateto返回层级问题

官方文档是说目前可以返回10层

实际情况是在某些机型上只能返回5层 和原来一样

所以最好使用wx.navigateto跳转不超过5层

压缩兼容问题

在微信开发者工具上传代码的时候

务必把项目ES6转ES5否则会出现兼问题

个人公众号:程序员很忙(xiejun_asp)

小程序开发总结一:mpvue框架及与小程序原生的混搭开发的更多相关文章

  1. 记一次用mpvue框架搭建的小程序

    介绍 mpvue (github 地址请参见)是一个使用 Vue.js 开发小程序的前端框架.框架基于 Vue.js 核心,mpvue 修改了Vue.js 的 runtime 和 compiler 实 ...

  2. 使用 SailingEase WinForm 框架构建复合式应用程序(插件式应用程序)

    对于一些较小的项目,具备一定经验的开发人员应该能够设计和构建出便于进行维护和扩展的应用程序.但是,随着功能模块数量(以及开发维护这些部件的人员)的不断增加,对项目实施控制的难度开始呈指数级增长. Sa ...

  3. Android &Swift iOS开发:语言与框架对比

    转载自:http://www.infoq.com/cn/articles/from-android-to-swift-ios?utm_campaign=rightbar_v2&utm_sour ...

  4. 使用Vue开发微信小程序:mpvue框架

    使用Vue开发微信小程序:mpvue框架:https://www.jianshu.com/p/8f779950bfd9

  5. mpvue框架的小程序和H5同时开发

    demo链接1.样式统一为了达到共用一套样式,采用px2rem-loader和px2rpx-loader进行代码的打包,细节如下: 由于UI设计图是在蓝湖上标注,宽度750,选择像素 PX 样式中直接 ...

  6. 快速上手小程序的mpvue框架

    一.什么是mpvue框架? mpvue 是一个使用 Vue.js 开发小程序的前端框架.框架基于 Vue.js 核心(所以建议熟练掌握vue再使用mpvue框架,否则还是建议去使用原生框架去写小程序) ...

  7. 小程序使用mpvue框架无缝接入Vant Weapp组件库

    有美团开源出的mpvue以其vue的语法和良好的开发效率再搭配上用户体验良好的UI组件无疑是定制化微信小程序的开发方式,然而由于mpvue是对微信原生开发的再次封装,这也为我们引入UI组件添加了不少麻 ...

  8. Taro框架下qq小程序开发体验

    qq小程序发布了,作为第一批体验者 .还是发现了和微信小程序很多不同的地方. 最新的小程序我这里都是用Taro开发的,体验较为不错.数据管理用的是redux.JS用的ES6加async等. 微信小程序 ...

  9. 搭建Spring开发环境并编写第一个Spring小程序

    搭建Spring开发环境并编写第一个Spring小程序 2015-05-27      0个评论    来源:茕夜   收藏    我要投稿 一.前面,我写了一篇Spring框架的基础知识文章,里面没 ...

随机推荐

  1. 使用cmstp绕过应用程序白名单

    默认情况下,AppLocker允许在文件夹中执行二进制文件,这是可以绕过它的主要原因.已经发现,这样的二进制文件可以很容易地用于绕过AppLocker和UAC.与Microsoft相关的二进制文件之一 ...

  2. LINUX内核分析第七周——可执行程序的装载

    一.得到一个可执行程序 1. 预处理.编译.链接 gcc hello.c -o hello.exe gcc编译源代码生成最终可执行的二进制程序,GCC后台隐含执行了四个阶段步骤. 预处理 => ...

  3. Android Studio aidl文件路径自定义问题

    1.aidl旧文件夹中添加的内容无法编译 sourceSets中主要是把把src/main/aidl文件也作为java.srcDirs, resources.srcDirs,这样当编译程序时,AIDL ...

  4. Hbase(七)hbase高级编程

    一.Hbase结合mapreduce 为什么需要用 mapreduce 去访问 hbase 的数据?     ——加快分析速度和扩展分析能力     Mapreduce 访问 hbase 数据作分析一 ...

  5. python对MySQL的CRUD

    我是闲的没事干,2014过的太浮夸了,博客也没写几篇,哎~~~ 用这篇来记录即将逝去的2014 python对各种数据库的各种操作满大街都是,不过,我还是喜欢我这种风格的,涉及到其它操作,不过重点还是 ...

  6. 【Asp.net入门06】第一个ASP.NET 应用程序-案例说明

    创建简单的应用程序 本章的剩余部分将探讨一些用于创建简单的数据输入应用程序的基本ASP.NET功能.在这一节中,我们将加快进度——目标是演示ASP.NET的用法,因此将略过有关后台运行机制的详细说明. ...

  7. 在阿里云上无法使用mailx发送邮件的解决办法,验证可用。

    由于阿里云已将25端口封了(改用465端口),所以在ECS上往外发邮件时要作相应的配置才行. 使用的是163的企业邮箱,笔记简洁可用. 在阿里云的“安全组”开放645端口通行. 1.安装相应软件包: ...

  8. Docker 基础知识

    Docker Docker 是什么 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是 ...

  9. 二维数组和指针(C语言)

    二维数组和指针 二维数组和指针1.二维数组和数组元素的地址若有以下定义:int *p, a[3][4]; 1)二维数组a由若干个一维数组组成在C语言中定义的二维数组实际上是一个一维数组,这个一维数组的 ...

  10. vue-router 实践

    1. vue-router2学习实践笔记 2. router.push() 3. 使用vue-router跳转页面