详解微信小程序开发(项目从零开始)


Posted in Javascript onJune 06, 2019

一、序

微信小程序,估计大家都不陌生,现在应用场景特别多。今天就系统的介绍一下小程序开发。注意,这里只从项目代码上做解析,不涉及小程序如何申请、打包、发布的东西。(这些跟着微信官方文档的流程走就好)。好了废话不多说,看目录。

注: 小程序是一套特殊的东西,融合了原生和web端。他是一个不完整的浏览器对象,所以很多DOM 、 BOM 的东西无法使用,但是他又通过微信APP实现了多线程。

二、如何创建小程序

很简单,首先下载微信开发者工具,下载稳定版本的就好。 下载 然后,创建小程序,可以参考下述图片:

详解微信小程序开发(项目从零开始) 

详解微信小程序开发(项目从零开始) 

详解微信小程序开发(项目从零开始)

注意正式的小程序需要审批,拿到正式的APPID,我们测试的或者暂时没有的可点那个测试的appid,小程序模板选择默认就好。按照这样的流程走完,我们就创建完一个小程序了。

三、webstrom支持小程序开发

创建完小程序之后,我们先不着急开发。工欲善其事必先利其器,微信开发者工具有点卡,而且功能少,开发效率很低。所以我们还是改造自己的编译器,这里只介绍2种方法。一是 hbuilderX,他有支持小程序的模块,很小巧的一款编译器; 二是 webstorm,我用的他,在这介绍一下配置的方法,其他的大家自行google吧。

1、支持wxml和wxss的文件类型,有语法高亮。 打开webstorm编译器,依次点击 文件 -- 设置 -- 编辑器 -- 文件类型 , 找到 html文件,添加 *.wxml; 找到Cascading style Sheet ,添加 *.wxss。就OK了

2、支持小程序代码提醒。 下载 这个文件,然后,把他放到一个显眼的地方; 然后, webstorm 点击 文件 -- 导入设置 ,找到这个下载的文件,点击确定即可。

以上就是webstorm支持小程序语法的操作。

四、基础文件目录详解

详解微信小程序开发(项目从零开始)

然后解释一下小程序的目录结构。

project.config.json: 小程序的配置文件,包含项目打包配置、上传代码自动压缩等等,是一些开发、打包之类的配置。

app.json: 当前项目的配置文件。包括项目的页面引入、导航条颜色、导航条标题 等等,是项目具体到代码开发上的配置。介绍几个配置:

pages: 包含的页面。每次新增页面都得在这里引入,否则新页面的json配置等无法生效。 注意pages中页面先写的先渲染,所以数组第一条也就是我们的首页。

window: 配置所有页面导航条字体、颜色、背景色等

app.js: 小程序入口文件。生成小程序实例,App({}), 通常在这获取用户信息、授权信息、定义全局变量等。

app.wxss: 小程序全局 style 文件。对整个项目页面生效。通常规定项目的 字体、基础颜色,定义一些公共样式。

utils: 工具函数目录。通常用来放一些公共的js方法。比如封装的request请求,一些别的处理数据什么的方法。

pages: 小程序的页面目录。所有的小程序页面,都写在这里面。

五、完善项目目录

上边大致解释了一下小程序的基础文件,现在按照常见的规范完善一下项目目录,这里面包含一些个人见解,有需要的参考即可。先看一下结果:

详解微信小程序开发(项目从零开始)

现在解释一下这些目录:

components: 我们封装的小程序可复用组件。

constants: 一些项目中的常亮。

image: 用到的图片。

services: 用到的所有接口目录

大致就新建了这几个,如果有别的需求,根据自己的情况增加。

六、基础语法详解

现在大致解释一下小程序的语法。首先, 创建新页面,默认都创建 *.wxml *.wxss *.js *.json 和我们平时写的代码差不多,都是html js css,多了个json配置文件

*.json:常用的属性有2大块,navigationBarTitleText 相关的设置顶部标题的,usingComponents 引用的组件

*.js:getApp() 获取小程序实例,拿全局变量等; Page({}) 创建页面; data 当前页面的变量;onLoad 生命周期,页面加载完毕。

*.wxml:注意,小程序支持的标签很少,像 span 是支持的,div不支持,一般用view代替块级,span、text 代替行级。

*.wxss:大部分css选择器不支持,支持的好像才5个,想支持less等得自己配置

 

// json文件
{
 "navigationBarBackgroundColor": "#fff",
 "navigationBarTextStyle": "black",
 "navigationBarTitleText":"我的",
 "usingComponents": {
 "menu": "/components/menu/index"
 }
}

