微信小程序凭借其“无需下载、即用即走”的特性,已成为连接用户与服务的重要载体。理解其源码结构与开发逻辑,是构建高质量小程序应用的基础。本文旨在直接解析小程序开发的核心源码构成、关键文件与开发要点,帮助开启者建立清晰的认知框架。
一、源码基本结构
一个标准的小程序项目源码目录遵循微信官方定义的规范,主要由以下核心文件与目录构成:
项目根目录
`project.config.json`:项目配置文件。用于定义项目的AppID、项目设置、开启者工具配置等。不同开启者拉取代码后,可据此快速同步开发环境。
`app.js`:小程序应用逻辑入口文件。必须存在,用于注册小程序应用实例,定义全局生命周期函数、全局数据或方法。
`app.json`:小程序全局配置文件。必须存在,用于配置小程序的页面路径、窗口表现、网络超时时间、底部tab栏等全局属性。
`app.wxss`:小程序全局样式文件。非必须,但通常存在,用于定义整个小程序应用的公共样式,如字体、颜色等。
`pages/`:页面文件目录。核心目录,存放所有小程序的页面。
`utils/`:工具类文件目录。非必须,通常用于存放公共的JavaScript工具函数,如时间格式化、网络请求封装等。
`components/`:自定义组件目录。非必须,在需要复用UI模块时使用。
页面目录结构
`pages`目录下的每个子目录代表一个页面,例如 `pages/index/`。每个页面目录通常包含四个同名不同后缀的文件:
`.js` 文件:页面逻辑文件。编写页面的数据、生命周期函数、事件处理函数。
`.wxml` 文件:页面结构文件。基于组件化标签的模板文件,用于描述页面结构。
`.wxss` 文件:页面样式文件。用于定义该页面的样式,遵循CSS语法并有一些扩展。
`.json` 文件:页面配置文件。用于配置该页面的窗口表现,覆盖 `app.json` 中的部分设置。
二、核心文件源码详解
1. app.json 配置源码要点
此文件为JSON格式,无注释。主要节点包括:
`pages`:数组类型,必填。列出小程序所有页面路径,第一项为首页。开启者工具会据此自动创建页面目录。
`window`:对象类型。设置小程序状态栏、导航条、标题、窗口背景色。如 `"navigationBarTitleText": "首页"`。
`tabBar`:对象类型。设置底部或顶部tab栏的表现,包含 `list` 数组,定义每个tab的页面路径、图标、文字。
`networkTimeout`:对象类型。设置各类网络请求的超时时间。
`debug`:布尔类型。开启者工具中是否开启调试模式。
2. app.js 应用逻辑源码要点
此为JavaScript文件。核心是调用 `App` 函数注册应用。
参数为一个对象,可定义以下内容:
`onLaunch(options)`:生命周期函数,小程序初始化完成时触发。
`onShow(options)`:生命周期函数,小程序启动或从后台进入前台时触发。
`onHide`:生命周期函数,小程序从前台进入后台时触发。
`globalData`:对象类型,可定义全局共享数据。
自定义函数或数据:可在其他页面通过 `getApp` 方法获取应用实例后访问。
3. 页面 .js 文件源码要点
每个页面调用 `Page` 函数注册。
参数为一个对象,主要属性包括:
`data`:对象类型,页面的初始数据。在 `.wxml` 模板中通过双花括号 `{{}}` 绑定。
生命周期函数:如 `onLoad(options)`(页面加载)、`onShow`(页面显示)、`onReady`(页面初次渲染完成)、`onHide`(页面隐藏)、`onUnload`(页面卸载)。
事件处理函数:用户交互触发的函数,如 `onPullDownRefresh`(下拉刷新)、`onReachBottom`(上拉触底)、`onShareAppMessage`(用户点击右上角转发)。
自定义函数:页面逻辑函数。
`setData` 方法:关键方法,用于更新 `data` 中的数据并同步到视图层。是连接逻辑层与视图层的桥梁。
4. 页面 .wxml 模板源码要点
此为类似HTML的标签语言,但使用小程序自有组件。
数据绑定:使用双花括号 `{{}}` 将变量包裹,嵌入文本或组件属性中。如 `{{message}}`。
列表渲染:使用 `wx:for` 指令,基于数组循环渲染组件。需指定当前项变量名 `wx:for-item` 和下标变量名 `wx:for-index`,并用 `wx:key` 指定仅此标识符以提升性能。
条件渲染:使用 `wx:if`、`wx:elif`、`wx:else` 指令控制组件的显示与隐藏。
事件绑定:使用 `bind` 或 `catch` 前缀绑定事件,如 `bindtap`(点击事件)。值对应页面 `.js` 中定义的函数名。
模板引用:可使用 `` 定义模板,通过 `is` 属性使用,实现结构复用。
5. 页面 .wxss 样式源码要点
基本遵循CSS语法,并做了扩展。
尺寸单位:引入了 `rpx`(responsive pixel),可根据屏幕宽度自适应。规定屏幕宽为750rpx。
样式导入:使用 `@import` 语句可导入外部样式文件。
选择器:支持大部分CSS选择器,但更推荐使用类选择器。
全局样式与局部样式:页面样式会自动与 `app.wxss` 中的全局样式合并,同名规则下页面 `.wxss` 优先级更高。
6. 页面 .json 配置源码要点
用于覆盖 `app.json` 中 `window` 的配置,只能设置与窗口表现相关的属性,如该页面的导航栏标题、背景色等。不可设置 `pages`、`tabBar` 等全局配置。
三、自定义组件源码解析
为提高代码复用率,小程序支持自定义组件。组件源码结构与页面类似,包含 `.js`、`.wxml`、`.wxss`、`.json` 四个文件。
组件 `.json` 文件:必须设置 `"component": true`。
组件 `.js` 文件:使用 `Component` 构造函数注册,其属性包括:
`properties`:对象类型,定义组件的对外属性,即父组件传入的数据,相当于“参数”。
`data`:组件内部数据。
`methods`:组件的方法,包括事件处理函数。
`lifetimes`:对象类型,定义组件生命周期,如 `attached`(组件实例进入页面节点树)、`detached`(组件实例被从页面节点树移除)。
`observers`:对象类型,用于监听 `properties` 或 `data` 的变化。
在页面或其他组件中使用:需在使用方的 `.json` 文件中通过 `"usingComponents"` 字段声明组件标签名和路径,然后在 `.wxml` 中像普通标签一样使用,并通过属性传递数据。
四、数据通信与API调用
1. 数据流
应用级数据:存储在 `app.js` 的 `globalData` 中,通过 `getApp.globalData` 访问。
页面级数据:存储在页面 `.js` 的 `data` 中,通过 `this.setData` 更新并触发视图渲染。
组件级数据:组件内部的 `data` 和接收外部的 `properties`。
事件通信:子组件通过 `this.triggerEvent('自定义事件名', 数据对象)` 向父组件传递事件;父组件在子组件标签上通过 `bind:自定义事件名` 来监听并处理。
2. 网络请求
使用微信提供的 `wx.request` API。需在 `app.json` 中配置请求域名(正式环境)。开发中可开启工具“不校验合法域名”选项。建议在 `utils` 目录下封装统一的请求函数,管理基地址、超时、请求头等。
3. 本地存储
使用 `wx.setStorageSync`、`wx.getStorageSync` 等进行同步的本地数据缓存。异步API为 `wx.setStorage`、`wx.getStorage`。存储上限为10MB。
4. 路由跳转
使用 `wx.navigateTo`(保留当前页面,跳转新页面)、`wx.redirectTo`(关闭当前页面,跳转新页面)、`wx.switchTab`(跳转到tabBar页面)、`wx.navigateBack`(返回上一页面)等API实现页面导航。`wx.navigateTo` 至多允许10层页面栈。
五、开发调试与发布
1. 开启者工具
微信开启者工具是主要开发环境,提供代码编辑、实时预览、调试、真机扫码预览等功能。调试面板包含Console(控制台)、Sources(源码)、Network(网络)、Storage(存储)、AppData(应用数据)等标签页。
2. 真机调试
在开启者工具中点击“预览”生成二维码,用微信扫码可在真机上体验;点击“真机调试”可连接手机进行远程调试,查看日志与网络请求。
3. 代码上传与发布
开发完成后,在开启者工具中点击“上传”,填写版本号与项目备注,将代码提交到微信后台。随后登录微信公众平台小程序管理后台,在“版本管理”中提交审核,审核通过后即可发布上线。
六、核心开发原则与注意事项
1. 性能优化:
合理使用 `setData`,减少频率与数据量,避免一次性设置大量数据。
列表渲染务必指定 `wx:key`。
图片资源进行压缩,必要时使用网络图片而非本地图片以减少包体积。
及时清理不再使用的定时器 (`setInterval`, `setTimeout`) 和事件监听。
2. 代码组织:
保持 `pages` 目录结构清晰,可按功能模块划分子目录。
公共逻辑和工具函数提取到 `utils`。
可复用的UI模块封装成自定义组件,存放于 `components`。
3. 包体积控制:
整个小程序包体积不得超过20MB(主包或所有分包总和)。单个分包不得超过2MB。
通过分包加载机制优化初次启动速度,将某些独立功能页面配置为分包。
4. 兼容性:
注意基础库版本,某些API或组件特性需在特定基础库版本以上才支持,可使用条件编译或做兼容判断。
测试不同屏幕尺寸的显示效果,样式使用 `rpx` 增强适应性。