微信小程序新手起步模板:带完整配置、标准页面和即用型图片资源

📅 2026/7/2 21:49:41
微信小程序新手起步模板:带完整配置、标准页面和即用型图片资源
本文还有配套的精品资源点击获取简介直接导入微信开发者工具就能跑起来的小程序基础模板包含项目配置project.config.、app.、sitemap.、全局逻辑app.js、util.js、样式文件app.wxss和ESLint规范.eslintrc.js。页面结构按官方推荐组织含首页index和日志页logs每个页面都配齐WXML、WXSS、JS三件套。静态资源已提前准备好banner1.jpg顶部横幅、card1.jpg卡片图、logo.png应用图标、menu1.png菜单图标、topic1.jpg背景图全部放在对应pages子目录的images文件夹里命名清晰、尺寸合规、可一键替换。不需要额外装依赖或改路径打开就能看生命周期执行顺序、页面跳转效果、本地图片引用方式适合刚接触小程序开发的人边运行边理解目录结构和基础机制。1. 这不是“Hello World”而是一套能让你真正看懂小程序骨架的起点模板刚打开微信开发者工具新建项目时看到那一片空白的app.js、app.json和pages/index/index.js很多人第一反应是这堆文件到底谁管什么为什么改了app.json里的pages数组页面就多出来了为什么index.wxml里写image src/images/logo.png就能显示图片但换成相对路径./images/logo.png就报错这些看似基础的问题恰恰是新手卡住最久的地方——不是不会写代码而是根本没建立起对小程序运行机制的“空间感”。这套模板就是专为解决这种“认知断层”设计的。它不追求炫酷功能也不堆砌第三方库而是用最干净、最标准、最贴近微信官方文档推荐实践的方式把小程序从启动到渲染、从配置到资源加载的完整链条像拆解一台机械表一样一颗螺丝一颗齿轮地摆在你面前。你导入即跑看到的不只是一个能点开的首页而是能实时观察到App.onLaunch → App.onShow → Page.onLoad → Page.onReady的完整生命周期执行顺序点击“跳转到日志页”你能立刻在控制台看到navigateTo触发的路由变化和页面实例的创建销毁过程把pages/index/images/banner1.jpg换成自己拍的图刷新一下横幅就变了——整个过程没有构建、没有编译、没有npm install只有你和微信框架之间最直接的对话。关键词里提到的“小程序模板、微信开发、静态图片、页面结构、app配置”在这里不是抽象概念而是你鼠标右键就能打开、编辑、保存、立刻生效的具体文件。project.config.json里藏着开发者工具的窗口尺寸和调试开关sitemap.json控制着哪些页面能被微信搜索收录app.json是整个小程序的“地图”和“说明书”定义了页面栈、导航栏样式、底部 tab 栏app.js是全局大脑管理登录态、网络请求拦截、全局数据而每个pages/xxx/目录下的三件套.wxml、.wxss、.js则是独立运转的“小宇宙”彼此隔离又通过wx.navigateTo或wx.switchTab精确通信。所有图片都按微信推荐的尺寸预设banner 宽750rpx高300rpx、logo 120×120px、菜单图标 40×40px存放在各自页面目录下的images文件夹里彻底规避了新手常踩的“图片路径404”、“rpx单位失效”、“真机预览白屏”三大坑。这不是一个让你复制粘贴的代码包而是一个可以随时打断点、随时修改、随时验证的小程序“教学沙盒”。2. 项目整体设计与思路拆解为什么这样组织比“能跑起来”更重要2.1 配置先行project.config.json与app.json的分工逻辑很多新手会混淆project.config.json和app.json以为都是“配置文件”改一个就行。实际上它们服务的对象和生命周期完全不同这个模板的结构正是为了让你一眼看清区别。project.config.json是开发者工具专属的本地配置它只存在于你的电脑上不会上传到微信服务器也不会影响其他开发者。它记录的是你个人的开发习惯比如你习惯用深色主题它就记下setting: {darkMode: true}你总把模拟器分辨率调成 iPhone X它就存simulator: {device: iPhone X}甚至你常用的自定义编译模式如“测试环境-带mock数据”也在这里定义。这个文件的核心价值在于“一致性”——当你把项目传给同事他双击project.config.json导入就能瞬间获得和你一模一样的开发界面、快捷键设置和模拟器参数避免了“在我电脑上好好的到你那儿就乱码”的协作灾难。模板里特意保留了description: 小程序基础模板 - 新手友好版这一行就是为了提醒你这是你的“工作台说明书”不是小程序的“产品说明书”。而app.json才是小程序真正的运行契约它会被打包进最终的.wxapkg包由微信客户端解析执行。它的核心字段pages定义了小程序的“页面地图”微信引擎启动后第一件事就是读这个数组按顺序初始化页面栈。window字段则规定了所有页面共用的默认样式比如navigationBarTitleText: 我的小程序意味着除非某个页面在自己的json文件里显式覆盖否则所有页面顶部标题栏都显示这句话。tabBar更是关键它要求list数组里的每个对象必须包含pagePath必须是pages数组中已声明的路径、text文字和iconPath未选中状态图标。模板里tabBar.list[0].pagePath是pages/index/index对应pages/index/目录而iconPath: pages/index/images/menu1.png则精准指向该页面自己的图标文件——这种“页面级资源自治”的设计让每个页面的视觉元素完全解耦替换首页图标时绝不会误伤日志页的图标。提示app.json中sitemapLocation默认设为sitemap.json这是一个开关。当值为sitemap.json且文件存在时微信会启用小程序搜索能力若改为sitemap.json但文件不存在或直接删掉这一行搜索功能就关闭了。模板保留此配置是让你明白搜索不是默认开启的魔法而是需要主动声明并提供索引规则的明确动作。2.2 全局逻辑分层app.js与util.js的职责边界app.js是小程序的“心脏”负责全局状态和生命周期钩子。模板中的App({})对象里onLaunch是应用首次启动时触发的唯一入口这里适合放初始化操作比如检查用户登录态、拉取全局配置。onShow则每次小程序从后台切回前台都会执行适合做数据刷新如检查新消息。而globalData是一个共享内存区任何页面通过getApp()都能访问它比如getApp().globalData.userInfo {name: 张三}后续页面就能读到。但要注意globalData只是普通 JS 对象不具有响应式页面里this.setData({user: getApp().globalData.userInfo})后如果globalData.userInfo后续被修改页面上的user不会自动更新——这是新手常误以为的“全局响应式”实际需手动setData或使用Behavior。util.js则是“工具箱”存放与业务无关的通用函数。模板里提供了formatTime(new Date())这个经典方法它把Date对象转成2023/06/15 19:30:15格式。为什么放这里而不是app.js因为formatTime不依赖任何小程序特有 API如wx.getSystemInfoSync它纯粹是 JS 字符串处理未来迁移到 H5 或 Node.js 环境也能复用。同理如果你要加一个debounce防抖函数也应放util.js而非塞进app.js的某个生命周期里。这种分层让代码可维护性陡增当你要排查“为什么时间显示不对”时只需盯util.js而查“为什么登录态丢失”则直奔app.js的onLaunch和onShow。注意utils目录名是微信官方推荐的但util.js文件名是单数。很多新手会写成utils.js复数导致require(../utils/utils.js)报错。模板坚持用util.js就是用文件名本身作为一道防错提示。2.3 页面结构设计为什么index和logs是最佳入门组合首页index是用户第一眼看到的世界它必须简单、直观、承载核心价值。模板的index.wxml只有四行核心结构一个顶部 bannerimage、一个标题text、一个卡片view内含card1.jpg、一个跳转按钮button。这种极简设计强迫你关注本质image src/pages/index/images/banner1.jpg中的/开头表示绝对路径从项目根目录算起button bindtapgoToLogs的bindtap是事件绑定语法goToLogs是index.js里定义的方法名点击即触发。没有v-for循环没有复杂wx:if条件一切清晰可见。日志页logs则是“技术透视镜”。它的logs.wxml用scroll-view包裹一个block wx:for{{logs}}循环数据来自logs.js的data: { logs: [] }。关键在于logs.js的onLoad函数里有一行const logs wx.getStorageSync(logs) || []——它从本地存储读取历史日志而index.js的跳转按钮点击后会执行wx.setStorageSync(logs, [...logs, newLog])写入新日志。这意味着你从首页点一次按钮日志页就多一条记录关掉开发者工具再打开日志还在。这个组合完美演示了页面间如何通过全局存储传递数据、如何用wx:for渲染列表、scroll-view如何替代原生滚动条实现自定义滚动效果。它不教你“怎么做无限加载”而是先让你彻底搞懂“数据从哪来、到哪去、怎么存”。3. 核心细节解析与实操要点从文件到运行的每一处关键3.1 图片资源规范尺寸、路径、引用方式的三位一体小程序对图片的要求远比网页严格。模板提供的五张图每一张都对应一个明确的设计场景和尺寸规范banner1.jpg顶部横幅尺寸750×300 像素。为什么是 750因为微信小程序的屏幕基准宽度是 750rpxresponsive pixel1rpx 屏幕宽度 / 750px。在 iPhone 14 Pro Max1290×2796px上1rpx ≈ 1.72px在旧款 iPhone 6750×1334px上1rpx 1px。所以750×300的图在所有设备上铺满宽度时都能保持 1:1 的像素映射不会模糊或拉伸。它存放在pages/index/images/下引用路径是/pages/index/images/banner1.jpg注意开头的/是必须的相对路径./images/banner1.jpg在index.wxml中会解析失败。card1.jpg卡片图尺寸300×200 像素。这是内容卡片的标准比例3:2适配信息流布局。它被image标签包裹在view classcard中view的WXSS设置了width: 600rpx; height: 400rpx;正好是图片像素的两倍确保在 retina 屏上清晰显示。logo.png应用图标尺寸120×120 像素格式必须是 PNG支持透明通道。它出现在app.json的tabBar.iconPath和selectedIconPath字段中用于底部 tab 栏。微信要求图标必须是纯色背景简洁图形logo.png的白色背景和深色图标符合“高对比度、易识别”的设计原则。menu1.png菜单图标尺寸40×40 像素同样为 PNG。它被用作首页的“跳转按钮”图标image src/pages/index/images/menu1.png classmenu-iconWXSS中设置了width: 40rpx; height: 40rpx;完美匹配。topic1.jpg背景图尺寸750×1334 像素全屏高度。它被用作index.wxss中page选择器的background-imageCSS 写法是background-image: url(/pages/index/images/topic1.jpg); background-size: cover;。cover确保图片覆盖整个页面即使设备高度不同也会自动裁剪适配。实操心得所有图片在放入项目前务必用工具如 Photoshop 或在线压缩网站进行“尺寸裁剪质量压缩”。一张未压缩的 5MB JPG 图在真机上加载可能长达 3 秒直接导致首屏白屏。模板中的图片均控制在 100KB 以内这是经过实测的“秒开”阈值。3.2 ESLint 规范配置.eslintrc.js如何成为你的代码教练.eslintrc.js不是摆设它是嵌入在开发者工具里的实时代码教练。模板采用eslint:recommended基础规则并针对小程序特性做了微调。例如规则no-unused-vars: [error, { argsIgnorePattern: ^_ }]允许你定义_e这样的形参如bindtap_e {}避免因未使用事件对象而报错no-undef: [error, { typeof: true }]则允许typeof wx ! undefined这类判断因为wx对象在非微信环境如浏览器下确实不存在。最关键的配置是env: { browser: true, es6: true, node: true }和globals: { wx: true, App: true, Page: true, Component: true, getApp: true, getCurrentPages: true }。前者告诉 ESLint你的代码运行在浏览器环境支持document、ES6 语法支持const、let和 Node.js 环境支持require后者则声明wx、App等是全局变量不会被当作未定义错误标红。没有这两行你在app.js里写wx.login()编辑器会立刻划红线警告“wx is not defined”。注意ESLint 规则生效的前提是开发者工具启用了“ESLint 检查”。在工具右上角“详情”→“本地设置”中勾选“ESLint 检查”并确保项目根目录存在.eslintrc.js。模板已预置此文件你只需打开开关就能获得实时的代码质量反馈。3.3sitemap.json让小程序被微信搜索发现的“地图说明书”sitemap.json是小程序的“搜索引擎优化说明书”。模板内容如下{ desc: 小程序页面索引配置, rules: [{ action: allow, page: * }] }其中page: *表示允许微信爬虫抓取所有页面。但真实项目中你绝不会这么写。比如logs页面是后台日志用户不该通过搜索找到它这时应改为rules: [ {action: allow, page: index}, {action: disallow, page: logs} ]微信搜索会严格遵循此规则index页面可被索引logs页面则完全隐身。这个文件的存在本身就是一个信号——它告诉你小程序不是封闭的 App而是微信生态的一部分其内容可以被微信用户主动发现。模板保留它是让你在起步阶段就建立“内容可发现性”的意识而不是等到上线后才发现“我的小程序搜不到”。4. 实操过程与核心环节实现从导入到调试的完整 walkthrough4.1 导入与首次运行三步确认你的环境已就绪第一步下载并解压模板包从 GitHub 或其他渠道获取0tvLPpNKMqDjo48tYzDF-master-c9510d18475181a3f09f7b918857cf5ef6b14496.zip解压到一个无中文、无空格的路径例如D:\weapp-template。这是硬性要求因为微信开发者工具的底层编译器对路径编码极其敏感中文路径会导致app.json解析失败报错JSON parse error。第二步在开发者工具中“导入项目”打开微信开发者工具 → 左上角“项目” → “导入项目” → 选择解压后的文件夹D:\weapp-template→ 填写 AppID新手可选“测试号”→ 点击“确定”。此时工具会自动识别project.config.json并加载你的本地设置。几秒后左侧项目树会展开你应该能看到完整的目录结构app.js、app.json、pages/、utils/、images/等。第三步运行并观察控制台点击工具顶部的绿色“编译”按钮或 CtrlB等待右下角状态栏显示“编译完成”。此时模拟器中会自动打开首页。立刻打开右侧“调试器” → “Console” 标签页。你会看到类似输出App Launch App Show index onLoad index onReady这四行日志正是app.js的onLaunch/onShow和pages/index/index.js的onLoad/onReady按序执行的结果。这是你第一次亲眼见证小程序的启动流程。点击首页的“跳转到日志页”按钮控制台会追加index onUnload logs onLoad logs onReadyonUnload表明首页实例已被销毁logs的生命周期开始。这个实时日志流是你理解页面栈管理的黄金线索。4.2 修改与验证亲手改动亲眼见证效果修改首页横幅找到pages/index/images/banner1.jpg用你自己的图片确保是 750×300 像素替换它。回到开发者工具无需重新编译直接按CtrlR刷新模拟器。横幅立刻更新。这是小程序的热重载能力极大提升开发效率。修改页面标题打开app.json找到window对象将navigationBarTitleText: 我的小程序改为navigationBarTitleText: 新手训练营。保存文件工具会自动重新编译顶部导航栏文字立即变为“新手训练营”。这证明app.json是运行时配置修改即生效。添加一个新页面about这是检验你是否真正掌握目录约定的关键操作。在pages/目录下新建文件夹about在about文件夹内新建三个文件about.js、about.wxml、about.wxss然后打开app.json在pages数组的第一项pages/index/index后面插入pages/about/about最后在index.wxml的按钮下方添加一行navigator url/pages/about/about关于我们/navigator。保存所有文件刷新模拟器点击新按钮即可进入空白的about页面。整个过程你只动了三处新建文件、修改app.json、修改index.wxml没有碰任何配置文件这就是小程序“约定优于配置”的魅力。4.3 调试技巧利用开发者工具的隐藏能力WXML 面板的实时编辑在模拟器中右键首页任意元素 → “审查元素”WXML 面板会高亮对应节点。你可以直接双击文本内容如text欢迎来到首页/text中的“欢迎来到首页”进行修改回车后立即生效无需保存文件。这是快速原型设计的利器。Network 面板监控资源加载切换到“Network”标签页刷新页面你会看到所有资源的加载瀑布图。banner1.jpg的Size应显示为102KB模板大小Time应小于100ms。如果某张图显示Failed右键 → “在资源管理器中显示”检查路径是否拼写错误如baner1.jpg少了个n。Storage 面板查看本地数据在logs页面点击几次“添加日志”按钮后切换到“Storage”标签页 → “Local Storage”你会看到logs键对应的值是一个 JSON 数组。这证实了wx.setStorageSync的数据持久化能力。5. 常见问题与排查技巧实录那些没人告诉你的“坑”5.1 图片不显示先查这三处问题现象最可能原因排查步骤解决方案模拟器显示“图片加载失败”路径错误最常见在index.wxml中右键image→ “审查元素”看src属性值是否为/pages/index/images/banner1.jpg检查pages/index/images/目录下是否存在该文件确保路径以/开头文件名完全一致区分大小写文件确实存在图片显示为灰色方块尺寸过大或格式错误在 Network 面板查看该图片请求Status是否为200Size是否异常大500KB用图片压缩工具重制确保 JPG/PNG 格式尺寸合规大小 200KB真机预览白屏仅显示标题栏图片路径在真机上解析失败在真机上打开“调试” → “打开调试”查看 Console 日志是否有Failed to load resource真机路径解析更严格务必使用绝对路径/pages/xxx/images/xxx.jpg禁用../或./5.2 页面跳转失败生命周期陷阱揭秘新手常写的代码// index.js goToLogs() { wx.navigateTo({ url: /pages/logs/logs }); console.log(跳转后执行); }你以为console.log会在跳转后执行但实际它会在跳转发起后、页面切换动画完成前就打印。这是因为wx.navigateTo是异步 API它只是向微信引擎发送了一个“请切换页面”的指令自身立刻返回不等待页面渲染完成。真正的页面卸载onUnload和加载onLoad是后续由引擎调度的。更隐蔽的坑是onUnload的执行时机。如果你在index.js的onUnload里写了wx.removeStorageSync(tempData)本意是清理临时数据但若用户是从首页navigateTo到日志页再从日志页navigateBack返回首页index的onUnload不会触发因为navigateBack是页面栈回退首页实例并未销毁只是从栈底回到了栈顶。只有navigateTo或redirectTo才会销毁当前页面。这个细节决定了你的数据清理策略全局数据用globalData临时数据用wx.setStorageSync并在onHide页面进入后台时清理而非依赖onUnload。5.3 ESLint 报错“wx is not defined”配置缺失的典型表现这个报错几乎 100% 是因为.eslintrc.js中的globals配置缺失或拼写错误。打开你的.eslintrc.js检查globals对象是否包含wx: true。如果写成了WX: true大写或wx: false就会触发此错误。另一个可能是开发者工具未启用 ESLint点击右上角“详情” → “本地设置” → 确保“ESLint 检查”已勾选。模板已预置正确配置但如果你手动修改过.eslintrc.js请务必核对这两处。5.4 真机调试白屏检查sitemap.json的隐形开关一个极其隐蔽的坑如果你的sitemap.json文件存在但内容为空{}或语法错误如多了一个逗号微信真机会在启动时直接白屏且控制台没有任何报错。这是因为真机环境对sitemap.json的解析是强校验的一旦失败整个小程序加载流程中断。解决方案很简单在真机调试前先在开发者工具中打开sitemap.json确保其内容是合法的 JSON可用在线 JSON 校验工具验证且至少包含一个rules数组。模板的默认内容是安全的但如果你曾手动编辑过它请务必复查。6. 后续扩展建议从模板出发走向真实项目这个模板的终极价值不在于它能做什么而在于它为你搭建了一条通往真实项目的清晰路径。当你已经能熟练修改 banner、添加页面、读懂生命周期日志后下一步可以自然延伸接入云开发在app.js的onLaunch中加入wx.cloud.init({ env: your-env-id })然后在index.js的onLoad里调用wx.cloud.database().collection(news).get()把静态卡片数据换成云端动态拉取。云开发免去了服务器部署是小程序最平滑的后端接入方式。引入 UI 组件库下载 WeUI 或 Vant Weapp将dist/目录复制到项目根目录然后在index.json中添加usingComponents: { van-button: /dist/button/index }接着在index.wxml中van-button typeprimary主要按钮/van-button。组件库能极大提升界面专业度而模板的纯净结构让组件集成毫无阻力。增加登录态管理在app.js的onLaunch中调用wx.login()获取 code再通过wx.request发送到你的后端换取 openid 和 session_key将用户信息存入globalData和wx.setStorageSync在每个需要登录的页面onLoad中检查getApp().globalData.userInfo是否存在不存在则跳转登录页。这一步就把模板升级成了一个有用户体系的真实应用。我个人在带新人时总会让他们先在这个模板上花两个小时不写新功能只做三件事——改十次 banner 图片、加五个不同名字的新页面、把所有console.log替换成wx.showToast。做完之后他们对小程序的敬畏感消失了取而代之的是一种“哦原来就这么回事”的笃定。这种笃定比任何框架文档都珍贵。它意味着你不再是一个被动接收指令的学习者而是一个能主动拆解、验证、重构的创造者。而这正是所有伟大项目的起点。本文还有配套的精品资源点击获取简介直接导入微信开发者工具就能跑起来的小程序基础模板包含项目配置project.config.、app.、sitemap.、全局逻辑app.js、util.js、样式文件app.wxss和ESLint规范.eslintrc.js。页面结构按官方推荐组织含首页index和日志页logs每个页面都配齐WXML、WXSS、JS三件套。静态资源已提前准备好banner1.jpg顶部横幅、card1.jpg卡片图、logo.png应用图标、menu1.png菜单图标、topic1.jpg背景图全部放在对应pages子目录的images文件夹里命名清晰、尺寸合规、可一键替换。不需要额外装依赖或改路径打开就能看生命周期执行顺序、页面跳转效果、本地图片引用方式适合刚接触小程序开发的人边运行边理解目录结构和基础机制。本文还有配套的精品资源点击获取