这篇教程从安装开发工具开始,完成一个简单的“待办清单”微信小程序。完成后,就能够掌握下面这些基本操作:

  • 创建一个普通的 uni-app Vue 3 项目。
  • 把项目运行到微信开发者工具。
  • 使用 viewtextinputbutton 等组件写页面。
  • 使用 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。

例如,在原生微信小程序中常见的是:

XML
<view>你好</view>

在 uni-app 中同样使用:

HTML
<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

下载地址:

HBuilderX 官方下载页面

Windows 下下载对应的压缩包,解压到一个简单的目录,例如:

Text
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,依次点击:

Text
文件 → 新建 → 项目

在项目类型中选择:

Text
uni-app

注意不要选择 uni-app x

填写下面这些内容:

项目项 示例
项目名称 todo-miniapp
项目位置 D:\uni-projects
模板 默认空项目或 Hello uni-app
Vue 版本 如果界面提供选择,选择 Vue 3

建议项目路径使用英文、数字和短横线,避免中文、空格和过长路径。点击创建后,HBuilderX 会生成项目文件。

3.2 项目目录

一个普通 uni-app 项目大致是这样的:

Text
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 中配置微信开发者工具路径:

Text
工具 → 设置 → 运行配置 → 微信开发者工具路径

选择微信开发者工具的安装目录或可执行文件所在位置。不同 HBuilderX 版本的选择框文字可能略有区别,重点是找到“微信开发者工具路径”。

如果找不到安装位置,可以在 Windows 开始菜单中找到微信开发者工具,右键选择“打开文件所在的位置”。

4.2 运行到微信小程序

在 HBuilderX 中打开 todo-miniapp 项目,点击:

Text
运行 → 运行到小程序模拟器 → 微信开发者工具

第一次运行时,HBuilderX 会先编译项目,再启动微信开发者工具。编译结果一般在:

Text
todo-miniapp/unpackage/dist/dev/mp-weixin

如果弹出 AppID 配置框:

  • 练习阶段,按当前微信开发者工具提供的测试方式选择。
  • 有正式小程序时,填写微信公众平台申请到的 AppID。

4.3 HBuilderX 没有自动打开微信开发者工具

这是比较常见的问题,不代表项目编译失败。处理方法:

  1. 在 HBuilderX 的控制台中找到生成的项目路径。
  2. 打开微信开发者工具。
  3. 选择“导入项目”。
  4. 把项目目录填成:
Text
项目根目录\unpackage\dist\dev\mp-weixin
  1. AppID 按实际情况选择或填写。
  2. 点击导入。

项目保持“运行到微信开发者工具”状态时,保存源码后 HBuilderX 会继续编译,微信开发者工具通常可以看到更新后的效果。如果页面没有刷新,先观察 HBuilderX 控制台是否已经完成编译,再在微信开发者工具中点击“编译”;仍未生效时,再从 HBuilderX 重新运行一次。

5. 做一个待办清单页面

5.1 替换首页代码

打开:

Text
pages/index/index.vue

删除原来的内容,替换成下面的代码:

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 测试页面功能

按下面的顺序点一遍:

  1. 输入一件事情,点击“添加”。
  2. 在输入框中按键盘的完成按钮,也应该可以添加。
  3. 点击左侧圆圈,任务会变成完成状态。
  4. 点击“删除”,任务会从列表中消失。
  5. 添加几条任务并完成其中一条,点击“清除已完成”。
  6. 不输入内容直接点击“添加”,应该看到提示,不会产生空任务。

如果这些功能都能正常使用,说明项目创建、编译、事件绑定和页面更新已经跑通了。

6. 这段代码怎么理解

6.1 uni-app 页面为什么使用 viewtext

uni-app 为了兼容不同平台,提供了一套跨端组件:

组件 用途
view 通用容器,类似 HTML 中的 div
text 文本内容
image 图片
input 单行输入框
button 按钮
scroll-view 可滚动区域
navigator 页面跳转链接

小程序端不要把 divspanimg 当成首选写法。它们属于 H5 的 HTML 标签,在小程序端可能出现兼容问题。做跨端页面时优先使用 uni-app 组件。

6.2 refcomputed

JavaScript
const inputText = ref('')

ref 用来创建会变化的数据。模板中可以直接写 inputText,在 JavaScript 中访问它的值时需要写 inputText.value

JavaScript
const unfinishedCount = computed(() => {
  return todos.value.filter((todo) => !todo.done).length
})

computed 用来根据已有数据计算出一个新值。只要 todos 变化,unfinishedCount 会自动重新计算。

6.3 v-modelv-ifv-for

输入框:

HTML
<input v-model="inputText" />

v-model 会把输入框内容和 inputText 绑定起来,输入框改变时,变量也会改变。

