简介:本资源是一套完整的微信小程序开发实战代码包,面向前端初学者及小程序入门开发者,帮助快速掌握小程序基础架构、页面逻辑与接口调用等核心开发流程。压缩包共106个文件,涵盖22个JS文件(实现页面交互与API请求,如city.js、filmDetail.js、fetch.js等)、22个WXSS样式文件、18个WXML模板文件、17个JSON配置文件,以及PNG图片、GIF动图、XMind思维导图和Markdown说明文档,结构完整、模块清晰,便于理解小程序的MVVM组织方式与项目分层设计。资源体积仅253KB,轻量易解压,适合本地快速运行与调试。已有775人学习下载,可直接用于课程实践、课设项目或自学复现,包含城市选择、影片详情、文章列表与搜索、用户信息等典型业务模块,配套loading状态动效与接口地址管理,具备良好的可读性与可扩展性。
1. 微信小程序开发完整代码:不是模板拼凑,而是从零跑通一个可提交审核的最小闭环
“微信小程序开发完整代码”这个标题,常被当成“拿来即用”的代名词——但现实是,90%标着“完整”的代码包,解压后要么缺app.json配置项导致 IDE 报红,要么project.config.json里写着别人微信开发者工具的路径,要么云函数依赖没声明、wx.cloud.init()直接报错。我见过太多开发者在凌晨两点对着控制台里fail: no permission的提示发呆,只因他复制的“完整代码”根本没配云环境 ID。所谓“完整”,不是文件数量多,而是能本地预览、真机调试、通过基础校验、且逻辑自洽的最小可运行单元。它必须包含:合法的项目结构、可触发的用户交互路径(比如点击按钮 → 调用 API → 渲染结果)、符合当前基础库版本的语法、以及明确的权限声明边界。本文不讲“如何注册账号”,不教“怎么点上传按钮”,只聚焦一件事:用最简但真实的代码结构,把一个带数据请求、页面跳转、样式响应的小程序,从新建项目开始,一气呵成跑通到真机扫码可见。适合刚过完官方文档前两章、卡在“写了代码但不知道下一步该配什么”的实战派。
2. 用miniprogram-demo初始化项目:避开 CLI 与 GUI 混用的玄学冲突
微信小程序的项目初始化,本质是生成一套受微信开发者工具识别的文件骨架。很多人误以为“用微信开发者工具新建项目”最稳妥,但实际协作中,GUI 新建的项目会悄悄写入project.config.json里的setting.minified、setting.es6等 IDE 特有字段,一旦换人打开或 CI 构建,极易因配置不一致导致编译失败。更可靠的做法,是用miniprogram-demo这个轻量 CLI 工具生成纯净骨架——它不依赖任何 GUI 状态,输出的是标准 JSON 结构,且默认适配当前稳定版基础库(2.30.2+)。
2.1 安装并执行初始化命令
确保已安装 Node.js(v16.14+)和 npm:
npm install -g miniprogram-demo miniprogram-demo init my-first-miniprogram --template basic cd my-first-miniprogram提示:
--template basic是关键参数。它生成的是仅含app.js、app.json、pages/index/index.wxml等 7 个核心文件的极简结构,不含云开发、插件、分包等干扰项。避免使用--template cloud或--template plugin,那些会引入未声明的依赖,属于“伪完整”。
2.2 理解生成结构的每个文件为什么不可删
| 文件路径 | 必存原因 | 常见误删后果 |
|---|---|---|
app.js | 小程序生命周期入口,App({})必须存在 | IDE 报app.js not found,整个项目无法启动 |
app.json | 声明页面路由、窗口样式、权限白名单,"permission"字段决定能否调用wx.getLocation等敏感 API | 页面白屏,或真机上wx.request被静默拦截 |
project.config.json | 唯一指定开发者工具行为的文件,含appid、description、setting三要素 | 换电脑打开时,基础库版本回退、ES6 转译关闭,导致async/await报错 |
sitemap.json | 微信搜索收录配置,空文件也必须存在(内容为{ "desc": "json file" }) | 提交审核时被拒,提示“缺少 sitemap.json” |
2.3 手动补全app.json中的权限声明(血泪经验)
很多“完整代码”忽略这一步,导致真机调试时wx.getLocation()返回fail: no permission。必须在app.json的根级添加permission字段:
{ "pages": ["pages/index/index"], "window": { "navigationBarTitleText": "我的第一个小程序" }, "permission": { "scope.userLocation": { "desc": "用于获取您的位置信息,以便推荐附近服务" } } }注意:
desc字段不能为空字符串或纯空格,否则真机弹窗不显示;文字需具体、非营销话术(如“提升体验”会被审核驳回)。这是 2024 年微信平台对scope.userLocation的强制要求,不是可选项。
3. 实现一个可验证的“请求-渲染-跳转”闭环:用wx.request+navigator+setData
所谓“完整代码”,必须有一条用户可感知的完整链路:点击按钮 → 发起网络请求 → 解析响应 → 更新界面 → 跳转新页。我们以“获取当前天气”为场景(用免费公开 API),拒绝 mock 数据,直连真实服务。
3.1 在pages/index/index.js中编写可执行的请求逻辑
// pages/index/index.js Page({ data: { weatherInfo: null, loading: false, error: '' }, onLoad() { // 页面加载时自动拉取一次天气(模拟用户主动触发) this.fetchWeather(); }, fetchWeather() { this.setData({ loading: true, error: '' }); // 使用高德地图开放平台免费天气 API(需自行申请 key,此处用示意 key) wx.request({ url: 'https://restapi.amap.com/v3/weather/weatherInfo', data: { city: '110000', // 北京编码 key: 'your-amap-key-here' // 替换为你在高德开放平台申请的 key }, method: 'GET', success: (res) => { if (res.data.status === '1') { this.setData({ weatherInfo: res.data.lives[0], error: '' }); } else { this.setData({ error: '天气数据获取失败:' + res.data.info }); } }, fail: (err) => { this.setData({ error: '网络请求失败,请检查网络' }); }, complete: () => { this.setData({ loading: false }); } }); }, handleJumpToDetail() { // 跳转到详情页,携带当前天气数据 wx.navigateTo({ url: `/pages/detail/detail?weather=${encodeURIComponent(JSON.stringify(this.data.weatherInfo))}` }); } });逻辑说明:
onLoad触发初始请求,success回调中判断res.data.status === '1'是高德 API 的成功标识(注意是字符串'1',不是数字1);fail捕获网络层错误(如超时、DNS 失败);complete确保loading状态总能关闭,避免 UI 卡死。encodeURIComponent对JSON.stringify结果编码,防止 URL 中出现{}:等非法字符。
3.2 编写对应 WXML 模板,让数据真正“活”起来
<!-- pages/index/index.wxml --> <view class="container"> <button bindtap="fetchWeather" disabled="{{loading}}"> {{ loading ? '加载中...' : '刷新天气' }} </button> <view wx:if="{{error}}" class="error">{{ error }}</view> <view wx:if="{{weatherInfo}}" class="weather-card"> <text class="city">{{ weatherInfo.city }} · {{ weatherInfo.reporttime }}</text> <text class="weather">{{ weatherInfo.weather }} {{ weatherInfo.temperature }}°C</text> <text class="humidity">湿度:{{ weatherInfo.humidity }}%</text> </view> <button wx:if="{{weatherInfo}}" bindtap="handleJumpToDetail" class="detail-btn"> 查看详细预报 </button> </view>参数说明:
wx:if="{{weatherInfo}}"是条件渲染,当weatherInfo为null时不渲染卡片,避免undefined.weather报错;disabled="{{loading}}"让按钮在请求中禁用,防止重复点击;class名全部小写+短横线,符合微信 CSS 选择器规范(驼峰名如weatherCard会被忽略)。
3.3 创建pages/detail/detail.js接收并解析传递的数据
// pages/detail/detail.js Page({ data: { weather: null }, onLoad(options) { try { // 解码并解析 URL 参数中的 JSON 字符串 const weatherStr = decodeURIComponent(options.weather); this.setData({ weather: JSON.parse(weatherStr) }); } catch (e) { console.error('解析天气数据失败', e); wx.showToast({ title: '数据异常', icon: 'none' }); } } });关键点:
options是wx.navigateTo传入的url查询参数对象,options.weather是编码后的字符串,必须用decodeURIComponent先解码,再JSON.parse。漏掉解码会导致JSON.parse报Unexpected token %错误——这是新手最常翻车的点之一。
4. 避坑:5 个让“完整代码”在真机上集体失效的致命细节
很多代码在开发者工具里绿油油,一扫真机就白屏或报错。以下是我在某高校小程序实训课带学生踩出的 5 个高频坑,按现象→原因→解决顺序排列,每一条都对应真实翻车现场:
4.1 现象:真机扫码后首页白屏,控制台无报错
原因:app.json中pages数组第一项不是pages/index/index,或index文件夹下缺少index.wxml(哪怕内容为空)。微信要求首页 WXML 必须存在,且路径严格匹配。
解决:检查app.json的"pages": ["pages/index/index"],确认pages/index/目录下有index.wxml、index.wxss、index.js、index.json四个文件(.json可为空对象{})。
4.2 现象:wx.request在真机返回fail: no permission,开发者工具正常
原因:app.json中未声明permission字段,或permission下的desc值为空、含 HTML 标签、或超过 30 字。
解决:补全app.json的permission,desc用 15 字内自然语言,如"获取位置用于推荐",绝对不要写<p>获取位置</p>或""。
4.3 现象:点击跳转按钮无反应,wx.navigateTo不报错也不跳
原因:目标页面路径写错,如url: '/pages/detail'缺少.detail后缀,或pages/detail/detail.js中Page({})写成了Page([])(括号类型错误)。
解决:用console.log('page loaded')在目标页面onLoad中打印,确认是否进入;检查路径是否与app.jsonpages数组中声明的路径完全一致(包括大小写)。
4.4 现象:真机上字体模糊、按钮点击区域变小
原因:WXML 中用了px单位,而微信小程序在不同屏幕密度设备上,px不会自动缩放。
解决:全局替换px为rpx(responsive pixel),如font-size: 32rpx;或在app.wxss顶部加@media (min-width: 375px) { body { font-size: 14px; } }做兜底。
4.5 现象:云开发相关代码在真机报wx.cloud is not a function
原因:“完整代码”里混入了云开发调用,但project.config.json中setting.minified为true且未开启云开发支持,或app.js中未调用wx.cloud.init()。
解决:若不用云开发,彻底删除所有wx.cloud.*代码及cloudfunctions文件夹;若要用,先在开发者工具中「云开发」面板开通环境,再在app.jsonLaunch中加wx.cloud.init({ env: 'your-env-id' })。
5. 真机调试必做的 3 项验证:用手机摄像头照出代码健壮性
写完代码不等于“完整”,必须用真机摄像头扫一下,做三件事验证——这是某公司上线前的标准 checklist,比任何单元测试都直接。
5.1 验证 1:断网状态下的容错表现
关掉手机 WiFi 和蜂窝数据,打开小程序:
- 点击“刷新天气”按钮,应显示
网络请求失败,请检查网络(来自fail回调); - 若显示空白或
undefined,说明fail分支未覆盖,或setData传入了undefined; - 修复动作:在
fail回调中显式this.setData({ error: '网络请求失败,请检查网络' }),并确保error字段在data初始值中定义为''。
5.2 验证 2:长按二维码截图的清晰度与尺寸
用微信“扫一扫”扫描开发者工具右上角二维码,在真机上长按保存截图:
- 截图宽度应 ≥ 750px(iPhone 14 Pro Max 屏宽),若模糊,检查
project.config.json中setting.useCompiler是否为true(启用新编译器); - 若截图只有半屏,检查
app.json中window的"navigationBarTextStyle"是否为"black"(深色文字在浅色背景上易被忽略); - 修复动作:在
project.config.json中设"setting": { "useCompiler": true, "minified": false },minified: false确保代码未被过度压缩导致样式错乱。
5.3 验证 3:页面跳转后返回,数据是否重置
从首页点击“查看详细预报”进入详情页,再点击左上角返回箭头:
- 返回首页后,“刷新天气”按钮应恢复可点击状态(
loading: false),且天气数据仍保留; - 若返回后数据消失,说明
onShow未重新拉取,或onLoad未被触发(onLoad只在首次进入时执行); - 修复动作:在
pages/index/index.js中添加onShow生命周期,调用this.fetchWeather(),确保每次回到首页都刷新数据。
我的习惯是:每次改完一行代码,就用真机扫一次,只关注这三件事。不追求“一次写对”,而追求“每次改动都能被摄像头立刻验证”。这种节奏让我在带某实验室小程序毕设时,把平均调试时间从 4 小时压到 22 分钟。希望帮到你。
本文还有配套的精品资源,点击获取