如何入门小程序开发?

  • 回答 (3)
  • 关注 (1)
  • 查看 (329)

求解小程序开发成本,适合用哪种机型,有没有Demo可以参考下?

济南庆典bwa济南庆典bwa修改于
十_年回答于

Hello World - 入门

在第一阶段,我们不需要了解小程序历史和技术细节,您只需要跟随我们完成基本的Hello World例子即可。

第一步

参考上一篇教程,下载微信开发者工具,并根据自己对应的操作系统进行安装。

第二步

打开微信开发者工具,选择新建小程序项目,我们先不需理解AppID的概念,新建项目时选择或使用测试号:小程序系统会给你分配测试账号,并取消勾选“建立普通快速启动模板”的选项,然后点击确定,如图。

1540957519915

第三步

在根目录下创建app.json,然后填入如下代码。

{

  "pages": ["pages/index/index"]

}

1540957691677

在根目录下新建pages目录,然后在pages目录下新建index目录,接着在index目录下创建index.wxml,然后填入以下代码。

<text>Hello World</text>

1540957824362

然后点击菜单栏的项目保存,系统会自动创建index.jsindex.jsonindex.wxss等目录文件,并进行编译,最终我们将看到小程序已经显示我们编写的代码Hello World文件。

1540957897352

恭喜你,已经你已经成功开发出你的第一个小程序啦!这时,你在尝试修改修改index.wxml中的hello world,然后保存,看看会发生什么?

1540958055009

Hello World - 小程序代码组成

在进阶实验前,我们先讲讲小程序的历史及上一步中配置文件的含义。

历史

从技术的维度看,小程序并非凭空冒出来的一个概念。2015年初,微信发布了一整套网页开发工具包,称之为 JS-SDK,开放了拍摄、语音识别、二维码等几十个API。给所有的 Web 开发者打开了一扇全新的窗户,让所有开发者都可以使用到微信的原生能力,去完成一些之前做不到或者难以做到的事情了。

但是在内部测试中,微信团队发现一些复杂的页面会有白屏的问题,例如页面加载了大量的 CSS 或者是 JavaScript 文件,这些文件的执行时间占用了大量的 UI 线程,除了白屏,影响 Web 体验的问题还有缺少操作的反馈,主要表现在页面切换的生硬和点击的迟滞感。微信面临的问题是如何设计一个比较好的系统,使得所有开发者在微信中都能获得比较好的体验。微信团队需要一个快速的加载、更强大的能力、原生的体验、易用且安全的微信数据开放、高效和简单的开发的系统,而这一系统就是本文中需要详细阐述的小程序。

配置文件含义

在上一步中,我们创建了一个app.json文件,还创建了一个index.wxml文件,系统还为我们创建了index.jsindex.jsonindex.wxss等目录文件,接下来,将为大家阐述着几个文件到底是干什么的。为了更直观的展现。我们还是以Hello world为例。

第一步 - json文件

打开刚才的开发工具编辑器,然后在根目录下找到app.json文件,双击打开代码,然后用下面的代码进行替换。

{
  "pages": [
    "pages/index/index",
    "pages/logs/logs"
  ],
  "window": {
    "backgroundTextStyle": "light",
    "navigationBarBackgroundColor": "#fff",
    "navigationBarTitleText": "WeChat",
    "navigationBarTextStyle": "black"
  }
}

1540961534435

我们看到,当前界面发生了很大的变化,标题栏由原来的黑色变为了白色,在头部多了一个名为WeChat的字符,然后,我们更改navigationBarTitleText内的字符,将WeChat改为自己想设定的字符,我这里改为你自己想设定的字符,然后将原本的navigationBarBackgroundColor内部的#fff改为#ddd,然后保存,看看会发生什么。

1540961900347

我们注意到,开发者工具刷新后,顶部的bar的文字由原来的Wechat变为了你自定义的字符,bar的颜色也发生了变化。

现在明白了吗?JSON文件在小程序代码中扮演静态配置的作用,在小程序运行之前就决定了小程序一些表现,需要注意的是小程序是无法在运行过程中去动态更新JSON 配置文件从而发生对应的变化的。

第二步 - wxml文件

打开入门中创建的index.wxml文件,使用下面的代码替换原有的代码。