条件显示:

HTML
<view v-if="todos.length === 0">还没有待办事项</view>

当条件为真时显示这个节点。

循环列表:

HTML
<view v-for="todo in todos" :key="todo.id">
  {{ todo.title }}
</view>

v-for 会把数组中的每一项渲染出来。:key 要使用稳定且唯一的值,列表更新时 Vue 才能正确识别每一项。

6.4 @tap@confirm

HTML
<view @tap="toggleTodo(todo)">点击完成</view>

@tap 是小程序里常用的点击事件写法。

HTML
<input @confirm="addTodo" />

@confirm 会在用户点击键盘上的完成、搜索或确定按钮时触发。具体显示哪个按钮,由 confirm-type 决定。

6.5 为什么样式中大量使用 rpx

rpx 是小程序中常用的响应式尺寸单位,能根据不同屏幕宽度进行适配。普通页面布局优先使用 rpx,不要一开始就把所有尺寸写死成 px

本文的目标平台是微信小程序,示例样式直接写在页面的 <style> 中。需要多个页面共用的样式,可以放在 App.vue 中;全局样式不要写得过多,以免不同页面或组件之间产生不必要的样式影响。

7. 让待办事项关闭后仍然保留

现在的列表只存在于内存中,关闭微信开发者工具或重新启动小程序后,数据会恢复成代码里的两条示例数据。

如果只保存一些简单设置,可以使用 uni-app 提供的本地存储 API。先修改脚本部分的导入:

JavaScript
import { computed, ref, watch } from 'vue'

然后把原来的 todos 替换成下面这段:

JavaScript
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 后面增加监听:

JavaScript
watch(
  todos,
  (value) => {
    uni.setStorageSync(storageKey, value)
  },
  { deep: true },
)

这里的 deep: true 很重要,因为我们修改的是数组里面某一项的 done 属性。没有深度监听时,勾选任务可能不会触发保存。

本地存储适合保存少量数据,例如用户设置、草稿和简单缓存。它不是数据库,也不会自动同步到服务器或其他设备。用户主动清理小程序数据、系统清理缓存等情况下,本地数据也可能丢失,因此重要业务数据仍应保存到服务端。

8. 添加一个“关于”页面

8.1 创建页面文件

pages 目录上点击右键,选择:

Text
新建页面

页面路径填写:

Text
pages/about/about

如果 HBuilderX 没有自动创建,也可以手动建立目录和文件:

Text
pages/about/about.vue

写入:

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。如果原来是:

JSON
{
  "pages": [
    {
      "path": "pages/index/index",
      "style": {
        "navigationBarTitleText": "我的待办"
      }
    }
  ]
}

就在 pages 数组中增加第二项:

JSON
{
  "pages": [
    {
      "path": "pages/index/index",
      "style": {
        "navigationBarTitleText": "我的待办"
      }
    },
    {
      "path": "pages/about/about",
      "style": {
        "navigationBarTitleText": "关于"
      }
    }
  ]
}

注意第一项后面要有逗号,最后一项后面不要有逗号。JSON 不支持注释,也不能使用单引号。

8.3 从首页跳转到关于页

在首页的模板中加一个按钮:

HTML
<button size="mini" @tap="goToAbout">关于</button>

<script setup> 中增加:

JavaScript
function goToAbout() {
  uni.navigateTo({
    url: '/pages/about/about',
  })
}

页面返回时使用:

JavaScript
uni.navigateBack()

pages.json 中排在第一位的页面是启动页。页面路径必须和实际文件路径一致,少一个字母都会跳转失败。

9. 配置小程序 AppID 和页面标题

9.1 用可视化界面配置

在 HBuilderX 中打开根目录的 manifest.json,优先使用可视化配置界面:

  1. 找到微信小程序相关配置。
  2. 填写微信公众平台提供的 AppID。
  3. 保存文件。

不同 HBuilderX 版本的界面布局可能会变化。如果找不到对应选项,可以切换到源码视图,查看 mp-weixin 配置节点。

9.2 源码配置示例

微信小程序配置大致位于 manifest.jsonmp-weixin 节点:

JSON
{
  "mp-weixin": {
    "appid": "wx1234567890abcdef",
    "setting": {
      "urlCheck": false
    }
  }
}

上面的 AppID 只是示例,不能直接使用。urlCheck: false 适合本地开发阶段临时关闭合法域名校验,正式发布前要根据实际接口和安全要求处理,不能把它当成线上解决方案。

9.3 修改导航栏标题

页面标题在 pages.json 中配置:

JSON
{
  "path": "pages/index/index",
  "style": {
    "navigationBarTitleText": "我的待办",
    "navigationBarBackgroundColor": "#ffffff",
    "navigationBarTextStyle": "black"
  }
}