// js文件
const app = getApp()
Page({
 data: {},
 
 onLoad: function () {},

})

七、实现页面跳转

和通常的web开发一样,小程序页面跳转页分2中,wxml中的vavigator标签,以及js的navigator相关的api。路由跳转的方法有好几个,这里不一一赘述了,常用的直接跳转

wx.navigateTo,重定向 wx.redirectTo等等,具体的请看官方文档。这里强调一下路由传参,很简单:
1、少量数据。直接问号传参。然后在目标页面的onLoad方法中通过options参数接收。
2、大量数据。直接塞到全局变量里面。

// wxml跳转页面
<navigator url="/pages/my{{item.path}}" class="navigator">
  <image class="imgIcon" src="{{item.icon}}"></image>
  <view class="navigator-text" data-id="{{item.key}}" bindtap="handleMenuTap">{{item.name}}</view>
 </navigator>

//js跳转页面
wx.navigateTo({
  url: `/pages/my/appointDetail/index?_id=${this.data.marker.id}`
 })

//路由传参如何接收


 onLoad: function (options) {
 console.log(options)
 },

八、wx.request 的封装

在utils中新建request.js,简单封装了一下,一些数据要全局配置的都引进来,然后做了些错误的统一处理,没什么难度,不过要特别注意一下cookie的携带。具体代码如下:

const app = getApp()
export default function request(url, options = {}) {
 return new Promise(function (resolve, reject) {
 wx.request({
  url: `${app.origin}${url}`,
  method: 'GET',
  ...options,
  data: options.data,
  header: {
  'content-type': 'application/json',
  'cookie': wx.getStorageSync("cookie")
  },
  success: function (res) {
  //重新授权登录
  if (res.statusCode === 401){
   wx.redirectTo({url: '/pages/login/index'})
   return
  }else if (res.statusCode !== 200) {
   reject({ error: '服务器忙,请稍后重试', code: 500 });
   return
  } else {
   if (url === '/api/cdz/user/weixin/login') {
   const cookie = res.header["set-cookie"] || res.header["Set-Cookie"];




   if (cookie) wx.setStorageSync("cookie", cookie);
   }
   resolve(res.data);
  }
  },
  fail: function (res) {
  // fail调用接口失败
  if (url === '/api/cdz/user/weixin/login') {
   const cookie = res.header["set-cookie"] || res.header["Set-Cookie"];
   if (cookie) wx.setStorageSync("cookie", cookie);
  }
  reject({ error: '网络错误', code: 0 });
  }
 })
 })
}

然后我们使用的时候直接使用封装好的request方法,这样所有的api就封装成一个个函数。我们在页面中直接import引入调用即可。

import request from "../utils/request";
import { stringify } from "../utils/util"

export function testPost(data) {
 return request(`/api/test/post`, {
 method: 'PUT',
 data,
 })
}

export function testGet(data) {
 return request(`/api/test/get`)
}

九、使用 npm (引入 weui、moment等插件)

因为小程序使用的是不完整的浏览器对象,所以很多js包都是不好使的,比如jquery之类的。所以npm基本是废了,能用的依赖包很少,具体哪些能用得自己发掘了。这里还是要介绍一下小程序如何使用npm,毕竟有些包还是要用的。

1、打开 微信开发者工具 -- 点击 详情 -- 勾选 使用npm模块

2、打开命令行,进入项目的根目录下, npm init 初始化npm

3、npm i 。。。安装你需要的依赖

4、打开 微信开发者工具 -- 点击 工具 -- 点击 构建npm。 此时小程序会将 node_modules 文件编译打包,生成新目录 miniprogram_npm ,

5、在需要用到的页面的js文件中,const moment= require('moment') 引入,直接使用即可

6、最后记得忽略文件。新建 .gitignore 文件,node_modules 、 package_lock.json 等文件不需要上传,最好只保留小程序的npm构建包,用什么依赖也是的那个下载。这个到不是必须的

ps: 特殊注意一下weui的引入,这个ui库是纯css的,没有js文件,所以他没法用npm引入,而是直接下载文件,我直接丢到根目录下,然后在 app.wxss 文件的开头引入

@import 'weui.wxss';,这样使用的

十、封装微信小程序可复用组件

现在篇幅有点太长了,这个另写一篇,有需要的可以去看。

十一、总结