<text>当前时间:{{time}}</text>

然后在打开系统创建的index.js文件,找到data: {}行,然后在大括号之间填入下面的代码,如图。

time: (new Date()).toString()

1540962579971

接着,我们按下保存键,看看会发生什么。

1540962612854

我们看到系统自动将{{time}}变成了当前的时间,那这里是如何实现的呢?原来,在小程序中,我们可以说使用JavaScript代码来通过Dom接口来完成界面的实时更新,WXML 通过 {{变量名}} 来绑定 WXML 文件和对应的 JavaScript 文件中的 data 对象属性。我们在index.js定义了当前时间的变量,然后通过WXML中的{{time}}去获取其中的变量。怎么样,大概明白WXML是干什么的了嘛?没明白?没事,我们进行在进行一个实验。

index.wxml文件中,添加下面的代码。

<view> {{a + b}} + {{c}} = d</view>
<view wx:if="{{c > 1}}"> True </view>

和刚才一样,在index.js内的data: {}行,插入以下代码。

time: (new Date()).toString(),
a: 1, b: 2, c:3

1540963650112

我们看到,系统已经将我们的abc变量通过逻辑运算并渲染出来,同时,我们使用wx:if来判断数字c的值是否大于1,如果大于这展示True字符。

现在,大概明白WXML是干嘛的了嘛?我们先用官方文档说明下,WXML 全称是 WeiXin Markup Language,是小程序框架设计的一套标签语言,结合小程序的基础组件、事件系统,可以构建出页面的结构。是不是有点看不懂,没关系,我这介绍下,WXML是一种类似HTML超文本标记语言,可以描述你小程序前端展示的长相,可以将你的代码转换为展示页面,后续配合WXSS及JavaScript脚本,可以写出非常漂亮的小程序。

第三步、wxss文件

现在,打开你的index.wxss文件,然后输入下面的代码。

/* pages/index/index.wxss */
.text-red{
  color: red
}
.text-blue{
  color: blue
}
.text-yellow{
  color: yellow
}

然后,打开index.wxml文件,使用下面的代码替换所有文件

<text class='text-red'>当前时间:{{time}}</text>
<view class='text-blue'> {{a + b}} + {{c}} = d</view>
<view class='text-yellow' wx:if="{{c > 1}}"> True </view>

保存后看看效果。

1540966942446

我们看到,原来显示为黑色的小程序的字变色为红色、蓝色、黄色。这里改变的颜色刚好与我们编辑index.wxss文件中指定的颜色相同。所以,你明白wxss文件是干什么的了嘛?对的,WXSS与Web开发中的CSS类似。为了更适合小程序开发,WXSS对CSS做了一些补充以及修改。WXSS(WeiXin Style Sheets)是一套用于小程序的样式语言,用于描述WXML的组件样式,也就是视觉上的效果。

第四步、js文件

js文件使用我们已经在第二步中体验过了,小程序的主要开发语言是 JavaScript ,开发者使用 JavaScript 来开发业务逻辑以及调用小程序的 API 来完成业务需求。但是,严格的意义上来说,小程序中 JavaScript 的同浏览器中的 JavaScript 以及 NodeJS 中的 JavaScript 是不相同的。

浏览器中的JavaScript 是由 ECMAScript 和 BOM(浏览器对象模型)以及 DOM(文档对象模型)组成的,Web前端开发者会很熟悉这两个对象模型,它使得开发者可以去操作浏览器的一些表现,比如修改URL、修改页面呈现、记录数据等等。

NodeJS中的JavaScript 是由 ECMAScript 和 NPM以及Native模块组成,NodeJS的开发者会非常熟悉 NPM 的包管理系统,通过各种拓展包来快速的实现一些功能,同时通过使用一些原生的模块例如 FS、HTTP、OS等等来拥有一些语言本身所不具有的能力。

小程序中的 JavaScript 是由ECMAScript 以及小程序框架和小程序 API 来实现的。同浏览器中的JavaScript 相比没有 BOM 以及 DOM 对象,所以类似 JQuery、Zepto这种浏览器类库是无法在小程序中运行起来的,同样的缺少 Native 模块和NPM包管理的机制,小程序中无法加载原生库,也无法直接使用大部分的 NPM 包。

