本篇目标:从零开始搭建uniapp开发环境,创建第一个项目,理解基础概念
通过本篇教程,你将学会:
uniapp是一个使用Vue.js开发所有前端应用的框架,开发者编写一套代码,可发布到:
传统开发方式:
iOS App → Swift/Objective-C (3个月)
Android App → Java/Kotlin (3个月)
微信小程序 → 微信原生语法 (2个月)
Web应用 → Vue/React (2个月)
总计:10个月
uniapp开发方式:
一套Vue代码 → 自动编译到所有平台 (2个月)
效率提升:5倍方案 | 学习成本 | 性能 | 生态 | 维护性 | 推荐指数 |
|---|---|---|---|---|---|
uniapp | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
React Native | ⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
Flutter | ⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ |
Taro | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
在开始之前,请确保你的电脑满足以下要求:
HBuilderX是DCloud官方提供的uniapp开发IDE,专门为uniapp开发优化。
# 下载地址示例
Windows: HBuilderX.exe
macOS: HBuilderX.dmg
Linux: HBuilderX.tar.gz// 推荐的编辑器设置
{
"editor.tabSize": 2, // 缩进大小
"editor.insertSpaces": true, // 使用空格缩进
"editor.wordWrap": "on", // 自动换行
"editor.fontSize": 14, // 字体大小
"editor.fontFamily": "Consolas, 'Courier New', monospace"
}
微信开发者工具是调试和预览小程序必备的工具。
// 默认配置
{
"port": 9420, // 开发服务器端口
"autoOpenDevtools": true, // 自动打开调试工具
"compileType": "miniProgram" // 编译类型
}在HBuilderX中安装必要插件:
# 基础插件
- uni-app编译器 # uniapp项目编译
- 微信小程序支持 # 小程序开发支持
- App云打包 # App打包功能
- uni-ui # 官方UI组件库
# 开发效率插件
- Emmet # 快速编写HTML/CSS
- 代码格式化beautiful # 代码格式化
- Git插件 # 版本控制
- FTP/SFTP # 文件上传
# Windows用户添加到系统环境变量
HBUILDERX_HOME=C:\HBuilderX
PATH=%PATH%;%HBUILDERX_HOME%
# macOS/Linux用户添加到~/.bashrc或~/.zshrc
export HBUILDERX_HOME=/Applications/HBuilderX
export PATH=$PATH:$HBUILDERX_HOME// 项目配置示例
{
"项目名称": "chatgpt-miniprogram",
"项目目录": "D:/workspace/uniapp-projects",
"模板选择": "Hello uni-app",
"Vue版本": "Vue3",
"TypeScript": false // 初学者建议先用JavaScript
}创建成功后,你会看到以下目录结构:
chatgpt-miniprogram/
├── pages/ # 页面文件夹
│ ├── index/ # 首页模块
│ │ └── index.vue # 首页
│ ├── auth/ # 认证模块
│ │ └── auth.vue # 认证页面
│ └── chat/ # 聊天模块
│ └── chat.vue # 聊天页面
├── components/ # 组件文件夹
│ ├── common/ # 通用组件
│ └── chat/ # 聊天组件
├── utils/ # 工具类文件夹
│ ├── apiClient.js # API客户端
│ ├── authApi.js # 认证API
│ └── chatApi.js # 聊天API
├── store/ # 状态管理(如果使用Vuex)
│ ├── index.js # store入口
│ └── modules/ # 模块化store
├── styles/ # 样式文件夹
│ └── variables.scss # 样式变量
├── static/ # 静态资源
├── unpackage/ # 编译输出目录
├── App.vue # 应用配置
├── main.js # 项目入口
├── manifest.json # 应用配置
├── pages.json # 页面路由配置
├── uni.scss # 全局样式
└── package.json # 项目依赖让我们详细了解每个文件和文件夹的作用:
main.js - 项目入口文件
import App from './App'
// #ifndef VUE3
import Vue from 'vue'
Vue.config.productionTip = false
App.mpType = 'app'
const app = new Vue({
...App
})
app.$mount()
// #endif
// #ifdef VUE3
import { createSSRApp } from 'vue'
export function createApp() {
const app = createSSRApp(App)
return {
app
}
}
// #endifApp.vue - 应用根组件
<template>
<!-- 应用模板,通常为空 -->
</template>
<script>
export default {
onLaunch: function() {
console.log('App Launch') // 应用启动
},
onShow: function() {
console.log('App Show') // 应用展示
},
onHide: function() {
console.log('App Hide') // 应用隐藏
}
}
</script>
<style>
/* 全局样式 */
</style>pages.json - 页面路由配置
{
"pages": [
{
"path": "pages/index/index",
"style": {
"navigationBarTitleText": "首页"
}
}
],
"globalStyle": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "ChatGPT小程序",
"navigationBarBackgroundColor": "#F8F8F8",
"backgroundColor": "#F8F8F8"
}
}manifest.json - 应用配置清单
{
"name": "chatgpt-miniprogram",
"appid": "__UNI__XXXXXX",
"description": "仿ChatGPT的AI聊天小程序",
"versionName": "1.0.0",
"versionCode": "100",
"mp-weixin": {
"appid": "你的小程序AppID",
"setting": {
"urlCheck": false,
"es6": true,
"postcss": true,
"minified": true
}
}
}目录/文件 | 作用 | 是否必需 |
|---|---|---|
| 存放所有页面文件 | ✅ 必需 |
| 静态资源(图片、字体等) | ✅ 必需 |
| 自定义组件 | ❌ 可选 |
| 工具函数 | ❌ 可选 |
| 状态管理 | ❌ 可选 |
| 编译输出目录 | ✅ 自动生成 |
在uniapp中,每个页面都有完整的生命周期:
export default {
data() {
return {
title: 'Hello World'
}
},
// 页面生命周期
onLoad(options) {
// 页面加载时触发,只会调用一次
console.log('页面加载', options)
},
onShow() {
// 页面显示时触发
console.log('页面显示')
},
onReady() {
// 页面初次渲染完成时触发
console.log('页面渲染完成')
},
onHide() {
// 页面隐藏时触发
console.log('页面隐藏')
},
onUnload() {
// 页面卸载时触发
console.log('页面卸载')
},
// 下拉刷新
onPullDownRefresh() {
console.log('下拉刷新')
// 记得调用停止下拉刷新
uni.stopPullDownRefresh()
},
// 上拉加载
onReachBottom() {
console.log('触底加载')
}
}uniapp使用Vue的组件系统,同时提供了丰富的内置组件:
<template>
<view class="container">
<!-- view: 相当于HTML的div -->
<scroll-view scroll-y="true" class="scroll-area">
<!-- scroll-view: 可滚动视图 -->
<text>可滚动的内容</text>
</scroll-view>
<!-- swiper: 轮播图容器 -->
<swiper class="swiper" indicator-dots="true">
<swiper-item>
<view class="slide">轮播图1</view>
</swiper-item>
</swiper>
</view>
</template><template>
<view>
<!-- text: 文本组件 -->
<text class="title">这是标题</text>
<!-- rich-text: 富文本组件 -->
<rich-text :nodes="richContent"></rich-text>
<!-- progress: 进度条 -->
<progress percent="80" show-info="true" />
</view>
</template>
<script>
export default {
data() {
return {
richContent: '<p>这是<strong>富文本</strong>内容</p>'
}
}
}
</script>uniapp支持传统CSS和响应式单位:
<style lang="scss" scoped>
/* 响应式单位rpx:750rpx = 屏幕宽度 */
.container {
width: 750rpx; /* 占满屏幕宽度 */
height: 100vh; /* 占满屏幕高度 */
padding: 30rpx; /* 内边距 */
}
/* 传统CSS单位 */
.title {
font-size: 16px; /* 固定像素大小 */
line-height: 1.5; /* 行高倍数 */
}
/* SCSS变量和嵌套 */
$primary-color: #007aff;
.button {
background-color: $primary-color;
&:hover {
opacity: 0.8;
}
.icon {
margin-right: 10rpx;
}
}
/* 条件编译样式 */
/* #ifdef MP-WEIXIN */
.weixin-only {
display: block;
}
/* #endif */
/* #ifdef APP-PLUS */
.app-only {
display: none;
}
/* #endif */
</style>让我们创建一个简单的Hello World页面:
<!-- pages/index/index.vue -->
<template>
<view class="container">
<view class="header">
<image class="logo" src="/static/logo.png" mode="aspectFit" />
<text class="title">{{ title }}</text>
<text class="subtitle">欢迎来到ChatGPT小程序</text>
</view>
<view class="content">
<view class="card">
<text class="card-title">功能特色</text>
<view class="feature-list">
<view class="feature-item" v-for="(feature, index) in features" :key="index">
<text class="feature-icon">{{ feature.icon }}</text>
<text class="feature-text">{{ feature.text }}</text>
</view>
</view>
</view>
<button class="start-btn" type="primary" @click="startChat">
开始聊天
</button>
</view>
</view>
</template>
<script>
export default {
data() {
return {
title: 'Hello UniApp',
features: [
{ icon: '🤖', text: 'AI智能对话' },
{ icon: '📱', text: '小程序原生体验' },
{ icon: '⚡', text: '实时流式输出' },
{ icon: '🎯', text: '精准回答问题' }
]
}
},
onLoad() {
console.log('Hello World页面加载完成')
},
methods: {
startChat() {
// 显示提示信息
uni.showToast({
title: '即将跳转到聊天页面',
icon: 'success',
duration: 2000
})
// 2秒后跳转(下个教程会实现聊天页面)
setTimeout(() => {
console.log('跳转到聊天页面')
}, 2000)
}
}
}
</script>
<style lang="scss" scoped>
.container {
min-height: 100vh;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
padding: 60rpx 40rpx;
box-sizing: border-box;
}
.header {
text-align: center;
margin-bottom: 80rpx;
}
.logo {
width: 120rpx;
height: 120rpx;
margin-bottom: 30rpx;
border-radius: 20rpx;
}
.title {
display: block;
font-size: 48rpx;
font-weight: bold;
color: #ffffff;
margin-bottom: 20rpx;
}
.subtitle {
display: block;
font-size: 28rpx;
color: rgba(255, 255, 255, 0.8);
}
.content {
flex: 1;
}
.card {
background: #ffffff;
border-radius: 20rpx;
padding: 40rpx;
margin-bottom: 60rpx;
box-shadow: 0 8rpx 32rpx rgba(0, 0, 0, 0.1);
}
.card-title {
display: block;
font-size: 32rpx;
font-weight: bold;
color: #333333;
margin-bottom: 30rpx;
}
.feature-list {
display: flex;
flex-direction: column;
gap: 24rpx;
}
.feature-item {
display: flex;
align-items: center;
padding: 20rpx;
background: #f8f9fa;
border-radius: 12rpx;
}
.feature-icon {
font-size: 32rpx;
margin-right: 20rpx;
}
.feature-text {
font-size: 28rpx;
color: #666666;
}
.start-btn {
width: 100%;
height: 88rpx;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
border: none;
border-radius: 44rpx;
font-size: 32rpx;
color: #ffffff;
font-weight: bold;
}
</style>创建logo图片文件:
static/images/文件夹问题1:HBuilderX启动白屏
解决方案:
1. 检查系统权限,以管理员身份运行
2. 关闭杀毒软件的实时保护
3. 清除HBuilderX缓存文件
4. 重新下载最新版本问题2:微信开发者工具连接失败
解决方案:
1. 检查微信开发者工具是否开启服务端口
2. 在HBuilderX中重新配置微信开发者工具路径
3. 确保两个工具版本兼容问题3:项目创建失败
// 检查项目名称规范
const validProjectName = {
"允许": "字母、数字、下划线、中划线",
"不允许": "空格、特殊字符、中文",
"示例": "chatgpt-miniprogram ✅",
"错误示例": "ChatGPT 小程序 ❌"
}问题4:编译报错
常见编译错误:
1. 语法错误 → 检查Vue语法和JavaScript语法
2. 组件引用错误 → 检查组件路径和注册
3. 样式编译错误 → 检查SCSS语法
4. 图片路径错误 → 使用相对路径使用console.log调试
// 在不同生命周期中添加日志
export default {
onLoad() {
console.log('页面加载:', this.$mp)
},
methods: {
handleClick() {
console.log('按钮点击:', new Date())
}
}
}使用uni.showToast显示信息
methods: {
showDebugInfo() {
uni.showToast({
title: `当前页面: ${this.$mp.page.route}`,
icon: 'none',
duration: 3000
})
}
}在下一篇教程中,我们将:
请完成以下练习:
// 尝试实现以下样式效果
.gradient-card {
// 1. 渐变背景
// 2. 圆角边框
// 3. 阴影效果
// 4. 响应式布局
}官方文档
社区资源
学习建议
通过本篇教程,我们完成了:
✅ 环境搭建:HBuilderX + 微信开发者工具
✅ 项目创建:第一个uniapp项目
✅ 基础概念:页面生命周期、组件系统、样式系统
✅ 实战练习:Hello World页面开发
✅ 问题解决:常见问题的解决方案
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。