为什么80%的码农都做不了架构师?>>>   

前言

mpvue小程序框架搭建很容易,官网提供vue init mpvue/mpvue-quickstart my-project, 很迅速的创建项目,但是想要结合业务等,还是要废一番功夫,今天来学学wx.request的封装,mpvue的重构,如何搭建好用的mpvue小程序架构吧

创建项目

  1. 由于国内npm镜像慢的原因,考虑先把npm切到淘宝镜像。
npm set registry https://registry.npm.taobao.org/
  1. 全局安装vue-cli
npm install --global vue-cli@2.9
  1. 创建一个基于 mpvue-quickstart 模板的新项目, 一路回车选择默认就可以了
vue init mpvue/mpvue-quickstart mpvue-project
  1. 安装依赖
cd mpvue-project
npm install
npm run dev

到这里,你的项目已经能跑起来了,可以打开小程序调试工具预览效果,但是仅仅是能玩儿而已,下面更精彩。

<!--more-->

全局图片,接口配置

  1. 找到项目(mpvue-project)下方的config->index.js文件,里面有两个对象,builddev,分别对应生产环境和开发环境,意思是你运行npm run dev读的就是dev里面变量,npm run bulid读的就是build的变量 这里我增加了3个变量,后续用到(这里的图片端口就是上图中的port) 接口请求地址(如:baseApi: 'http://www.javanx.cn/rest') 图片访问地址(如:imgPath: 'http://localhost:8070') web-view地址(如:baseUrl: 'http://www.javanx.cn/')

  2. 来到项目(mpvue-project)下方的build->utils.js文件,添加下方代码

var config = require('../config')
const fs = require('fs');var imgUrlPrefix = process.env.NODE_ENV === 'production'? config.build.imgPath: config.dev.imgPath
var cssImgStr = `$imgUrlPrefix = '` + imgUrlPrefix + `';`;fs.writeFileSync(`./src/css/imgUrlPrefix.styl`, cssImgStr);const BASE_API = process.env.NODE_ENV === 'production'? config.build.baseApi: config.dev.baseApi;
const BASE_URL = process.env.NODE_ENV === 'production'? config.build.baseUrl: config.dev.baseUrl;fs.writeFileSync(`./src/commons/baseApi.js`, `module.exports = {IMG_API: '`+imgUrlPrefix+`', BASE_API: '`+BASE_API+`', BASE_URL: '`+BASE_URL+`'}\r\n`);

process.env.NODE_ENV是判断你输入的命令是什么(构建到dev还是生产),然后写入两个文件,一个是styl文件,一个是js文件,分别存放根据环境的全局变量 用到的地方之间引入这两个文件,如:

index.styl中需要用到一个图片

@require  "./imgUrlPrefix.styl"
.icon-more-rightposition absolutedisplay blockwidth px2rpx(44px)height px2rpx(44px)right 0top 50%margin-top px2rpx(-22px)background url($imgUrlPrefix + "/images/right.png") center no-repeatbackground-size 100% 100%

index.js中需要用到BASE_API,如

import {BASE_API} from './baseApi'

图片这样的好处是,图片都不用打包到项目里面了,减少了小程序的体积,本身小程序体积有限。 所以就可以去掉打包static到dist的配置了 来到项目(mpvue-project)下方的build->webpack.base.conf.js文件,去掉下方代码

new CopyWebpackPlugin([{from: path.resolve(__dirname, '../static'),to: path.resolve(__dirname, '../dist/static'),ignore: ['.*']}
])

封装wx.request

取名叫http.js

