小程序简介
小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验。
小程序技术发展史
WeixinJSBridge.invoke('imagePreview', { 2. current: 'http://inews.gtimg.com/newsapp_bt/0/1693121381/641', 3. urls: [ // 所有图片的URL列表,数组格式 4. 'https://img1.gtimg.com/10/1048/104857/10485731_980x1200_0.jpg', 5. 'https://img1.gtimg.com/10/1048/104857/10485726_980x1200_0.jpg', 6. 'https://img1.gtimg.com/10/1048/104857/10485729_980x1200_0.jpg' 7. ] 8. }, function(res) { 9. console.log(res.err_msg) 10. })
代码1-1是一个调用微信原生组件浏览图片的JS API,相比于额外引入一个JS图片预览组件库,这种调用方式显得非
常简洁和高效。
实际上,微信官方是没有对外暴露过如此调用的,此类 API 最初是提供给腾讯内部一些业务使用,很多外部开发者
发现了之后,依葫芦画瓢地使用了,逐渐成为微信中网页的事实标准。2015年初,微信发布了一整套网页开发工具
包,称之为 JS-SDK,开放了拍摄、录音、语音识别、二维码、地图、支付、分享、卡券等几十个API。给所有的
Web 开发者打开了一扇全新的窗户,让所有开发者都可以使用到微信的原生能力,去完成一些之前做不到或者难以做
到的事情。
同样是调用原生的浏览图片,调用方式如代码清单1-2所示。
代码清单1-2 使用 JS-SDK 调用图片预览组件
wx.previewImage({ current: 'https://img1.gtimg.com/10/1048/104857/10485726_980x1200_0.jpg', urls: [ // 所有图片的URL列表,数组格式 'https://img1.gtimg.com/10/1048/104857/10485731_980x1200_0.jpg', 'https://img1.gtimg.com/10/1048/104857/10485726_980x1200_0.jpg', 'https://img1.gtimg.com/10/1048/104857/10485729_980x1200_0.jpg' ], success: function(res) { console.log(res) } })
起步
JS-SDK是对之前的 WeixinJSBridge 的一个包装,以及新能力的释放,并且由对内开放转为了对所有开发者开放,在很短的时间内获得了极大的关注。从数据监控来看,绝大部分在微信内传播的移动网页都使用到了相关的接口。
JS-SDK 解决了移动网页能力不足的问题,通过暴露微信的接口使得 Web 开发者能够拥有更多的能力,然而在更多的能力之外,JS-SDK 的模式并没有解决使用移动网页遇到的体验不良的问题。用户在访问网页的时候,在浏览器开始显示之前都会有一个白屏的过程,在移动端,受限于设备性能和网络速度,白屏会更加明显。我们团队把很多技术精力放置在如何帮助平台上的Web开发者解决这个问题。因此我们设计了一个 JS-SDK 的增强版本,其中有一个重要的功能,称之为“微信 Web 资源离线存储”。
以下文字引用自内部的文档(没有最终对外开放):
微信 Web 资源离线存储是面向 Web 开发者提供的基于微信内的 Web 加速方案。
通过使用微信离线存储,Web 开发者可借助微信提供的资源存储能力,直接从微信本地加载 Web 资源而不需要再从服务端拉取,从而减少网页加载时间,
为微信用户提供更优质的网页浏览体验。每个公众号下所有 Web App 累计最多可缓存 5M 的资源。
这个设计有点类似 HTML5 的 Application Cache,但在设计上规避了一些 Application Cache的不足。
在内部测试中,我们发现 离线存储 能够解决一些问题,但对于一些复杂的页面依然会有白屏问题,例如页面加载了
大量的 CSS 或者是 JavaScript 文件。除了白屏,影响 Web 体验的问题还有缺少操作的反馈,主要表现在两个方面:页面切换的生硬和点击的迟滞感。
微信面临的问题是如何设计一个比较好的系统,使得所有开发者在微信中都能获得比较好的体验。这个问题是之前的
JS-SDK 所处理不了的,需要一个全新的系统来完成,它需要使得所有的开发者都能做到:
- 快速的加载
- 更强大的能力
- 原生的体验
- 易用且安全的微信数据开放
- 高效和简单的开发
这就是小程序的由来。
小程序与普通网页开发的区别
小程序的主要开发语言是 JavaScript ,小程序的开发同普通的网页开发相比有很大的相似性。对于前端开发者而
言,从网页开发迁移到小程序的开发成本并不高,但是二者还是有些许区别的。
网页开发渲染线程和脚本线程是互斥的,这也是为什么长时间的脚本运行可能会导致页面失去响应,而在小程序中,
二者是分开的,分别运行在不同的线程中。网页开发者可以使用到各种浏览器暴露出来的 DOM API,进行 DOM 选中
和操作。而如上文所述,小程序的逻辑层和渲染层是分开的,逻辑层运行在 JSCore 中,并没有一个完整浏览器对
象,因而缺少相关的DOM API和BOM API。这一区别导致了前端开发非常熟悉的一些库,例如 jQuery、 Zepto
等,在小程序中是无法运行的。同时 JSCore 的环境同 NodeJS 环境也是不尽相同,所以一些 NPM 的包在小程序
中也是无法运行的。
网页开发者需要面对的环境是各式各样的浏览器,PC 端需要面对 IE、Chrome、QQ浏览器等,在移动端需要面对
小程序与普通网页开发的区别
起步
本文档使用 书栈网 · BookStack.CN 构建 - 62 -
Safari、Chrome以及 iOS、Android 系统中的各式 WebView 。而小程序开发过程中需要面对的是两大操作系统
iOS 和 Android 的微信客户端,以及用于辅助开发的小程序开发者工具,小程序中三大运行环境也是有所区别的,
运行环境逻辑层渲染层
iOS JavaScriptCore WKWebView
安卓 V8 chromium 定制内核
小程序开发者工具 NWJS Chrome WebView
网页开发者在开发网页的时候,只需要使用到浏览器,并且搭配上一些辅助工具或者编辑器即可。小程序的开发则有
所不同,需要经过申请小程序帐号、安装小程序开发者工具、配置项目等等过程方可完成。
小程序申请地址
https://mp.weixin.qq.com/wxopen/waregister?action=step1
小程序代码构成
在上一章中,我们通过开发者工具快速创建了一个 QuickStart 项目。你可以留意到这个项目里边生成了不同类型 的文件: json 后缀的 JSON 配置文件 wxml 后缀的 WXML 模板文件 wxss 后缀的 WXSS 样式文件 js 后缀的 JS 脚本逻辑文件 接下来我们分别看看这4种文件的作用。 JSON 是一种数据格式,并不是编程语言,在小程序中,JSON扮演的静态配置的角色。 我们可以看到在项目的根目录有一个 app.json 和 project.config.json ,此外在 pages/logs 目录下还有一 个 logs.json ,我们依次来说明一下它们的用途。 app.json 是当前小程序的全局配置,包括了小程序的所有页面路径、界面表现、网络超时时间、底部 tab 等。 QuickStart 项目里边的 app.json 配置内容如下: { "pages":[ "pages/index/index", "pages/logs/logs" ], "window":{ "backgroundTextStyle":"light", "navigationBarBackgroundColor": "#fff", "navigationBarTitleText": "Weixin", "navigationBarTextStyle":"black" } } 我们简单说一下这个配置各个项的含义: 1pages 字段 —— 用于描述当前小程序所有页面路径,这是为了让微信客户端知道当前你的小程序页面定义在哪 个目录。 window 字段 —— 定义小程序所有页面的顶部背景颜色,文字颜色定义等。 其他配置项细节可以参考文档 小程序的配置 app.json 。 小程序代码构成 JSON 配置 小程序配置 app.json 工具配置 project.config.json 小程序代码构成 本文档使用 书栈网 · BookStack.CN 构建 - 68 - 通常大家在使用一个工具的时候,都会针对各自喜好做一些个性化配置,例如界面颜色、编译配置等等,当你换了另 外一台电脑重新安装工具的时候,你还要重新配置。 考虑到这点,小程序开发者工具在每个项目的根目录都会生成一个 project.config.json ,你在工具上做的任何配置 都会写入到这个文件,当你重新安装工具或者换电脑工作时,你只要载入同一个项目的代码包,开发者工具就自动会 帮你恢复到当时你开发项目时的个性化配置,其中会包括编辑器的颜色、代码上传时自动压缩等等一系列选项。 其他配置项细节可以参考文档 开发者工具的配置 。 这里的 page.json 其实用来表示 pages/logs 目录下的 logs.json 这类和小程序页面相关的配置。 如果你整个小程序的风格是蓝色调,那么你可以在 app.json 里边声明顶部颜色是蓝色即可。实际情况可能不是这 样,可能你小程序里边的每个页面都有不一样的色调来区分不同功能模块,因此我们提供了 page.json ,让开发者 可以独立定义每个页面的一些属性,例如刚刚说的顶部颜色、是否允许下拉刷新等等。 其他配置项细节可以参考文档 页面配置 。 这里说一下小程序里JSON配置的一些注意事项。 JSON文件都是被包裹在一个大括号中 {},通过key-value的方式来表达数据。JSON的Key必须包裹在一个双引号 中,在实践中,编写 JSON 的时候,忘了给 Key 值加双引号或者是把双引号写成单引号是常见错误。 JSON的值只能是以下几种数据格式,其他任何格式都会触发报错,例如 JavaScript 中的 undefined。 数字,包含浮点数和整数 字符串,需要包裹在双引号中 Bool值,true 或者 false 数组,需要包裹在方括号中 [] 对象,需要包裹在大括号中 {} 还需要注意的是 JSON 文件中无法使用注释,试图添加注释将会引发报错。 从事过网页编程的人知道,网页编程采用的是 HTML + CSS + JS 这样的组合,其中 HTML 是用来描述当前这个页面的结构, CSS 用来描述页面的样子, JS 通常是用来处理这个页面和用户的交互。 同样道理,在小程序中也有同样的角色,其中 WXML 充当的就是类似 HTML 的角色。打开 pages/index/index.wxml ,你会看到以下的内容: <view class="container"> <view class="userinfo"> <button wx:if="{{!hasUserInfo && canIUse}}"> 获取头像昵称 </button> <block wx:else> 页面配置 page.json JSON 语法 WXML 模板 小程序代码构成 本文档使用 书栈网 · BookStack.CN 构建 - 69 - <image src="{{userInfo.avatarUrl}}" background-size="cover"></image> <text class="userinfo-nickname">{{userInfo.nickName}}</text> </block> </view> <view class="usermotto"> <text class="user-motto">{{motto}}</text> </view> </view> 和 HTML 非常相似, WXML 由标签、属性等等构成。但是也有很多不一样的地方,我们来一一阐述一下: 标签名字有点不一样 往往写 HTML 的时候,经常会用到的标签是 div , p , span ,开发者在写一个页面的时候可以根据 这些基础的标签组合出不一样的组件,例如日历、弹窗等等。换个思路,既然大家都需要这些组件,为什么我们 不能把这些常用的组件包装起来,大大提高我们的开发效率。 从上边的例子可以看到,小程序的 WXML 用的标签是 view , button , text 等等,这些标签就是 小程序给开发者包装好的基本能力,我们还提供了地图、视频、音频等等组件能力。 更多详细的组件讲述参考下个章节 小程序的能力 多了一些 wx:if 这样的属性以及 {{ }} 这样的表达式 在网页的一般开发流程中,我们通常会通过 JS 操作 DOM (对应 HTML 的描述产生的树),以引起界 面的一些变化响应用户的行为。例如,用户点击某个按钮的时候, JS 会记录一些状态到 JS 变量里边, 同时通过 DOM API 操控 DOM 的属性或者行为,进而引起界面一些变化。当项目越来越大的时候,你的 代码会充斥着非常多的界面交互逻辑和程序的各种状态变量,显然这不是一个很好的开发模式,因此就有了 MVVM 的开发模式(例如 React, Vue),提倡把渲染和逻辑分离。简单来说就是不要再让 JS 直接操控 DOM , JS 只需要管理状态即可,然后再通过一种模板语法来描述状态和界面结构的关系即可。 小程序的框架也是用到了这个思路,如果你需要把一个 Hello World 的字符串显示在界面上。 WXML 是这么写 : <text>{{msg}}</text> JS 只需要管理状态即可: this.setData({ msg: "Hello World" }) 通过 {{ }} 的语法把一个变量绑定到界面上,我们称为数据绑定。仅仅通过数据绑定还不够完整的描述状态 和界面的关系,还需要 if / else , for 等控制能力,在小程序里边,这些控制能力都用 wx: 开头 的属性来表达。 更详细的文档可以参考 WXML WXSS 样式 小程序代码构成 本文档使用 书栈网 · BookStack.CN 构建 - 70 - WXSS 具有 CSS 大部分的特性,小程序在 WXSS 也做了一些扩充和修改。 新增了尺寸单位。在写 CSS 样式时,开发者需要考虑到手机设备的屏幕会有不同的宽度和设备像素比,采 用一些技巧来换算一些像素单位。 WXSS 在底层支持新的尺寸单位 rpx ,开发者可以免去换算的烦恼, 只要交给小程序底层来换算即可,由于换算采用的浮点数运算,所以运算结果会和预期结果有一点点偏差。 提供了全局的样式和局部样式。和前边 app.json , page.json 的概念相同,你可以写一个 app.wxss 作为全局样式,会作用于当前小程序的所有页面,局部页面样式 page.wxss 仅对当前页面生效。 此外 WXSS 仅支持部分 CSS 选择器 更详细的文档可以参考 WXSS 。 一个服务仅仅只有界面展示是不够的,还需要和用户做交互:响应用户的点击、获取用户的位置等等。在小程序里 边,我们就通过编写 JS 脚本文件来处理用户的操作。 <view>{{ msg }}</view> <button bindtap="clickMe">点击我</button> 点击 button 按钮的时候,我们希望把界面上 msg 显示成 "Hello World" ,于是我们在 button 上声明 一个属性: bindtap ,在 JS 文件里边声明了 clickMe 方法来响应这次点击操作: Page({ clickMe: function() { this.setData({ msg: "Hello World" }) } }) 响应用户的操作就是这么简单,更详细的事件可以参考文档 WXML - 事件 。 此外你还可以在 JS 中调用小程序提供的丰富的 API,利用这些 API 可以很方便的调起微信提供的能力,例如获取 用户信息、本地存储、微信支付等。在前边的 QuickStart 例子中,在 pages/index/index.js 就调用了 wx.getUserInfo 获取微信用户的头像和昵称,最后通过 setData 把获取到的信息显示到界面上。更多 API 可以参考文档 小程序的API 。 通过这个章节,你了解了小程序涉及到的文件类型以及对应的角色,在下个章节中,我们把这一章所涉及到的文件通 过 “小程序的框架” 给 “串” 起来,让他们都工作起来。
介绍一下JavaScript
除了前端开发,JavaScript还可以用于后端开发,例如使用Node.js技术进行服务器端编程。同时,JavaScript也是一门学习曲线较为平缓的语言,让初学者能够快速入门,并逐渐深入掌握。
下面是一个简单的JavaScript代码示例,实现了一个基本的计算器功能:
// 计算两个数之和 function add(num1, num2) { return num1 + num2; } // 计算两个数之差 function subtract(num1, num2) { return num1 - num2; } // 计算两个数之积 function multiply(num1, num2) { return num1 * num2; } // 计算两个数之商 function divide(num1, num2) { if (num2 === 0) { return '除数不能为0'; } else { return num1 / num2; } } // 测试函数 console.log(add(1, 2)); // 输出3 console.log(subtract(5, 3)); // 输出2 console.log(multiply(4, 5)); // 输出20 console.log(divide(6, 2)); // 输出3 console.log(divide(6, 0)); // 输出除数不能为0
该代码示例定义了四个函数,分别实现了加法、减法、乘法和除法运算,并通过console.log方法输出了这些函数的计算结果。你可以根据自己的需求来修改和扩展这个示例。
JavaScript语言也具有以下特点:
动态性:JavaScript是一种解释型语言,可以在运行时动态地改变变量和函数的值。
弱类型:JavaScript中的变量不需要在声明时指定数据类型,而是在运行时根据赋值自动推断类型。
事件驱动:JavaScript是一种事件驱动的语言,能够对用户交互事件进行响应。
面向对象:JavaScript支持面向对象编程,可以使用类、对象、继承等概念来组织代码。
安全性:由于JavaScript通常在浏览器端执行,所以需要考虑安全问题。为了防止跨站脚本攻击(XSS),开发者需要注意输入输出数据的过滤和校验。
JavaScript是一种非常灵活、易学易用的脚本语言,被广泛应用于Web前端开发、后端开发、移动端开发等领域。
JavaScript是微信小程序的开发语言之一,其他还包括WXML和WXSS。在微信小程序中,JavaScript主要用于实现页面逻辑和交互效果,而WXML和WXSS则用于页面结构和样式的设计。
微信小程序提供了一些内置API,开发者可以通过JavaScript调用这些API来实现各种功能,例如获取用户信息、发送网络请求、操作本地存储等。同时,微信小程序也支持第三方组件库和框架,如WeUI、vant等,以便开发者更加便捷地实现功能和美化页面。
对于前端开发者来说,学习JavaScript是非常必要的,因为这是实现微信小程序页面交互和动态效果的必备技能。如果你已经熟练掌握了JavaScript,那么就可以开始进入微信小程序的开发学习了。微信小程序提供了完善的文档和教程,帮助开发者快速掌握开发技巧和注意事项。
如何开始制作微信小程序:
制作微信小程序需要以下几个步骤:
注册小程序账号:在微信公众平台注册一个小程序账号,并进行实名认证,以获得发布小程序的权限。
下载开发工具:下载微信官方提供的小程序开发工具,该工具包含了代码编辑器、调试器、模拟器等多个功能模块。
创建小程序项目:在开发工具中创建一个新的小程序项目,并设置小程序的基本信息,如小程序名称、appid、页面路径等。
编写代码:通过使用WXML、WXSS和JavaScript语言编写小程序的页面结构、样式和逻辑。
调试测试:在开发工具中进行实时调试和测试,确保小程序的正常运行和效果展示。
提交审核:完成小程序开发后,将代码打包上传至微信开放平台,并提交审核申请。
发布上线:当小程序审核通过后,即可发布上线,让用户使用和体验。
制作微信小程序需要一定的技术储备和开发经验,但是随着不断练习和学习,你将能够熟练掌握小程序的开发技巧和注意事项。同时,微信小程序社区也提供了丰富的资源和支持,帮助开发者更好地实现创意和功能。
微信小程序的界面设计需要考虑以下几个方面:
- 布局设计:选择合适的布局方式,使得小程序页面看起来简洁明了。一般采用Flex布局、Grid布局等方式进行设计。
- 颜色搭配:选择合适的颜色搭配方案,让小程序看起来美观而不失品牌特色。通常建议使用主题色和辅助色的搭配方式。
- 字体设计:选择适合的字体,大小和颜色,并在整体风格上保持一致性。字体大小应该根据页面内容的重要程度来设置。
- 图标与图片:选择合适的图标与图片,让小程序整体风格更加统一。可以使用IconFont等工具生成矢量图标。
- 交互设计:针对用户的操作行为,设计出相应的页面动效和过渡效果,增强用户体验。如按钮按下后出现颜色变化或是进入新页面时的平滑过渡效果。
- 突出重点:将最重要的信息放在突出位置,比如放大字体、使用醒目的颜色等方式来吸引用户注意力。
- 设计规范化:遵循微信小程序的设计规范和标准,如tabBar的位置、导航栏的设计等。
总之,微信小程序界面设计需要符合品牌特色、美观易用、规范简洁等要求,以提升用户体验和用户留存率。
下面是一个简单的微信小程序界面设计代码示例,包含一个页面和一个按钮:
// index.wxml <view class="container"> <image class="logo" src="../../images/logo.png"></image> <text class="title">欢迎使用我的小程序</text> <button class="btn" bindtap="onBtnClick">点击我</button> </view> // index.wxss .container { display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100vh; } .logo { width: 80px; height: 80px; margin-bottom: 20px; } .title { font-size: 24px; color: #333; margin-bottom: 20px; } .btn { width: 200px; height: 50px; background-color: #007aff; color: #fff; border-radius: 10px; text-align: center; line-height: 50px; } // index.js Page({ onBtnClick: function() { wx.showToast({ title: '按钮被点击了', icon: 'none' }) } })
该代码示例实现了一个简单的页面,包含一个logo、一个标题和一个按钮。采用Flex布局方式进行设计,通过CSS样式设置页面布局和元素样式,通过JavaScript代码实现按钮的点击事件,并在点击时弹出提示框。你可以根据自己的需求来修改和扩展这个示例。
如何开始制作微信小程序
制作微信小程序需要以下几个步骤:
- 注册小程序账号:在微信公众平台注册一个小程序账号,并进行实名认证,以获得发布小程序的权限。
- 下载开发工具:下载微信官方提供的小程序开发工具,该工具包含了代码编辑器、调试器、模拟器等多个功能模块。
- 创建小程序项目:在开发工具中创建一个新的小程序项目,并设置小程序的基本信息,如小程序名称、appid、页面路径等。
- 编写代码:通过使用WXML、WXSS和JavaScript语言编写小程序的页面结构、样式和逻辑。
- 调试测试:在开发工具中进行实时调试和测试,确保小程序的正常运行和效果展示。
- 提交审核:完成小程序开发后,将代码打包上传至微信开放平台,并提交审核申请。
- 发布上线:当小程序审核通过后,即可发布上线,让用户使用和体验。
总之,制作微信小程序需要一定的技术储备和开发经验,但是随着不断练习和学习,你将能够熟练掌握小程序的开发技巧和注意事项。同时,微信小程序社区也提供了丰富的资源和支持,帮助开发者更好地实现创意和功能。
小程序示例
以下是一个简单的小程序代码示例:
<!-- index.wxml --> <view class="container"> <view class="header">欢迎来到小程序</view> <view class="content"> <input placeholder="请输入您的姓名" bindinput="onNameInput"/> <button bindtap="onSubmit">提交</button> <view class="result">{{result}}</view> </view> </view>
// index.js Page({ data: { name: '', result: '' }, onNameInput: function(e) { this.setData({ name: e.detail.value }) }, onSubmit: function() { this.setData({ result: '您好,' + this.data.name }) } })
其中,index.wxml
文件是小程序的页面结构代码,index.js
文件是小程序的逻辑代码。在这个小程序中,用户输入自己的姓名后,点击提交按钮,就会在页面上显示一句问候语。
如何获取用户信息
获取用户信息分为两种方式:一种是通过button组件获取用户信息,一种是通过wx.getUserInfo()方法获取用户信息。
- 通过button组件获取用户信息
在wxml文件中添加一个button组件,通过bindgetuserinfo事件绑定一个处理函数,当用户点击button时触发该处理函数,将用户信息传递给处理函数。
<button wx:if="{{!userInfo}}" open-type="getUserInfo" bindgetuserinfo="getUserInfo">点击获取用户信息</button> <view wx:else> <image class="user-avatar" src="{{userInfo.avatarUrl}}" /> <text class="user-nickname">{{userInfo.nickName}}</text> </view>
在js文件中定义getUserInfo处理函数,将用户信息存储在页面数据中。
Page({ data: { userInfo: null }, getUserInfo: function(e) { this.setData({ userInfo: e.detail.userInfo }) } })
- 通过wx.getUserInfo()方法获取用户信息
使用wx.getUserInfo()方法可以在需要的时候获取用户信息,该方法返回一个Promise对象,在.then()函数中获取用户信息。
wx.getUserInfo({ success: function(res) { console.log(res.userInfo) } })
需要注意的是,从小程序基础库2.0.0开始,wx.getUserInfo()方法在第一次调用时弹出授权框,用户授权后才可获取用户信息。另外,用户信息中的敏感信息如手机号、邮箱等需要通过接口单独获取。