微信小程序原生开发学习概述_微信原生小程序开发
微信小程序开发全面学习指南
一、微信小程序开发概述
1.1 什么是微信小程序
微信小程序是一种不需要下载安装即可使用的应用,它实现了应用\"触手可及\"的梦想,用户扫一扫或搜一下即可打开应用。小程序具有以下特点:
- 无需安装:不占用手机存储空间,即用即走
- 开发成本低:基于Web技术栈,学习曲线平缓
- 跨平台:一次开发,可在iOS和Android平台运行
- 微信生态整合:可方便调用微信支付、分享、定位等原生能力
1.2 小程序与APP、H5的区别
1.3 小程序适用场景
小程序特别适合以下场景:
- 工具类应用:计算器、天气预报、翻译等轻量工具
- 电商平台:快速搭建商品展示和购买流程
- 内容展示:新闻、博客、教育内容展示
- O2O服务:餐饮、酒店、票务等线上线下结合服务
- 企业内部应用:CRM、OA等企业内部工具
二、开发环境搭建
2.1 注册开发者账号
- 访问微信公众平台
- 点击\"立即注册\",选择\"小程序\"
- 填写邮箱、密码等信息完成注册
- 登录后补充小程序基本信息,包括名称、图标、简介等
2.2 下载开发工具
微信官方提供了专门的开发工具:
- 前往开发者工具下载页面
- 根据操作系统选择对应版本(Windows/Mac)
- 安装完成后打开工具,使用微信扫码登录
2.3 创建第一个小程序项目
- 打开开发者工具,点击\"新建项目\"
- 填写项目信息:
- 项目名称:MyFirstMiniProgram
- 目录:选择本地存储路径
- AppID:可使用测试号或已注册的正式ID
- 模板:选择\"普通快速启动模板\"
- 点击确定,工具会自动生成基础项目结构
2.4 开发工具界面介绍
微信开发者工具主要包含以下区域:
- 编辑器区域:代码编写和文件管理
- 模拟器:实时预览小程序效果
- 调试器:包含Console、Sources、Network等调试面板
- 工具栏:编译、预览、上传等操作按钮
- 详情面板:项目配置和基本信息
三、小程序项目结构解析
3.1 目录结构详解
一个标准的小程序项目包含以下目录和文件:
├── pages/ # 页面目录│ ├── index/ # 首页│ │ ├── index.js # 页面逻辑│ │ ├── index.json # 页面配置│ │ ├── index.wxml # 页面结构│ │ └── index.wxss # 页面样式│ └── logs/ # 日志页│ ├── logs.js│ ├── logs.json│ ├── logs.wxml│ └── logs.wxss├── utils/ # 工具类文件│ └── util.js # 工具函数├── app.js # 小程序逻辑├── app.json # 全局配置├── app.wxss # 全局样式└── project.config.json # 项目配置文件
3.2 核心配置文件
app.json 全局配置
{ \"pages\": [ \"pages/index/index\", \"pages/logs/logs\" ], \"window\": { \"navigationBarTitleText\": \"Demo\", \"navigationBarBackgroundColor\": \"#ffffff\", \"backgroundColor\": \"#eeeeee\", \"enablePullDownRefresh\": true }, \"tabBar\": { \"list\": [{ \"pagePath\": \"pages/index/index\", \"text\": \"首页\" }, { \"pagePath\": \"pages/logs/logs\", \"text\": \"日志\" }] }, \"networkTimeout\": { \"request\": 10000, \"connectSocket\": 10000 }, \"debug\": true}
page.json 页面配置
{ \"navigationBarTitleText\": \"我的页面\", \"usingComponents\": { \"my-component\": \"/components/my-component\" }}
3.3 WXML模板语法
WXML(WeiXin Markup Language)是小程序框架设计的一套标签语言,用于构建页面结构。
数据绑定
<view>{{message}}</view><view id=\"item-{{id}}\">Item {{index}}</view><checkbox checked=\"{{isChecked}}\"></checkbox>
条件渲染
<view wx:if=\"{{condition}}\">条件成立时显示</view><view wx:elif=\"{{anotherCondition}}\">其他条件</view><view wx:else>否则显示</view><block wx:if=\"{{true}}\"> <view>view1</view> <view>view2</view></block>
列表渲染
<view wx:for=\"{{array}}\" wx:key=\"id\"> {{index}}: {{item.message}}</view><view wx:for=\"{{[1,2,3]}}\" wx:for-item=\"num\" wx:key=\"*this\"> {{num}}</view>
3.4 WXSS样式语言
WXSS(WeiXin Style Sheets)是一套样式语言,用于描述WXML的组件样式,具有CSS大部分特性。
尺寸单位rpx
rpx(responsive pixel)可以根据屏幕宽度进行自适应。规定屏幕宽为750rpx。
/* 在iPhone6上,屏幕宽度为375px,1rpx=0.5px */.container { width: 750rpx; /* 在iPhone6上会显示为375px */ height: 200rpx; font-size: 32rpx;}
样式导入
/* app.wxss */@import \"common.wxss\";.container { color: #333;}
3.5 JavaScript逻辑层
小程序的JS处理页面逻辑,同时提供了丰富的API。
页面生命周期
Page({ data: { text: \"初始化数据\" }, onLoad: function(options) { // 页面创建时执行 }, onShow: function() { // 页面显示时执行 }, onReady: function() { // 页面首次渲染完毕时执行 }, onHide: function() { // 页面隐藏时执行 }, onUnload: function() { // 页面卸载时执行 }, onPullDownRefresh: function() { // 下拉刷新时执行 }, onReachBottom: function() { // 页面上拉触底时执行 }})
事件处理
Page({ tapName: function(event) { console.log(event) }})
<view bindtap=\"tapName\">点击我</view>
四、小程序核心组件
4.1 视图容器组件
view
基础视图容器,相当于HTML中的div。
<view class=\"container\" hover-class=\"hover\" hover-stop-propagation hover-start-time=\"50\" hover-stay-time=\"400\"> 这是一个视图容器</view>
scroll-view
可滚动视图区域。
<scroll-view scroll-y style=\"height: 200px;\" bindscroll=\"scrollHandler\"> <view style=\"height: 400px;\">可滚动内容</view></scroll-view>
swiper
滑块视图容器,常用于轮播图。
<swiper indicator-dots autoplay interval=\"3000\"> <swiper-item> <image src=\"/images/1.jpg\"></image> </swiper-item> <swiper-item> <image src=\"/images/2.jpg\"></image> </swiper-item></swiper>
4.2 基础内容组件
text
文本组件,支持嵌套和长按选择。
<text selectable>可选择文本</text><text space=\"ensp\">使用 en 空格</text><text decode> <span class=\"token entity named-entity\" title=\"< \">> & ' </text>
rich-text
富文本组件,支持解析HTML字符串。
<rich-text nodes=\"{{html}}\"></rich-text>
Page({ data: { html: \'红色文本\' }})
4.3 表单组件
button
按钮组件,丰富多样的开放能力。
<button type=\"primary\" size=\"mini\" plain loading bindtap=\"btnClick\"> 主要按钮</button>
input
输入框组件。
<input type=\"text\" placeholder=\"请输入\" value=\"{{inputValue}}\" bindinput=\"inputChange\" />
picker
从底部弹起的滚动选择器。
<picker mode=\"selector\" range=\"{{array}}\" bindchange=\"pickerChange\"> <view>当前选择:{{array[index]}}</view></picker>
4.4 导航组件
navigator
页面链接组件,相当于HTML中的a标签。
<navigator url=\"/pages/logs/logs\" open-type=\"navigate\" hover-class=\"navigator-hover\"> 跳转到日志页</navigator>
open-type支持:
- navigate:默认值,保留当前页面,跳转到应用内页面
- redirect:关闭当前页面,跳转到应用内页面
- switchTab:跳转到tabBar页面
- reLaunch:关闭所有页面,打开应用内某个页面
- navigateBack:关闭当前页面,返回上一页面或多级页面
4.5 媒体组件
image
图片组件,支持多种缩放模式。
<image src=\"/images/1.jpg\" mode=\"aspectFit\" lazy-load binderror=\"imageError\"></image>
mode属性值:
- scaleToFill:默认,不保持纵横比缩放图片
- aspectFit:保持纵横比缩放,完整显示
- aspectFill:保持纵横比缩放,填充容器
- widthFix:宽度不变,高度自动变化
video
视频组件。
<video src=\"http://example.com/video.mp4\" controls></video>
4.6 地图组件
map
地图组件,功能丰富。
<map longitude=\"116.397428\" latitude=\"39.90923\" scale=\"14\" markers=\"{{markers}}\" bindmarkertap=\"markerTap\"></map>
Page({ data: { markers: [{ id: 1, latitude: 39.90923, longitude: 116.397428, title: \'天安门\' }] }, markerTap: function(e) { console.log(e.markerId) }})
五、小程序API详解
5.1 网络请求
wx.request
发起HTTPS网络请求。
wx.request({ url: \'https://example.com/api\', method: \'POST\', data: { key: \'value\' }, header: { \'content-type\': \'application/json\' }, success(res) { console.log(res.data) }, fail(err) { console.error(err) }})
上传下载
// 上传文件wx.uploadFile({ url: \'https://example.com/upload\', filePath: tempFilePaths[0], name: \'file\', formData: { \'user\': \'test\' }, success(res) { const data = res.data }})// 下载文件wx.downloadFile({ url: \'https://example.com/file.pdf\', success(res) { const filePath = res.tempFilePath }})
5.2 数据缓存
同步缓存
try { wx.setStorageSync(\'key\', \'value\') const value = wx.getStorageSync(\'key\') wx.removeStorageSync(\'key\') wx.clearStorageSync()} catch (e) { console.error(e)}
异步缓存
wx.setStorage({ key: \'key\', data: \'value\', success() { wx.getStorage({ key: \'key\', success(res) { console.log(res.data) } }) }})
5.3 位置API
获取位置
wx.getLocation({ type: \'wgs84\', success(res) { const latitude = res.latitude const longitude = res.longitude }})
地图控件
wx.chooseLocation({ success(res) { console.log(res.name) console.log(res.address) }})
5.4 设备相关API
系统信息
wx.getSystemInfo({ success(res) { console.log(res.model) console.log(res.pixelRatio) console.log(res.windowWidth) }})
扫码
wx.scanCode({ success(res) { console.log(res.result) }})
5.5 界面交互API
显示提示
wx.showToast({ title: \'成功\', icon: \'success\', duration: 2000})wx.showLoading({ title: \'加载中\', mask: true})setTimeout(() => { wx.hideLoading()}, 2000)
模态对话框
wx.showModal({ title: \'提示\', content: \'确认删除吗?\', success(res) { if (res.confirm) { console.log(\'用户点击确定\') } }})
六、小程序高级开发技巧
6.1 自定义组件开发
创建组件
- 在项目根目录创建
components
文件夹 - 新建组件文件夹,如
my-component
- 创建组件文件:
- my-component.json
- my-component.wxml
- my-component.wxss
- my-component.js
组件配置
// my-component.json{ \"component\": true, \"usingComponents\": {}}
组件模板
<view class=\"my-component\"> <slot></slot> <view>{{innerText}}</view></view>
组件样式
/* my-component.wxss */.my-component { color: red;}
组件逻辑
// my-component.jsComponent({ properties: { innerText: { type: String, value: \'default value\' } }, data: {}, methods: { customMethod: function() {} }})
使用组件
// 页面json配置{ \"usingComponents\": { \"my-component\": \"/components/my-component/my-component\" }}
<my-component inner-text=\"自定义内容\"> <view>插入slot的内容</view></my-component>
6.2 性能优化技巧
数据通信优化
- 减少setData的数据量,只设置变化的数据
- 避免频繁调用setData,合并更新
- 列表渲染使用wx:key提高diff效率
// 不好的做法this.setData({ \'array[0].text\': \'new text\' })// 好的做法const newArray = this.data.array.slice()newArray[0].text = \'new text\'this.setData({ array: newArray })
图片优化
- 使用合适的图片格式和压缩
- 按需加载图片,使用lazy-load
- 使用雪碧图减少请求
代码包优化
- 合理分包加载
- 移除无用代码和资源
- 使用小程序提供的按需注入和用时注入
6.3 安全最佳实践
- 接口请求使用HTTPS
- 敏感数据不存储在本地
- 用户输入内容进行过滤和转义
- 使用微信提供的登录态管理
- 重要操作添加二次确认
6.4 跨平台开发方案
Taro框架
Taro是一套遵循React语法规范的多端开发解决方案。
import Taro, { Component } from \'@tarojs/taro\'import { View, Text } from \'@tarojs/components\'class Home extends Component { render() { return ( <View className=\'index\'> <Text>Hello world!</Text> </View> ) }}
uni-app框架
uni-app是一个使用Vue.js开发所有前端应用的框架。
<template> <view class=\"content\"> <image class=\"logo\" src=\"/static/logo.png\"></image> <button @click=\"gotoPage\">跳转页面</button> </view></template><script>export default { methods: { gotoPage() { uni.navigateTo({ url: \'/pages/detail/detail\' }) } }}</script>
七、小程序发布与运营
7.1 代码审核与发布
上传代码
- 在开发者工具点击\"上传\"
- 填写版本号和项目备注
- 上传成功后,登录小程序管理后台
提交审核
- 在管理后台\"开发管理\"页面找到上传的版本
- 填写审核信息,包括测试账号等
- 提交审核,通常需要1-7个工作日
发布上线
审核通过后,开发者可手动点击\"发布\",新版本将全量发布
7.2 数据分析
微信提供了丰富的数据分析工具:
- 实时统计:查看实时访问数据
- 访问分析:用户来源、留存、画像等
- 性能分析:启动性能、运行性能数据
- 自定义分析:配置自定义事件跟踪
- AB测试:对不同用户展示不同内容
7.3 运营工具
小程序码
- 普通二维码:适用于线下场景
- 带参数二维码:可追踪不同渠道效果
- 小程序码:圆形二维码,辨识度高
模板消息
满足条件时可向用户发送模板消息:
- 支付成功后7天内可发送3条
- 提交表单后可发送1条
- 需要用户主动触发
客服消息
用户可在小程序内联系客服:
<button open-type=\"contact\">联系客服</button>
7.4 推广策略
- 微信搜索优化:优化小程序名称、关键词
- 附近的小程序:开通位置展示
- 公众号关联:与公众号互相导流
- 社交分享:设计有吸引力的分享卡片
- 广告投放:使用微信广告平台推广
八、实战项目:电商小程序开发
8.1 项目需求分析
开发一个简易电商小程序,包含以下功能:
- 首页商品展示
- 商品分类浏览
- 商品详情页
- 购物车功能
- 用户订单管理
- 微信支付集成
8.2 项目结构设计
├── pages/│ ├── home/ # 首页│ ├── category/ # 分类页│ ├── goods/ # 商品详情│ ├── cart/ # 购物车│ ├── order/ # 订单相关│ └── user/ # 用户中心├── components/│ ├── goods-list/ # 商品列表组件│ ├── cart-control/ # 购物车控件│ └── tab-bar/ # 自定义tabBar├── services/ # 服务层│ ├── api.js # 接口封装│ └── cart.js # 购物车逻辑└── assets/ # 静态资源
8.3 核心功能实现
首页实现
<swiper indicator-dots autoplay> <swiper-item wx:for=\"{{banners}}\" wx:key=\"id\"> <image src=\"{{item.image}}\" mode=\"aspectFill\"></image> </swiper-item></swiper><goods-list goods=\"{{hotGoods}}\"></goods-list>
// home.jsPage({ data: { banners: [], hotGoods: [] }, onLoad() { this.loadData() }, loadData() { wx.request({ url: \'https://api.example.com/home\', success: (res) => { this.setData({ banners: res.data.banners, hotGoods: res.data.hotGoods }) } }) }})
购物车实现
// services/cart.jsconst Cart = { add(goods) { let cart = wx.getStorageSync(\'cart\') || [] const index = cart.findIndex(item => item.id === goods.id) if (index >= 0) { cart[index].count++ } else { goods.count = 1 cart.push(goods) } wx.setStorageSync(\'cart\', cart) return cart }, get() { return wx.getStorageSync(\'cart\') || [] }, clear() { wx.removeStorageSync(\'cart\') }}export default Cart
微信支付集成
// services/order.jsconst payOrder = (orderId) => { return new Promise((resolve, reject) => { wx.requestPayment({ timeStamp: \'\', nonceStr: \'\', package: \'\', signType: \'MD5\', paySign: \'\', success(res) { resolve(res) }, fail(err) { reject(err) } }) })}
8.4 项目优化与发布
- 分包加载:将商品详情、订单等页面放入子包
- 缓存策略:合理使用缓存减少请求
- 性能监控:使用小程序后台分析工具
- 错误收集:实现错误上报机制
- 灰度发布:先小范围测试再全量
九、常见问题与解决方案
9.1 开发常见问题
页面白屏
可能原因:
- app.json中pages配置错误
- 页面路径不正确
- 页面JS报错导致初始化失败
解决方案:
- 检查pages配置和文件路径
- 查看调试器Console面板错误信息
- 使用开发者工具的\"编译模式\"调试
setData性能问题
优化建议:
- 避免频繁调用setData
- 只setData变化的数据
- 大数据列表使用虚拟列表
// 不好的做法this.setData({ \'list[10].show\': true })// 好的做法const newList = [...this.data.list]newList[10].show = truethis.setData({ list: newList })
9.2 审核常见问题
审核被拒常见原因
- 功能不完整或无法使用
- 存在测试数据或测试账号
- 类目选择不正确
- 内容不符合规范
- 存在诱导分享行为
解决方案
- 确保所有功能可用
- 移除测试数据,提供测试账号
- 选择正确的服务类目
- 检查内容是否符合微信规范
- 避免强制用户分享
9.3 性能优化问题
启动加载慢
优化方案:
- 减少首屏请求和数据量
- 使用分包加载
- 启用\"按需注入\"或\"用时注入\"
- 预加载下一页数据
渲染卡顿
优化方案:
- 简化WXML结构,减少节点数量
- 避免过深的嵌套
- 使用wx:if替代hidden控制显示
- 图片使用合适的尺寸和压缩