import Loading from './gloading'
import {BASE_API} from './baseApi'const gloading = new Loading({sync: true
})
function request (options) {return new Promise((resolve, reject) => {// 遮罩,默认不显示菊花if (options.mask) {// 这里写菊花转gloading.start()// delete options.mask;}const headers = (options.header = options.header || {})// 是否要设置tokenif (!options.noToken && options.token !== false) {// headers['x-auth-token'] = 'ad6b5cbd-010e-4dee-aabc-884790d1e288';headers['x-auth-token'] = wx.getStorageSync('x-auth-token')delete options.token}// 对所有request请求中的OBJECT参数对象统一附加时间戳属性options.timestamp = +new Date()let url = options.url// 简化类型设置if (options.json === false) {headers['content-type'] ='application/x-www-form-urlencoded; charset=UTF-8'delete options.json}url = BASE_API + urlwx.request({url: url,data: options.data,header: headers,method: options.method,success: (res) => {if (options.mask) {gloading.stop()}if (res.statusCode === 200) {resolve(res)} else {// 判断错误码// 比如这里1003是用户登录过期,token是否失效switch (res.data.code) {case 1003:console.log('------------token变更,重新授权-----------')var pages = global.getCurrentPages() // 获取加载的页面var currentPage = pages[pages.length - 1] // 获取当前页面的对象var url = currentPage.route // 当前页面url// 调用授权登录接口,获取新的tokenauthorize(() => {// 获取用户信息,验证新tokengetUserInfo((data) => {// 成功代表成功,跳转到之前的页面console.log('------------获取用户信息成功-----------')wx.redirectTo({url: '/' + url + ''})}, (err) => {// 失败跳回登录页面console.log('-----------获取用户信息失败------------')if (url !== 'pages/user/login' && err.data.code === 1003) {wx.showToast({icon: 'none',mask: true,title: res.data.message,duration: 3000})wx.redirectTo({url: '/pages/user/login'})}})})breakdefault:let message = res.data.messagewx.showToast({icon: 'none',mask: true,title: res.data.message,duration: 3000})}reject(res)}},fail: (res) => {reject(res)},complete: (res) => {if (options.mask) {gloading.stop()}}})})
}request.all = (arr) => {return Promise.all(arr.map(n => request(n)))
}
export default request

这里的authorizegetUserInfo方法需要自己去写具体业务,同时上面用到的wx.getStorageSync('x-auth-token')是在authorize方法成功后,返回的token,存在Storage里面了wx.setStorageSync('x-auth-token', res.header['x-auth-token']) 上面用到了一个gloading插件

gloading插件

取名gloading.js

class Loading {constructor (options) {this.queueNum = 0options = this._options = options || {}if (!options.title) {options.title = '请等待...'}}start () {if (this._options.sync) {this.queueNum += 1}this._start()return this}_start () {wx.showLoading({title: this._options.title,mask: true})}stop (force) {if (this._options.sync) {this.queueNum -= 1}if (this.queueNum <= 0 || force) {this.queueNum = 0this._stop()}return this}_stop () {wx.hideLoading()}
}
export default Loading

去掉目录的main.js

mpvue每个页面必须对应一个main.js,导致每个页面都需要建一个目录,目录下方建一个main.js,感觉非常的繁琐 有大神开发了mpvue-entry插件

  1. 安装插件
npm install mpvue-entry
  1. 来到项目(mpvue-project)下方的build->webpack.base.conf.js文件
const MpvueEntry = require('mpvue-entry')module.exports = {entry: MpvueEntry.getEntry('src/pages.js'),...plugins: [new MpvueEntry(),...]
}
  1. src目录下新建pages.js
module.exports = [{path: 'pages/news/list', // 页面路径,同时是 vue 文件相对于 src 的路径,必填config: { // 页面配置,即 page.json 的内容,可选navigationBarTitleText: 'Javan的博客',enablePullDownRefresh: true}
}]

这样就没有建n个目录,n个main.js了

公告

喜欢小编的可以点击关注,也可在下方评论留言,你喜欢什么内容,小编根据大家喜欢的内容尝试更新,更多内容请点击:Javan的博客

转载于:https://my.oschina.net/javanx/blog/1994354

mpvue小程序架构搭建详细介绍相关推荐

  1. 微信小程序 app.json 详细介绍

    微信小程序 app.json 详细介绍 {// 写各个页面的路径 (新增页面或者减少页面都要对其进行修改)"pages": ["pages/index/index&quo ...

  2. 微信小程序制作流程详细介绍

    随着小程序时代的到来,微信小程序的需求量越来越大,无论是在生活上,还是工作上,绝大多数人都使用过微信小程序,小程序的覆盖人群范围还是比较广泛的,所以很多企业都会想着制作一个微信小程序,不仅能实现商业价 ...

  3. 微信小程序html modal,微信小程序 modal组件详细介绍

    modal弹出框常用在提示一些信息比如:退出应用,清楚缓存,修改资料提交时一些提示等等. 常用属性: wxml 弹出modal title="退出应用" hidden=" ...

  4. 预约上门洗衣洗鞋小程序开发搭建的方案介绍

    随着懒人经济的不断崛起,很多服务行业都陆续推出了预约上门服务模式,在一些城市的干洗店洗衣店洗鞋店也开展了预约上门洗衣洗鞋,当然洗护行业预约上门服务的实现是线上线下相结合的结果,需要依托预约上门洗衣洗鞋 ...

  5. 看图猜成语小程序源码+详细搭建教程

    本小程序可开通流量主 ,后台可以自行设置关卡.等级.也可以一键部署, 开通流量主之后实现躺赚,你懂得. 个人号也可以开通,审核一次性必过. 类目选择 教育 小程序源码下载地址:(8条消息) 看图猜成语 ...

  6. (已更新)看图猜成语小程序源码+详细搭建教程

    本小程序后台可以自行设置关卡.等级.也可以一键部署, 个人号也可以开通,审核一次性必过. 类目选择 教育 小程序源码下载地址:(已更新)看图猜成语小程序源码+详细搭建教程-小程序文档类资源-CSDN下 ...

  7. centos ftp服务器搭建_CentOS系统云服务器宝塔面板安装以及微信小程序服务器搭建...

    宝塔面板(官网http://bt.cn)是一款非常优秀的服务器管理工具,无论是系统功能还是用户界面都做的很完善很人性化,是使用Linux服务器的站长不可多得的一款工具,本文以CentOS6.5-64位 ...

  8. 高并发架构系列:Spring Cloud的核心成员、以及架构实现详细介绍

    高并发架构系列:Spring Cloud的核心成员.以及架构实现详细介绍 什么是微服务 微服务的概念源于Martin Fowler所写的一篇文章"Microservices". 微 ...

  9. 服务器一般安装那种centos_CentOS系统云服务器宝塔面板安装以及微信小程序服务器搭建...

    宝塔面板(官网http://bt.cn)是一款非常优秀的服务器管理工具,无论是系统功能还是用户界面都做的很完善很人性化,是使用Linux服务器的站长不可多得的一款工具,本文以CentOS6.5-64位 ...

最新文章

  1. pandas创建内容全是0的dataframe、pandas基于随机整数、随机浮点数创建dataframe(random numbers)
  2. 日本精密减速器,到底牛在哪?
  3. ecshop的商品列表输出中多出一条空记录
  4. Codeforces 610C:Harmony Analysis(构造)
  5. CString类的用法总结
  6. C++中什么时候用new[]申请,可以用delete释放
  7. java与python的区别和作用_python与java用途区别有哪些
  8. Application Performance Management Monitoring | New Relic
  9. java乱码base64,解决 JAVA WebSocket 解析 base64 后中文字符串乱码
  10. iOS 加载本地html文件详细操作
  11. C. Diverse Permutation(Codeforces Round #275(div2)
  12. anacodna/python 安装 tensorflow
  13. 【java】Java中TypeReference用法说明
  14. SuperMap.IS.AjaxScript之常用功能实现研究及使用
  15. OSChina 周五乱弹 —— 你用学习机来搞学习?
  16. 微信公众号开发-取得AccessToken
  17. Cadence Virtuoso 原理图仿真报错问题解决
  18. 什么是SOLID原则(第1部分)
  19. CentOS6云服务器磁盘扩容方案
  20. 货代的主要工作是什么?

热门文章

  1. boost::hana::experimental::print用法的测试程序
  2. boost::geometry::box_view用法的测试程序
  3. boost::gregorian模块实现使用公历精确地推进一个月的测试程序
  4. boost::ignore_unused的用法实例
  5. VTK:Rendering之FlatVersusGouraud
  6. VTK:IO之DumpXMLFile
  7. OpenCV TSP(TravelingSalesman Problem)的实例(附完整代码)
  8. C语言数组中找到第一个重复元素的算法(附完整源码)
  9. OpenGL材质Materials
  10. C++使用kahn实现topological sort拓扑排序算法(附完整源码)