这篇教程从安装开发工具开始,完成一个简单的“待办清单”微信小程序。完成后,就能够掌握下面这些基本操作:
- 创建一个普通的 uni-app Vue 3 项目。
- 把项目运行到微信开发者工具。
- 使用
view、text、input、button等组件写页面。 - 使用 Vue 3 的响应式数据实现新增、完成和删除任务。
- 增加页面跳转、图片资源和本地数据保存。
- 生成微信小程序代码并上传到后台。
教程默认使用 Windows,开发工具使用 HBuilderX,目标平台是微信小程序。第一次接触小程序时,不建议一开始就上 CLI、状态管理、云开发和复杂组件库,先把项目创建、运行、修改、调试这条流程走通。
1. 先弄清楚 uni-app、微信小程序和 uni-app x
1.1 uni-app 是什么
uni-app 是一个使用 Vue 语法开发跨平台应用的框架。写一套页面代码,可以编译到微信小程序、支付宝小程序、H5、Android 和 iOS 等平台。
这篇教程只做微信小程序,但页面代码使用的是 uni-app 的组件和 API,不是原生微信小程序的 WXML 和 WXSS。
例如,在原生微信小程序中常见的是:
<view>你好</view>
在 uni-app 中同样使用:
<view>你好</view>
页面写法看起来相似,但项目结构、编译方式和 API 还是不同的。
1.2 普通 uni-app 和 uni-app x 不是一回事
新建项目时,选择的是普通的 uni-app,不要勾选 uni-app x。
简单区分:
| 项目类型 | 本教程是否使用 | 说明 |
|---|---|---|
uni-app |
是 | 适合本教程,使用 Vue 语法,支持编译到微信小程序 |
uni-app x |
否 | 是另一套跨平台开发方案,项目结构和 API 不完全相同 |
如果新建项目时选错,后面看到的目录和代码可能会和教程对不上。发现选成了 uni-app x,直接删掉项目重新创建一个普通 uni-app 项目更省事。
1.3 为什么选择 HBuilderX 创建项目
uni-app 有 HBuilderX 可视化创建和 CLI 命令行创建两条路。
本教程使用 HBuilderX,原因很简单:新手少配一些东西。官方文档说明,HBuilderX 可视化创建的 uni-app 项目可以直接使用内置环境,通常不需要先安装 Node.js;CLI 方式更适合已经习惯命令行和 npm 的开发者。
2. 安装需要的工具
2.1 安装 HBuilderX
下载地址:
Windows 下下载对应的压缩包,解压到一个简单的目录,例如:
D:\tools\HBuilderX
尽量不要放到 C:\Program Files 这种权限比较严格的目录,也不要放在路径很长或带特殊字符的目录中。
HBuilderX 页面一般会提供标准版和 App 开发版。只做微信小程序时,两者都可以开始使用;如果不确定,下载 App 开发版即可。标准版在第一次运行或发行 uni-app 时,可能会提示安装对应的 uni-app 插件,按提示安装就行。
解压后直接运行 HBuilderX.exe,不需要额外安装。
2.2 安装微信开发者工具
下载地址:
安装时使用默认选项即可。安装完成后先打开一次,确认工具可以正常启动,然后再关闭。
后面 HBuilderX 需要调用微信开发者工具。如果 HBuilderX 自动启动失败,也可以手动打开微信开发者工具,再把 HBuilderX 编译出来的目录导入进去。
2.3 准备微信小程序 AppID
如果只是练习页面,可以先按照 HBuilderX 和微信开发者工具当前版本提供的测试方式运行;如果工具要求填写 AppID,就先注册一个微信小程序并使用它的 AppID。不同版本的开发者工具入口可能会调整,以实际界面为准。
如果要上传、提交审核和正式发布,需要在微信公众平台注册小程序并取得有效的微信小程序 AppID:
这里有两个容易混淆的 ID:
| 名称 | 来源 | 用途 |
|---|---|---|
uni-app 的 appid |
DCloud 创建项目时分配 | uni-app 自己的应用标识,通常不要手动修改 |
| 微信小程序 AppID | 微信公众平台 | 编译、导入和发布微信小程序 |
不要把微信小程序 AppID 填到 manifest.json 顶部的 uni-app appid 里。微信 AppID 应该填写到 manifest.json 的微信小程序配置中。
3. 创建第一个 uni-app 项目
3.1 新建项目
打开 HBuilderX,依次点击:
文件 → 新建 → 项目
在项目类型中选择:
uni-app
注意不要选择 uni-app x。
填写下面这些内容:
| 项目项 | 示例 |
|---|---|
| 项目名称 | todo-miniapp |
| 项目位置 | D:\uni-projects |
| 模板 | 默认空项目或 Hello uni-app |
| Vue 版本 | 如果界面提供选择,选择 Vue 3 |
建议项目路径使用英文、数字和短横线,避免中文、空格和过长路径。点击创建后,HBuilderX 会生成项目文件。
3.2 项目目录
一个普通 uni-app 项目大致是这样的:
todo-miniapp/
├─ pages/
│ └─ index/
│ └─ index.vue 首页
├─ static/ 图片、字体等静态资源
├─ App.vue 应用级配置和全局样式
├─ main.js Vue 应用入口
├─ manifest.json 应用名称、平台配置、AppID 等
├─ pages.json 页面路由、导航栏、TabBar 配置
├─ uni.scss uni-app 全局样式变量
└─ unpackage/ 运行或发行时生成的编译结果
刚开始主要会修改这些文件:
pages/index/index.vue:首页页面代码。pages.json:页面注册和页面导航配置。manifest.json:应用和各个平台的配置。App.vue:全局样式和应用生命周期。static/:不需要经过编译处理的图片等资源。
unpackage 是编译结果,不是主要源码。它可以删除后重新生成,不要把业务代码直接写在里面。
4. 先把项目运行起来
4.1 配置微信开发者工具路径
第一次运行前,在 HBuilderX 中配置微信开发者工具路径:
工具 → 设置 → 运行配置 → 微信开发者工具路径
选择微信开发者工具的安装目录或可执行文件所在位置。不同 HBuilderX 版本的选择框文字可能略有区别,重点是找到“微信开发者工具路径”。
如果找不到安装位置,可以在 Windows 开始菜单中找到微信开发者工具,右键选择“打开文件所在的位置”。
4.2 运行到微信小程序
在 HBuilderX 中打开 todo-miniapp 项目,点击:
运行 → 运行到小程序模拟器 → 微信开发者工具
第一次运行时,HBuilderX 会先编译项目,再启动微信开发者工具。编译结果一般在:
todo-miniapp/unpackage/dist/dev/mp-weixin
如果弹出 AppID 配置框:
- 练习阶段,按当前微信开发者工具提供的测试方式选择。
- 有正式小程序时,填写微信公众平台申请到的 AppID。
4.3 HBuilderX 没有自动打开微信开发者工具
这是比较常见的问题,不代表项目编译失败。处理方法:
- 在 HBuilderX 的控制台中找到生成的项目路径。
- 打开微信开发者工具。
- 选择“导入项目”。
- 把项目目录填成:
项目根目录\unpackage\dist\dev\mp-weixin
- AppID 按实际情况选择或填写。
- 点击导入。
项目保持“运行到微信开发者工具”状态时,保存源码后 HBuilderX 会继续编译,微信开发者工具通常可以看到更新后的效果。如果页面没有刷新,先观察 HBuilderX 控制台是否已经完成编译,再在微信开发者工具中点击“编译”;仍未生效时,再从 HBuilderX 重新运行一次。
5. 做一个待办清单页面
5.1 替换首页代码
打开:
pages/index/index.vue
删除原来的内容,替换成下面的代码:
<template>
<view class="page">
<view class="header">
<text class="title">我的待办</text>
<text class="subtitle">把今天要做的事情记下来</text>
</view>
<view class="input-row">
<input
v-model="inputText"
class="todo-input"
placeholder="例如:学习 uni-app"
confirm-type="done"
@confirm="addTodo"
/>
<button class="add-button" type="primary" size="mini" @tap="addTodo">
添加
</button>
</view>
<view class="summary">
<text>共 {{ todos.length }} 项</text>
<text>未完成 {{ unfinishedCount }} 项</text>
</view>
<view v-if="todos.length === 0" class="empty">
<text class="empty-title">还没有待办事项</text>
<text class="empty-text">在上面输入一件要做的事情吧</text>
</view>
<view v-else class="todo-list">
<view v-for="todo in todos" :key="todo.id" class="todo-item">
<view
class="check"
:class="{ checked: todo.done }"
@tap="toggleTodo(todo)"
>
<text v-if="todo.done">✓</text>
</view>
<text class="todo-title" :class="{ done: todo.done }">
{{ todo.title }}
</text>
<text class="delete-button" @tap="removeTodo(todo.id)">删除</text>
</view>
</view>
<button
v-if="todos.length > unfinishedCount"
class="clear-button"
size="mini"
@tap="clearDone"
>
清除已完成
</button>
</view>
</template>
<script setup>
import { computed, ref } from 'vue'
const inputText = ref('')
const todos = ref([
{
id: 1,
title: '熟悉 uni-app 项目结构',
done: true,
},
{
id: 2,
title: '把项目运行到微信开发者工具',
done: false,
},
])
const unfinishedCount = computed(() => {
return todos.value.filter((todo) => !todo.done).length
})
function addTodo() {
const title = inputText.value.trim()
if (!title) {
uni.showToast({
title: '请输入待办事项',
icon: 'none',
})
return
}
todos.value.unshift({
id: Date.now(),
title,
done: false,
})
inputText.value = ''
}
function toggleTodo(todo) {
todo.done = !todo.done
}
function removeTodo(id) {
todos.value = todos.value.filter((todo) => todo.id !== id)
}
function clearDone() {
todos.value = todos.value.filter((todo) => !todo.done)
}
</script>
<style>
.page {
min-height: 100vh;
padding: 40rpx 32rpx;
box-sizing: border-box;
background-color: #f6f7fb;
}
.header {
margin-bottom: 32rpx;
}
.title {
display: block;
color: #1f2937;
font-size: 56rpx;
font-weight: 700;
}
.subtitle {
display: block;
margin-top: 12rpx;
color: #9ca3af;
font-size: 28rpx;
}
.input-row {
display: flex;
align-items: center;
}
.todo-input {
flex: 1;
height: 84rpx;
padding: 0 24rpx;
box-sizing: border-box;
border-radius: 16rpx;
background-color: #ffffff;
font-size: 30rpx;
}
.add-button {
margin: 0;
margin-left: 16rpx;
padding: 0 28rpx;
line-height: 84rpx;
border-radius: 16rpx;
}
.summary {
display: flex;
justify-content: space-between;
margin: 36rpx 4rpx 20rpx;
color: #6b7280;
font-size: 26rpx;
}
.todo-list {
overflow: hidden;
border-radius: 20rpx;
background-color: #ffffff;
}
.todo-item {
display: flex;
align-items: center;
min-height: 112rpx;
padding: 0 24rpx;
border-bottom: 1rpx solid #f0f0f0;
}
.todo-item:last-child {
border-bottom: 0;
}
.check {
display: flex;
flex-shrink: 0;
align-items: center;
justify-content: center;
width: 44rpx;
height: 44rpx;
margin-right: 20rpx;
border: 2rpx solid #cbd5e1;
border-radius: 50%;
color: #ffffff;
font-size: 28rpx;
}
.check.checked {
border-color: #4f46e5;
background-color: #4f46e5;
}
.todo-title {
flex: 1;
color: #374151;
font-size: 30rpx;
word-break: break-all;
}
.todo-title.done {
color: #9ca3af;
text-decoration: line-through;
}
.delete-button {
margin-left: 20rpx;
color: #ef4444;
font-size: 26rpx;
}
.empty {
display: flex;
flex-direction: column;
align-items: center;
padding: 140rpx 0;
}
.empty-title {
color: #6b7280;
font-size: 32rpx;
}
.empty-text {
margin-top: 16rpx;
color: #9ca3af;
font-size: 26rpx;
}
.clear-button {
margin-top: 32rpx;
color: #6b7280;
background-color: transparent;
font-size: 26rpx;
}
</style>
保存后回到微信开发者工具,应该能看到待办列表。
5.2 测试页面功能
按下面的顺序点一遍:
- 输入一件事情,点击“添加”。
- 在输入框中按键盘的完成按钮,也应该可以添加。
- 点击左侧圆圈,任务会变成完成状态。
- 点击“删除”,任务会从列表中消失。
- 添加几条任务并完成其中一条,点击“清除已完成”。
- 不输入内容直接点击“添加”,应该看到提示,不会产生空任务。
如果这些功能都能正常使用,说明项目创建、编译、事件绑定和页面更新已经跑通了。
6. 这段代码怎么理解
6.1 uni-app 页面为什么使用 view 和 text
uni-app 为了兼容不同平台,提供了一套跨端组件:
| 组件 | 用途 |
|---|---|
view |
通用容器,类似 HTML 中的 div |
text |
文本内容 |
image |
图片 |
input |
单行输入框 |
button |
按钮 |
scroll-view |
可滚动区域 |
navigator |
页面跳转链接 |
小程序端不要把 div、span、img 当成首选写法。它们属于 H5 的 HTML 标签,在小程序端可能出现兼容问题。做跨端页面时优先使用 uni-app 组件。
6.2 ref 和 computed
const inputText = ref('')
ref 用来创建会变化的数据。模板中可以直接写 inputText,在 JavaScript 中访问它的值时需要写 inputText.value。
const unfinishedCount = computed(() => {
return todos.value.filter((todo) => !todo.done).length
})
computed 用来根据已有数据计算出一个新值。只要 todos 变化,unfinishedCount 会自动重新计算。
6.3 v-model、v-if 和 v-for
输入框:
<input v-model="inputText" />
v-model 会把输入框内容和 inputText 绑定起来,输入框改变时,变量也会改变。
条件显示:
<view v-if="todos.length === 0">还没有待办事项</view>
当条件为真时显示这个节点。
循环列表:
<view v-for="todo in todos" :key="todo.id">
{{ todo.title }}
</view>
v-for 会把数组中的每一项渲染出来。:key 要使用稳定且唯一的值,列表更新时 Vue 才能正确识别每一项。
6.4 @tap 和 @confirm
<view @tap="toggleTodo(todo)">点击完成</view>
@tap 是小程序里常用的点击事件写法。
<input @confirm="addTodo" />
@confirm 会在用户点击键盘上的完成、搜索或确定按钮时触发。具体显示哪个按钮,由 confirm-type 决定。
6.5 为什么样式中大量使用 rpx
rpx 是小程序中常用的响应式尺寸单位,能根据不同屏幕宽度进行适配。普通页面布局优先使用 rpx,不要一开始就把所有尺寸写死成 px。
本文的目标平台是微信小程序,示例样式直接写在页面的 <style> 中。需要多个页面共用的样式,可以放在 App.vue 中;全局样式不要写得过多,以免不同页面或组件之间产生不必要的样式影响。
7. 让待办事项关闭后仍然保留
现在的列表只存在于内存中,关闭微信开发者工具或重新启动小程序后,数据会恢复成代码里的两条示例数据。
如果只保存一些简单设置,可以使用 uni-app 提供的本地存储 API。先修改脚本部分的导入:
import { computed, ref, watch } from 'vue'
然后把原来的 todos 替换成下面这段:
const storageKey = 'todo-list'
const savedTodos = uni.getStorageSync(storageKey)
const todos = ref(
Array.isArray(savedTodos)
? savedTodos
: [
{
id: 1,
title: '熟悉 uni-app 项目结构',
done: true,
},
{
id: 2,
title: '把项目运行到微信开发者工具',
done: false,
},
],
)
最后在 unfinishedCount 后面增加监听:
watch(
todos,
(value) => {
uni.setStorageSync(storageKey, value)
},
{ deep: true },
)
这里的 deep: true 很重要,因为我们修改的是数组里面某一项的 done 属性。没有深度监听时,勾选任务可能不会触发保存。
本地存储适合保存少量数据,例如用户设置、草稿和简单缓存。它不是数据库,也不会自动同步到服务器或其他设备。用户主动清理小程序数据、系统清理缓存等情况下,本地数据也可能丢失,因此重要业务数据仍应保存到服务端。
8. 添加一个“关于”页面
8.1 创建页面文件
在 pages 目录上点击右键,选择:
新建页面
页面路径填写:
pages/about/about
如果 HBuilderX 没有自动创建,也可以手动建立目录和文件:
pages/about/about.vue
写入:
<template>
<view class="page">
<text class="title">关于这个小程序</text>
<text class="text">这是一个用 uni-app 编写的练习项目。</text>
</view>
</template>
<style>
.page {
display: flex;
flex-direction: column;
padding: 48rpx 32rpx;
}
.title {
color: #1f2937;
font-size: 40rpx;
font-weight: 700;
}
.text {
margin-top: 24rpx;
color: #6b7280;
font-size: 28rpx;
}
</style>
8.2 在 pages.json 中注册页面
打开根目录下的 pages.json。如果原来是:
{
"pages": [
{
"path": "pages/index/index",
"style": {
"navigationBarTitleText": "我的待办"
}
}
]
}
就在 pages 数组中增加第二项:
{
"pages": [
{
"path": "pages/index/index",
"style": {
"navigationBarTitleText": "我的待办"
}
},
{
"path": "pages/about/about",
"style": {
"navigationBarTitleText": "关于"
}
}
]
}
注意第一项后面要有逗号,最后一项后面不要有逗号。JSON 不支持注释,也不能使用单引号。
8.3 从首页跳转到关于页
在首页的模板中加一个按钮:
<button size="mini" @tap="goToAbout">关于</button>
在 <script setup> 中增加:
function goToAbout() {
uni.navigateTo({
url: '/pages/about/about',
})
}
页面返回时使用:
uni.navigateBack()
pages.json 中排在第一位的页面是启动页。页面路径必须和实际文件路径一致,少一个字母都会跳转失败。
9. 配置小程序 AppID 和页面标题
9.1 用可视化界面配置
在 HBuilderX 中打开根目录的 manifest.json,优先使用可视化配置界面:
- 找到微信小程序相关配置。
- 填写微信公众平台提供的 AppID。
- 保存文件。
不同 HBuilderX 版本的界面布局可能会变化。如果找不到对应选项,可以切换到源码视图,查看 mp-weixin 配置节点。
9.2 源码配置示例
微信小程序配置大致位于 manifest.json 的 mp-weixin 节点:
{
"mp-weixin": {
"appid": "wx1234567890abcdef",
"setting": {
"urlCheck": false
}
}
}
上面的 AppID 只是示例,不能直接使用。urlCheck: false 适合本地开发阶段临时关闭合法域名校验,正式发布前要根据实际接口和安全要求处理,不能把它当成线上解决方案。
9.3 修改导航栏标题
页面标题在 pages.json 中配置:
{
"path": "pages/index/index",
"style": {
"navigationBarTitleText": "我的待办",
"navigationBarBackgroundColor": "#ffffff",
"navigationBarTextStyle": "black"
}
}
全局窗口配置也可以放在 pages.json 的 globalStyle 中:
{
"globalStyle": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "待办小程序",
"navigationBarBackgroundColor": "#ffffff",
"backgroundColor": "#f6f7fb"
}
}
10. 请求后端接口
真正的业务通常需要请求后端,例如获取商品列表、提交表单和登录。uni-app 使用 uni.request 发起请求:
uni.request({
url: 'https://api.example.com/todos',
method: 'GET',
success: (res) => {
console.log('接口返回:', res.data)
},
fail: (error) => {
console.error('请求失败:', error)
},
})
实际项目中也可以使用 await。这里要特别注意 Vue 2 和 Vue 3 的差异:在 uni-app Vue 3 项目中,如果没有传入 success、fail、complete 回调,支持 Promise 化的 API 会按正常的 Promise 方式工作——成功时返回响应结果,失败时进入 catch。本文使用 Vue 3,因此推荐这样写:
async function loadTodos() {
try {
const response = await uni.request({
url: 'https://api.example.com/todos',
method: 'GET',
})
console.log(response.data)
} catch (error) {
console.error('请求失败:', error)
uni.showToast({
title: '网络请求失败',
icon: 'none',
})
}
}
旧版 uni-app Vue 2 的部分 Promise 化 API 才常见 [error, response] 这种数组形式。不要把 Vue 2 的写法直接套到本文的 Vue 3 项目中。
微信小程序请求线上接口时,需要在微信公众平台配置合法域名,并使用 HTTPS。开发者工具里可以临时关闭“校验合法域名、web-view 业务域名、TLS 版本以及 HTTPS 证书”,但这只影响本地调试,不能替代线上配置。
不要把只适用于浏览器的 window、document、localStorage 和依赖 DOM 的 npm 包直接放进小程序代码。uni-app 官方文档也提醒,非 H5 平台不支持依赖 DOM 和 window 的模块。
11. 添加图片
把图片放到:
static/images/logo.png
在页面中使用:
<image class="logo" src="/static/images/logo.png" mode="aspectFit" />
对应样式:
.logo {
width: 160rpx;
height: 160rpx;
}
static 目录下的文件会被直接复制到编译结果中,路径通常以 /static/ 开头。图片找不到时,先检查文件名大小写和路径是否完全一致。
12. 调试时主要看哪里
12.1 HBuilderX 控制台
这里主要看编译错误,例如:
- Vue 模板标签没有闭合。
- JavaScript 语法错误。
pages.json格式错误。- 文件路径写错。
12.2 微信开发者工具控制台
这里主要看小程序运行时错误,例如:
- API 调用失败。
- 网络请求失败。
- 页面跳转路径错误。
- 合法域名校验失败。
12.3 页面更新没有生效
按下面的顺序处理:
- 保存当前文件。
- 在 HBuilderX 中重新运行到微信开发者工具。
- 在微信开发者工具中点击编译。
- 仍然不对时,关闭项目后重新导入
unpackage/dist/dev/mp-weixin。 - 最后再考虑删除
unpackage后重新运行。
不要直接修改 unpackage 里的文件。下一次编译会覆盖这些内容。
12.4 常见错误和处理办法
| 问题 | 处理方法 |
|---|---|
| 选不到 uni-app 项目 | 检查是否安装了 uni-app 插件,或重启 HBuilderX |
| HBuilderX 找不到微信开发者工具 | 在“工具 → 设置 → 运行配置”重新填写路径 |
| 页面白屏 | 看 HBuilderX 控制台和微信开发者工具 Console 的第一条报错 |
pages.json 报错 |
检查逗号、双引号和页面路径 |
| 图片显示不出来 | 检查图片是否在 static 目录、路径和大小写是否一致 |
| 请求接口失败 | 检查 HTTPS、合法域名和接口地址 |
uni.showToast 不显示 |
检查调用位置和参数,确认没有马上跳转或销毁页面 |
| 修改代码没有更新 | 重新运行项目或在微信开发者工具中点击编译 |
13. 发行微信小程序
本地运行使用的是 dev 目录,发布时要生成 build 目录,不能把开发目录直接当成正式发布包。
13.1 在 HBuilderX 中发行
先确认:
manifest.json中已经填写正确的微信小程序 AppID。- 页面、接口和图片都测试过。
- 没有把测试域名或临时配置当成正式配置。
然后在 HBuilderX 中点击:
发行 → 小程序-微信
发行完成后,代码会生成到:
项目根目录\unpackage\dist\build\mp-weixin
13.2 在微信开发者工具中上传
- 打开微信开发者工具。
- 导入
unpackage/dist/build/mp-weixin。 - 检查项目名称、AppID 和页面功能。
- 点击“上传”。
- 登录微信公众平台,选择对应版本提交审核。
- 审核通过后,再执行发布。
部分 HBuilderX 版本的发行界面还提供“自动上传微信平台”之类的能力,启用后可以减少手动导入和上传步骤。本文仍采用手动流程,因为更适合新手理解“生成代码 → 上传 → 提交审核 → 发布”这几个阶段。
上传只是把代码提交到后台,不等于用户已经能搜索到。还需要提交审核和发布,这几个步骤是分开的。
14. 常用操作和命令
14.1 HBuilderX 常用菜单
| 操作 | 菜单 |
|---|---|
| 新建项目 | 文件 → 新建 → 项目 |
| 运行到微信 | 运行 → 运行到小程序模拟器 → 微信开发者工具 |
| 运行到浏览器 | 运行 → 运行到浏览器 |
| 运行设置 | 工具 → 设置 → 运行配置 |
| 发行微信小程序 | 发行 → 小程序-微信 |
HBuilderX 官方文档中的运行快捷键是 Ctrl + R,发行快捷键是 Ctrl + U。如果快捷键和本机设置不一致,以菜单显示为准。
14.2 CLI 项目常用命令
如果以后改用 CLI 创建 Vue 3 / Vite 版 uni-app 项目,当前官方文档提供的创建方式如下。CLI 路线需要先安装 Node.js 和 npm:
# 创建 Vue 3 + JavaScript 项目
npx degit dcloudio/uni-preset-vue#vite todo-miniapp
# 进入项目
cd todo-miniapp
# 安装依赖
npm install
# 编译并监听微信小程序开发版本
npm run dev:mp-weixin
# 构建微信小程序正式版本
npm run build:mp-weixin
如果要创建 TypeScript 项目,可以把模板改为 dcloudio/uni-preset-vue#vite-ts。官方当前文档说明 Vue 3 / Vite CLI 工程需要较新的 Node.js 环境,因此实际使用时应以官方 CLI 快速上手页面列出的 Node.js 要求为准。
还要注意输出目录不同:HBuilderX 可视化创建的项目编译结果在 unpackage 目录,而 CLI 项目通常输出到 dist 目录。例如微信小程序开发版本通常位于 dist/dev/mp-weixin,构建版本位于 dist/build/mp-weixin。
这部分不是本教程的主路线。CLI 项目和 HBuilderX 可视化创建的项目在工程结构、编译器安装位置和升级方式上都不同。新手阶段不要在同一个项目里混用两套工程结构。
15. 接下来可以怎么扩展
待办清单做完以后,可以按照下面的顺序继续:
- 把任务保存到本地存储。
- 增加“全部、未完成、已完成”筛选。
- 增加编辑任务功能。
- 把列表拆成单独的子组件。
- 请求后端接口,实现多设备同步。
- 增加登录和用户信息。
- 使用
uni-ui组件库统一页面样式。 - 配置小程序分包,减少首次加载体积。
- 添加隐私协议、用户授权和正式发布配置。
每次只加一个功能,先运行确认,再继续修改。小程序开发中最常见的节奏就是:
修改源码 → 保存 → HBuilderX 编译 → 微信开发者工具预览 → 看控制台报错
private note
交流
文章暂不开放公开评论。如果你有想法、问题或建议,欢迎私下联系站长。
联系站长 →