明白了小程序中的 JavaScript 同浏览器以及NodeJS有所不同后,开发者还需要注意到另外一个问题,不同的平台的小程序的脚本执行环境也是有所区别的。

小程序目前可以运行在三大平台:

  • iOS平台,包括iOS9、iOS10、iOS11
  • Android平台
  • 小程序IDE

这种区别主要是体现三大平台实现的 ECMAScript 的标准有所不同。截止到当前一共有七个版本的ECMAScript 标准,目前开发者大部分使用的是 ECMAScript 5 和 ECMAScript 6 的标准,但是在小程序中, iOS9和iOS10 所使用的运行环境并没有完全的兼容到 ECMAScript 6 标准,一些 ECMAScript 6 中规定的语法和关键字是没有的或者同标准是有所不同的,所以一些开发者会发现有些代码在旧的手机操作系统上出现一些语法错误。为了帮助开发者解决这类问题,小程序IDE提供语法转码工具帮助开发者,将 ECMAScript 6代码转为 ECMAScript 5代码,从而在所有的环境都能得到很好的执行。开发者需要在项目设置中,勾选 ES6 转 ES5 开启此功能。

Hello World - 小程序的能力

在上一个步骤中,我们已经熟悉了小程序的组成及代码布局,这一步,我们将介绍小程序的部分能力,组件及API。和以前一样,我们通过Hello world来进行学习。

小程序的组件与API

我们打开小程序代码组成步骤中的index.wxml文件,然后在以前的代码中,加入下面的代码。

<camera device-position="front" flash="auto" binderror="error" style="width: 100%; height: 300px;"></camera>
<button type="primary" bindtap="takePhoto">拍照</button>
<view class='text-red'>预览</view>
<image mode="widthFix" src="{{src}}"></image>

然后打开index.js文件,在page({后面加入下述代码,如图。

	takePhoto() {
		const ctx = wx.createCameraContext()
		ctx.takePhoto({
			quality: 'high',
			success: (res) => {
				this.setData({
					src: res.tempImagePath
				})
			}
		})
	},
	error(e) {
		console.log(e.detail)
	}
})

1540969148552

然后,在你的根目录下创建一个名为app.js的文件,什么内容暂时都不要填写,保存。接下来,我们点击菜单栏的预览按钮,然后用手机扫描弹出的二维码,即可使用手机进行拍照,拍照弹出的照片将附在预览字符下方。

1540969494583

预览效果如图

我们看到,小程序已经能够正常拍照了。那么有同学有疑问了,这里的代码到底做了什么呢?接下来,我将对其解释。

组件

在上面的教程中,我们调用了下面这段代码。

<camera device-position="front" flash="auto" binderror="error" style="width: 100%; height: 300px;"></camera>
<button type="primary" bindtap="takePhoto">拍照</button>
<view class='text-red'>预览</view>
<image mode="widthFix" src="{{src}}"></image>

先不管其他内容,我们主要看看<camera ....... </camera>中间代码的含义。我们看到我们定义了device-positionflashbinderrorstyle这几个属性。那么这几个属性到底是什么意思呢?我们可以看看官方组件文档,找到camera组件,会看到如下表的信息。

属性名

类型

默认值

说明

最低版本

mode

String

normal

有效值为 normal, scanCode

2.1.0

device-position

String

back

前置或后置,值为front, back

flash

String

auto

闪光灯,值为auto, on, off

bindstop

EventHandle

摄像头在非正常终止时触发,如退出后台等情况

binderror

EventHandle

用户不允许使用摄像头时触发

bindscancode

EventHandle

在成功识别到一维码时触发,仅在 mode="scanCode" 时生效

2.1.0

我们看到,表中刚好有我们定义的device-positionflashbinderror这几个内容,原来device-position我们设置的front是选择前置摄像头还是后置摄像头,binderror是显示用户不允许使用摄像头会触发的事件。flash是当前选择是否打开闪光灯,这里我们设置的是auto也就是自动状态。style我们可以暂时不用在意,这里指的是上一步中wxss应该写的内容,我们只是写在了wxml文件中。