以上就是我开发小程序的一些经验和总结,希望能帮到你。另外,整套程序的骨架(业务代码删掉了)我会上传到github,下载 有需要的可以去下载,记得点个赞,哈哈。

最后,我会另写一篇博客,写一下 如何封装小程序 组件,并附上 我开发小程序遇到的坑,以及对应的解决方法。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JQuery 返回布尔值Is()条件判断方法代码
May 14 Javascript
JavaSript中变量的作用域闭包的深入理解
May 12 Javascript
jQuery实现表单提交时判断的方法
Dec 13 Javascript
自定义jQuery插件方式实现强制对象重绘的方法
Mar 23 Javascript
jquery实现定时自动轮播特效
Dec 10 Javascript
js实现的页面加载完毕之前loading提示效果完整示例【附demo源码下载】
Aug 02 Javascript
通过jquery实现页面的动画效果(实例代码)
Sep 18 Javascript
AngularJS框架中的双向数据绑定机制详解【减少需要重复的开发代码量】
Jan 19 Javascript
JavaScript仿微信打飞机游戏
Jul 05 Javascript
JavaScript实现AOP详解(面向切面编程,装饰者模式)
Dec 19 Javascript
JS实现前端页面的搜索功能
Jun 12 Javascript
微信js-sdk 录音功能的示例代码
Nov 01 Javascript
vue如何自动化打包测试环境和正式环境的dist/test文件
Jun 06 #Javascript
jQuery+ajax实现批量删除功能完整示例
Jun 06 #jQuery
JS根据json数组多个字段排序及json数组常用操作
Jun 06 #Javascript
了解在JavaScript中将值转换为字符串的5种方法
Jun 06 #Javascript
Vue项目总结之webpack常规打包优化方案
Jun 06 #Javascript
vue-cli脚手架打包静态资源请求出错的原因与解决
Jun 06 #Javascript
详解vue-cli@2.x项目迁移日志
Jun 06 #Javascript
You might like
同时提取多条新闻中的文本一例
2006/10/09 PHP
将数组写入txt文件 var_export
2009/04/21 PHP
php将mysql数据库整库导出生成sql文件的具体实现
2014/01/08 PHP
一个PHP的ZIP压缩类分享
2014/05/04 PHP
php限制ip地址范围的方法
2015/03/31 PHP
PHP使用flock实现文件加锁的方法
2015/07/01 PHP
PHP实现查询手机归属地的方法详解
2017/04/28 PHP
JS JavaScript获取Url参数,src属性参数
2021/03/09 Javascript
javascript 解析后的xml对象的读取方法细解
2009/07/25 Javascript
js自定义事件及事件交互原理概述(二)
2013/02/01 Javascript
在jQuery中 关于json空对象筛选替换
2013/04/15 Javascript
js获取触发事件元素在整个网页中的绝对坐标(示例代码)
2013/12/13 Javascript
js 限制input只能输入数字、字母和汉字等等
2013/12/18 Javascript
js实现带有介绍的Select列表菜单实例
2015/08/18 Javascript
基于JavaScript实现仿京东图片轮播效果
2015/11/06 Javascript
简单的JS时钟实例讲解
2016/01/13 Javascript
简单掌握JavaScript中const声明常量与变量的用法
2016/05/21 Javascript
JavaScript 点击触发复制功能实例详解
2018/11/02 Javascript
vue实现用户长时间不操作自动退出登录功能的实现代码
2020/07/23 Javascript
微信小程序实现上传照片代码实例解析
2020/08/04 Javascript
[40:05]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第一局
2016/02/25 DOTA
Python自定义scrapy中间模块避免重复采集的方法
2015/04/07 Python
Python迭代和迭代器详解
2016/11/10 Python
用python处理图片实现图像中的像素访问
2018/05/04 Python
Python应用库大全总结
2018/05/30 Python
Python SQLAlchemy入门教程(基本用法)
2019/11/11 Python
python元组的概念知识点
2019/11/19 Python
JupyterNotebook 输出窗口的显示效果调整方法
2020/04/13 Python
美国杂志订阅折扣与优惠网站:Magazines.com
2016/08/31 全球购物
德国最新街头服饰网上商店:BODYCHECK
2019/09/15 全球购物
热能动力工程毕业生自荐信
2013/11/07 职场文书
各营销点岗位职责范本
2014/03/05 职场文书
设计师求职信模板
2014/05/06 职场文书
教师敬业奉献模范事迹材料
2014/05/18 职场文书
超市督导岗位职责
2015/04/10 职场文书
MySQL创建索引需要了解的
2021/04/08 MySQL