全局窗口配置也可以放在 pages.jsonglobalStyle 中:

JSON
{
  "globalStyle": {
    "navigationBarTextStyle": "black",
    "navigationBarTitleText": "待办小程序",
    "navigationBarBackgroundColor": "#ffffff",
    "backgroundColor": "#f6f7fb"
  }
}

10. 请求后端接口

真正的业务通常需要请求后端,例如获取商品列表、提交表单和登录。uni-app 使用 uni.request 发起请求:

JavaScript
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 项目中,如果没有传入 successfailcomplete 回调,支持 Promise 化的 API 会按正常的 Promise 方式工作——成功时返回响应结果,失败时进入 catch。本文使用 Vue 3,因此推荐这样写:

JavaScript
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 证书”,但这只影响本地调试,不能替代线上配置。

不要把只适用于浏览器的 windowdocumentlocalStorage 和依赖 DOM 的 npm 包直接放进小程序代码。uni-app 官方文档也提醒,非 H5 平台不支持依赖 DOM 和 window 的模块。

11. 添加图片

把图片放到:

Text
static/images/logo.png

在页面中使用:

HTML
<image class="logo" src="/static/images/logo.png" mode="aspectFit" />

对应样式:

CSS
.logo {
  width: 160rpx;
  height: 160rpx;
}

static 目录下的文件会被直接复制到编译结果中,路径通常以 /static/ 开头。图片找不到时,先检查文件名大小写和路径是否完全一致。

12. 调试时主要看哪里

12.1 HBuilderX 控制台

这里主要看编译错误,例如:

  • Vue 模板标签没有闭合。
  • JavaScript 语法错误。
  • pages.json 格式错误。
  • 文件路径写错。

12.2 微信开发者工具控制台

这里主要看小程序运行时错误,例如:

  • API 调用失败。
  • 网络请求失败。
  • 页面跳转路径错误。
  • 合法域名校验失败。

12.3 页面更新没有生效

按下面的顺序处理:

  1. 保存当前文件。
  2. 在 HBuilderX 中重新运行到微信开发者工具。
  3. 在微信开发者工具中点击编译。
  4. 仍然不对时,关闭项目后重新导入 unpackage/dist/dev/mp-weixin
  5. 最后再考虑删除 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 中点击:

Text
发行 → 小程序-微信

发行完成后,代码会生成到:

Text
项目根目录\unpackage\dist\build\mp-weixin

13.2 在微信开发者工具中上传

  1. 打开微信开发者工具。
  2. 导入 unpackage/dist/build/mp-weixin
  3. 检查项目名称、AppID 和页面功能。
  4. 点击“上传”。
  5. 登录微信公众平台,选择对应版本提交审核。
  6. 审核通过后,再执行发布。

部分 HBuilderX 版本的发行界面还提供“自动上传微信平台”之类的能力,启用后可以减少手动导入和上传步骤。本文仍采用手动流程,因为更适合新手理解“生成代码 → 上传 → 提交审核 → 发布”这几个阶段。

上传只是把代码提交到后台,不等于用户已经能搜索到。还需要提交审核和发布,这几个步骤是分开的。

14. 常用操作和命令

14.1 HBuilderX 常用菜单

操作 菜单
新建项目 文件 → 新建 → 项目
运行到微信 运行 → 运行到小程序模拟器 → 微信开发者工具
运行到浏览器 运行 → 运行到浏览器
运行设置 工具 → 设置 → 运行配置
发行微信小程序 发行 → 小程序-微信

HBuilderX 官方文档中的运行快捷键是 Ctrl + R,发行快捷键是 Ctrl + U。如果快捷键和本机设置不一致,以菜单显示为准。

14.2 CLI 项目常用命令

如果以后改用 CLI 创建 Vue 3 / Vite 版 uni-app 项目,当前官方文档提供的创建方式如下。CLI 路线需要先安装 Node.js 和 npm:

PowerShell
# 创建 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. 接下来可以怎么扩展

待办清单做完以后,可以按照下面的顺序继续:

  1. 把任务保存到本地存储。
  2. 增加“全部、未完成、已完成”筛选。
  3. 增加编辑任务功能。
  4. 把列表拆成单独的子组件。
  5. 请求后端接口,实现多设备同步。
  6. 增加登录和用户信息。
  7. 使用 uni-ui 组件库统一页面样式。
  8. 配置小程序分包,减少首次加载体积。
  9. 添加隐私协议、用户授权和正式发布配置。

每次只加一个功能,先运行确认,再继续修改。小程序开发中最常见的节奏就是:

Text
修改源码 → 保存 → HBuilderX 编译 → 微信开发者工具预览 → 看控制台报错

17. 参考资料

阅读进度 0%