我们看到,组件是小程序的一个很重要的功能,组件是小程序的基本组成单元,为了让开发者可以快速进行开发,小程序的宿主环境提供了一系列基础组件。我们刚才使用的camera组件,就是官方提供调用系统底层相机的组件。代码中所展示的buttonviewimage都是一种组件。

限于篇幅,我们不在本文展开所有组件的属性说明,请在使用时前往官方文档进行查阅相关组件说明https://developers.weixin.qq.com/miniprogram/dev/component/

API

在上文中,我们其实已经调用了官方的api,不信?我们看看下面的代码。

takePhoto() {
		const ctx = wx.createCameraContext()
		ctx.takePhoto({
			quality: 'high',
			success: (res) => {
				this.setData({
					src: res.tempImagePath
				})
			}
		})
	},
	error(e) {
		console.log(e.detail)
	}
})

熟悉吧,这段代码中,我们已经调用了微信官方给出的wx.createCameraContext(),API文件。关于此API的详细使用,可以参考官方API文档

在这段代码中,我们首先使用const ctx = wx.createCameraContext()这段代码来将wx.createCameraContext()定义为ctx。然后使用ctx.takePhoto调用takePhoto方法进行拍照。关于takePhoto方法的使用,大家可以参考官方文档。我们在代码中定义了qualitysuccess这两个函数。文档中指出,quality指定的是成像质量,我们选择high高质量。success是回调函数,最终存放我们的照片文件。这里存放的是tempImagePath照片文件的临时路径。

然后,我们在index.wxmlbutton调用index.js中的takePhoto函数。然后在image中调用scr变量做展示。

小程序发布

为了保证小程序的质量,以及符合相关的规范,小程序的发布是需要经过审核的。建议先自行审核,自审完成之后,我们就可以对其进行上传啦。值得注意的是,如果你需要发布,请将这个小程序的AppID改为你在小程序管理页面注册的AppID,点击微信开发者工具的详情,然后修改AppID为你的AppID即可。

1540973253232

打开微信开发者工具,然就点击菜单栏的工具按钮,再点击上传按钮。

1540972890902

在新弹出的页面中,我们设置好版本号及项目备注。

1540972951445

然后点击上传即可。之后,请打开你微信公众平台小程序管理页面,对小程序进行审核发布。

1540973360470

之后的页面中,点击开发版本,然后再点击提交审核,审核通过后,你的小程序就可以上线了!

回答过的其他问题

如何检测Android应用程序何时在模拟器中运行?

     if(Debug.isDebuggerConnected() ) {
        // Things to do in debug environment...
    }

如何为laravel测试提供数据库迁移的种子?

如果您希望绕过Artisan的本机DatabaseMigrations和seeder / migration方法,这是一个替代解决方案。您可以创建自己的特征来为数据库设定种子: namespace App\Traits; use App\Models\User; use Ap...... 展开详请

为什么我的异步方法不等待“serialPort = await SerialDevice.FromIdAsync()”?

这是你的构造函数: public SerialController() { InitSerial(); } 它调用的InitSerial()方法有几个await。构造函数立即返回,而不执行所需的所有操作。然后你调用这些方法: serial.Write(); seria...... 展开详请

理解C中的fork()顺序

对fork()两者的调用都会启动一个新进程并继续执行旧进程。如果存在某种错误,则返回错误值。所有错误和唯一错误都是负数。这是第一个if块检查的内容。 在新进程中,fork()返回0.因此,递增v和递减的分支g仅在子进程中调用,而不是父进程。 在原始过程中,fork()函数返回子...... 展开详请

如何在Xaringan演示文稿中嵌入javascript?

需要<iframe>代码。转到polleverywhere的民意调查,然后点击“3. Present”>“分享”>“嵌入民意调查”。会有一个地方显示“将此代码段复制并粘贴到您的网页或博客中”。复制一个看起来像这样的代码: <iframe src="https://embed.p...... 展开详请

JavaScript:函数和类有什么区别?

已采纳
类和函数之间存在一些差异 - 大多数人会首先说类是“只是语法糖”,但糖确实很重要。当JS解析器处理JavaScript代码时,解析器会将它们保存在不同的AST节点中,如此处所示,ClassDeclaration和ClassExpression是生成的AST树中的不同节点类型: ...... 展开详请

关于作者

所属标签

扫码关注云+社区