快应用基础问题

掘金地址

https://juejin.im/post/5c21e2686fb9a049b41c7e1b

    说起快应用,大家的第一反应就是,什么是快应用? 一个陌生又新鲜的词汇。 让人忍不住想去知道它,了解它,进而使用它。

      快应用:是十大手机厂商基于硬件平台共同推出的新型应用生态。简单概括来说就是不用下载, 随点随用,却还能享受原生应用的性能体验。

       作为前端开发人员,时刻关注着前端的新型技术,了解行业动态,把握新的技术,才能时刻保持自己能走在技术的前沿。快应用的兴起,给安卓市场带来了巨大的改变。改变有很多方式,对于投资和开发的角度来讲,效果和投入产出比至关重要。九大厂商共建的快应用标准,最大的优势在于降低了开发者的开发和推广成本,有了这个标准,开发者可以做到一次性开发,各大手机厂商都能运行,极大地减少了开发成本。

       快应用的特征显而易见。使用的是我们前端技术开发,原生渲染,同时具备了HTML5 和 原生应用的双重优点,不用安装,点开使用,享受一样的体验。使得用户通过自己的手机更容易获取自己所需的服务。 不必存储,一键直达,更新直接推送。 更快更好的享受快应用所带来的快感和便捷。

     快应用现在的发展趋势迅速, 例如豆瓣评分,饿了么,时光时钟,王者荣耀盒子等都有快应用。你不需要去下载,也可以直接去搜索美食,不需要去下载也可以关注时间,不需要去下载, 你可以看到游戏盒子。 随随便便的搜一搜点一点, 你就能覆盖你生活的需求,满足你搜索的需要。这就是快应用所想给人带来的极致体验。

      作为开发者,除了跟大家分享快应用,我也希望能将我开发中的一些总结,一些问题的发现,一些bug的总结,跟大家进行分享。希望作为快应用的支持者,能在此和大家共同了解快应用,学习快应用,使用快应用。 能让快应用以更好的姿态融入到我们的生活当中。

关于快应用的大家进行分享详情可参照快应用官网https://doc.quickapp.cn/tutorial/ide/

1.1pc安装toolkit工具

1.1.1安装nodeJs

安装过程: nodejs.org/en/ node官方地址进行下载 。安装版本在6.0以上

安装后校验是否安装成功: node -v ,如果出现以下类似状态,则表示安装成功

1.1.2安装hap-toolkit

通过npm命令安装

命令: npm install -g hap-toolkit

安装后校验是否安装成功:

hap -V 【注意大写的 V】

1.2.手机安装调试器

调试器是一个Android应用程序

1.2.1快应用调试器

为了方便调试程序,您可以使用快应用调试器,这是一个Android应用程序,主要包含以下功能:

· 扫码安装:配置HTTP服务器地址,下载rpk包,并唤起平台运行rpk包

· 本地安装:选择手机文件系统中的rpk包,并唤起平台运行rpk包

· 在线更新:重新发送HTTP请求,更新rpk包,并唤起平台运行rpk包

· 开始调试:唤起平台运行rpk包,并启动远程调试工具

调试器可以使用后, 在调试器安装rpk包 。

快应用调试器可以连接到手机系统内的快应用执行环境(需要将系统升级到最新的正式版本),或者您可以单独下载安装快应用平台预览版来提供执行环境。

下载调试器 【点击 www.quickapp.cn/docCenter/p…】 点击下载调试器

下载调试器 名称是 quickapp_debugger.apk 。将apk 通过qq传送到自己的手机 。 直接下载安装即可。

1.2.2快应用预览版

当您的手机系统尚未内置快应用运行平台,或您想在开发过程中体验快应用尚未正式发布的新功能、新特性,您可以安装 快应用预览版。

下载版本目前有4个。分别是

快应用预览版v1030

快应用预览版v1020

快应用预览版v1010

快应用预览版v1000

下载名称 类似于 【quickapp_platform_preview_release_v1020.apk 】 也可以通过qq传送。 下载到本机,然后通过快应用调试器-选择本地安装进行安装。

rpk 安装 =》 如果是qq接收, 地址一般是 :本地安装 =》文件管理=》内部存储设备=》tencent(腾讯)=》QQfile_recv 找到下载的最新的文件 。(dist文件产出rpk包)

注意:如果需要安装低版本, 则需要先卸载之前的版本。

1.3创建项目

toolkit工具和调试器安装完成以后,开始创建项目

1.3.1建立项目模版

例如: hap init myproject

myproject 为 项目名称 , 也是项目根目录

myproject 则包含项目配置和示例初始代码。

结构如下:

· src:项目源文件夹

· sign:签名模块,当前仅有debug签名,如果内测上线,请添加release文件夹,增加线上签名;签名生成方法详见文档编译工具

· 

 

1.3.2 安装依赖

npm install

如果有报错 :Cannot find module '.../node_modules/hap-tools/webpack.config.js'

运行 hap update --force 执行后,不必再次执行 npm i

1.3.3编译项目

手动编译, 在根目录下, 例如myproject 下。 运行

npm run build

编译打包成功后,项目根目录下会生成文件夹:builddist

· build:临时产出,包含编译后的页面js,图片等

· dist:最终产出,包含rpk文件。其实是将build目录下的资源打包压缩为一个文件,后缀名为rpk,这个rpk文件就是项目编译后的最终产出

· 

自动编译项目(每次修改源代码文件后,都自动编译项目)

npm run watch

1.3.4启动http服务器

开启另一个窗口 , 比如cmd开启或者 vscode新增一个窗口, 输入

npm run server (推荐)

也可以自定义端口(如:8080)

npm run server -- -- port 8080

1.3.5手机上预览运行效果

1 打开调试器, 点击扫码安装。可以扫码 npm run server的二维码(输入终端窗口提示的二维码),也可以复制npm run server 出现的地址 (输入终端窗口提示的http服务器地址)到浏览器生成二维码并扫码。【推荐】

2打开调试器,点击右上角 menu ==》设置,输入终端窗口中http服务器地址

【注意】:如果提示安装失败, 首先检查npm run server 是否正常 。 然后检查是否在一个网段。pc和手机是一个网段。 不可以开启360wifi一类的。

试用场景: 预览或者低频率的更新rpk包。如果是长时间的浏览,可以直接将rpk qq发送到手机。 进行本地安装。rpk 安装 =》 如果是qq接收, 地址一般是 :本地安装 =》文件管理=》内部存储设备=》tencent(腾讯)=》QQfile_recv 找到下载的最新的文件 。(dist文件产出rpk包)

安装成功的预览效果:

总结 : 了解项目结构, 编译产生rpk , 运行通过调节器安装rpk 。

1.4 .代码编译配置-开发工具

1.4.1 使用 Visual Studio Code 开发

下载安装 : 点击跳转下载Visual Studio Code

打开 vscode , 打开项目。 点击左上角扩展,此图标

搜索 hap 安装 Hap Extension ==》点击重新加载 ,激活 Hap Extension

1.4.2使用WebStorm开发和sublime开发 请参照(https://doc.quickapp.cn/tutorial/getting-started/code-edit-conf.html

【推荐vscode】

1.5开发与调试

1.5.1 日志输出和日志查看

日志输出

找到src文件夹的manifest.json,找到config配置,将logLevel修改为最低级别debug,即:允许所有级别的日志输出

{
 "config": {
  "logLevel": "debug"
}
}

在js中输出日志(与传统前端开发一直)

console.debug('debug')
console.log('log')
console.info('info')
console.warn('warn')
console.error('error')

查看日志

可以在浏览器控制台查看日志,也可以在编辑器终端窗口查看日志。

1.5.2 远程调试

就是通过浏览器预览快应用。 启动服务器npm run server

1编辑器提供扫码的二维码

2快应用调试器-扫描按照-安装rpk文件

3点击快应用调试器的-开始调试

1.6项目配置信息

地址(doc.quickapp.cn/tutorial/ge…

1.6.1配置应用基本信息

在manifest.json文件中

(1)应用包名(package)

格式:

{
"package": "com.example.demo"
}

(2)应用名称(name)【6个汉字以内,与应用商店保存的名称一致,桌面显示的应用名也是】

格式:

{
"name": "我是快应用"
}

(3)应用图标(icon)【 正方形(不能是圆角),且务必无白边

格式:

{
"icon": "/Common/logo.png"
}

注意【必须是绝对路径 】其中/对应于路径<myproject>/src/

(4)应用版本名称、版本号(versionName、versionCode)【版本号 主版本.次版本 格式 , 版本号从1开始,每次更新上架自增1 】

{
"versionName": "1.0",
"versionCode": 1
}

demo

"versionName": "1.0.0.0",

"versionCode": "1",

(5)支持的最小版本号(minPlatformVersion) 【最小是1000,小于1000请在提测前下载安装快应用平台内测版,自测通过后提测】

{
"minPlatformVersion": 1000
}

(6)配置接口列表(features)

【注意】在使用接口时,必须先在manifest中声明接口。在每个接口文档的顶部,都附有声明接口的配置代码

格式:

{
"features": [
{ "name": "system.fetch" }
]
}

1.6.2 配置页目录有(router)

注意【定义页面的实际地址跳转地址。如果ux页面没有配置路由,则不参与项目编译(就是可以不配置)。一个目录下最多只能存在一个主页面文件(不包括组件文件)】

(1)首页名称(router.entry

例如工程目录

└── src
└── Demo 页面目录,存放各自页面私有的资源文件和组件文件
└── index.ux 页面文件,文件名不必与父文件夹相同(推荐index.ux)

{
"router": {
"entry": "Demo"
}
}

则进入项目的第一个页面 为demo的index.ux 页面 (入口页)

(2)页面路由对象(router.pages)

页面路由对象, key为页面名称(src目录下,,页面目录的相对丼 , value为页面具体路由配置, key不能重复)

页面具体路由配置(router.pages的value)包括以下属性:

· component:页面对应的ux文件名

· path:页面路径,不填则默认为页面名称(<ProjectName>/src目录下,页面目录的相对路径

demo工程目录:

└── src
|── Demo 页面目录,存放各自页面私有的资源文件和组件文件
| └── index.ux 页面文件,文件名不必与父文件夹相同(推荐index.ux)
└── Doc
└── Layout 页面目录,存放各自页面私有的资源文件和组件文件
└── index.ux 页面文件,文件名不必与父文件夹相同(推荐index.ux)

当页面名称(router.pages的key)为Demo时,对应的页面配置(router.pages的value)包括:

· component:页面对应的【ux文件名】index

· path:页面路径,默认为页面名称Demo

{
"router": {
"pages": {
"Demo": {
"component": "index"
},
"Doc/Layout": {
"component": "index"
}
}
}
}

开发者就可以通过/Demo访问到Demo目录下的index.ux页面了,就可以开始快应用的开发了。

说起快应用,不得不说快应用踩过的坑。 由于快应用处于不断优化阶段,在开发过程中,自然会遇到一些不完善的地方,由于我们对于新技术的掌握还不透彻,也会使得开发中遇到很多的困难。 我将快应用开发的问题罗列到下面,希望对大家的开发有所帮助。

1. stack模式注意事项

stack模式下,父级内放入image,将事件作用于stack和div事件触发均有难问题,所以,需要将事件设置到image上。 设置于子级本身。

2 . tabs切换

如果是自定义组件形式。 tab-bar可以设置为div形式。 当点击每个tab-bar , 可以切换图片和更换颜色。

在data中设置数据进行切换 。

3.缺少依赖

Can’t resolve ‘less-loader’ ,证明缺少 less-loader依赖,直接重新安装依赖即可, 即 npm install less-loader ,其他依赖同理。

4 . 返回数据作二次处理再渲染

如果数据返回的是类型等数字,比如返回为1 ,2 等。 需要将1和2 在渲染的过程中转换为name 和 state , 则返回的数据需要处理后重新返回新数据即

5.父子组件传参 (父组件向子组件传参)

子组件 设置props

props中的属性作为子组件,遍历 data的值,遍历到每一个是 $item ,代表data1中每一个对象 。获取每个对象,拿到对应属性, 将其放入 页面中。

父组件的数据形式

在父组件中使用子组件

6. 通过 openssl 命令等工具生成签名文件private.pem、certificate.pem

如果只是单独vscode 生成证书必须使用openssl,使用命令是直接用不了的。必须安装openssl。

操作步骤是:

复制华为的openssl 到项目的同级 D盘的 D:\Program Files,复制OpenSSL-Win64 文件到 D:\Program Files 此位置

然后设置全局环境变量

我的电脑 -右键- 属性 -高级-环境变量-path双击- 在最后加分号加openssl路径。 ;D:\Program Files\OpenSSL-Win64\bin

然后执行命令

openssl req -newkey rsa:2048 -nodes -keyout private.pem -x509 -days 3650 -out certificate.pem复制代码

最后在工程的 sign 目录下创建 release 目录,将私钥文件 private.pem 和证书文件 certificate.pem 拷贝进去。

7 . 没有tab-bar,列表无法加载底部问题

快应用,在隐藏tab-bar的状态 ,列表加载一直是加载中,无法加载到底部。 所以要设置一个padding值,>=2px,否则无法加载到底部。

8.路由传参

路由传参:(使用时注意引入import router from '@system.router';)

路由传img(参数时),接受时是字符串类型,需做处理才能使用。

this.detailList = JSON.parse(this.detailList); 使用此方法将\\解析。

可得正常结果例如:https://blog.csdn.net/shi_yi_fei/article/details/51202209

9.路由跳转传参

路由跳转传参(routePagePushWithParams)

格式

routePagePushWithParams () {

// 跳转到应用内的某个页面

router.push({

uri: '/heroDetail',

params: {

detaiId: this.$item.hero_id

}

})

}

该路径跳转为heroDetail下的index.ux的文件,

子组件在接收时注意定义属性最好不为null (否则会出现未知错误)

protected: {

detaiId: ""(正确)

detaiId: null(错误)

}

10.list瀑布流(不理想)

布局:

方案1: list中嵌套两个list-item,list-item中用block循环对应数组中数据。

缺点:

list不支持justify-content样式。

页面出现卡顿。

方案2: div中嵌套两个list,block循环list-item来展示数据。

缺点:

div不能实现页面滚动。

左右list会独立滚动。

方案3: list中设置属性columns:2,list-item显示数据信息。

缺点:

无法区分两侧数据。

每个list-item高度相同。

方案4: list中嵌套一个list-item,list-item中用div分为左右两列列表,div中block循环对应数组中数据。

缺点:

页面卡顿。

第一页内容显示正常,但之后的内容显示不全。

js: 先定义两个数组,遍历数据根据后台返回的高度来判断添加到哪个数组中。

总结:

list内子元素只能单方向滚动,不能换行。

list、list-item中不可再次嵌套list。

暂不支持瀑布流

list-item的type属性是优化list的关键。

block会被当做透明标签处理,调试时不显示。

11.swiper中多个图片加载

如果很长很长图片加载时出现图片模糊、被放大(初次加载时出现)

部分机型(小米)出现一些图片被切割现象。(不可恢复)

部分机型(华为、oppo)滑动过快,出现图片被切割现象,重新加载可以还原页面。有可能是手机渲染的问题。

12.图片编辑

文档中图形图像目录下,对图片的操作不能操作网络上的图片。

否则会报202(参数错误)

uri格式为 uri:'internal://tmp/abc.jpg'

13.页面调试

最初调试时注意版本号以及是否在同一网段。如果手机电脑都使用一个wifi 。但是电脑安装了360wifi等,则会改变网段。请注意必须在同一网段。

调试时会出现页面突然崩掉,重新加载即可。

当你npm run watch页面不更新时,重新npm run build的会显示你的错误。

出现安装失败,确定代码没问题,就清理一下测试机。

14.变量

问题1:在block循环中直接使用".length",可显示length前内容的长度。 例: {{$item.thumb_img.length}}

问题2:当点击图片跳转该图片详情页时,routePagePushWithParams中可直接打印出当前点击图片下的详情信息

html:

<block for="{{imgListMsg}}" @click="routePagePushWithParams">

<text class="text-title">{{$item.title}}</text>

</block>

js:

routePagePushWithParams () {

console.log(this.$item.title)

// 跳转到应用内的某个页面

router.push({

uri: '/cosImgDetail',

params: {

detailName: this.$item.title,

}

})

}

15.css样式问题

html

<text for="value in $item.reply_list">

<span>用户名称</span>

用户内容

</text>

当给span添加样式时,会覆盖text的样式

解决办法:给span添加class ,不是直接span标签。

16.richtext 样式不可被覆盖

<richtext type="html" class="skillCon" >

{{description}}

</richtext>

richtext解析返回的html数据。 样式不可被覆盖更改。 需要单独给html更改新的颜色等,不可实现。

17.if使用和判断

<div class="topPic" if="{{$item.iconList !='' && $item.iconList != null }}" @click="routewebdetail" >

<div class="smallPic" for="{{$item.iconList}}">

<!-- 图片 -->

<image src="{{$item.icon}}" class="imgImg" ></image>

</div>

</div>

出现报错

原因是,列表中尽量少使用if判断,如果使用了。必须保证type值相同的结构type唯一,如果列表中可能出现不同的type则可能报错。最好的解决办法是,使type值不唯一。

解决办法:type="product-{{ listItem.iconList.length }}-{{ listItem.coverList.length }}"

18.分享问题

分享问题请注意,申请回来的key。 注意将value值放入到manifext.json。模式是

如果platform只有一个,比如只有微信。点击分享的时候,会直接分享到微信页面, 不会调起弹框。如果需要有其他额外的操作在分享页,可以制作假的点击按钮,逐个分享。

19.swiper中暂时不支持list组件

处理办法,如果需要滑动操作,则使用tabs中放入list组件。

20. list中图片不能占满全屏处理

list作为最大的外层容器,内部的background-image或者image 如果不设置高,height:100%;撑不开元素。

处理办法:给image设置固定的px高度,如果要图片占满全屏,则 device.getInfo可以获取设备的高, 将获取的高给到list-item内的image设置高度。 可以占满全屏。目前不确定是否有兼容性问题。

如果只有一张固定背景图,而不是list渲染图片,则可以给最大的节点设置背景图,可以占满全屏。

21.div下image设置问题

如果div下直接有一个image。 div设置宽60px高60px,image同样设置宽高60 ,最后渲染的结果可能是60*60,60*61,61*60,59*59,会有1像素的问题。目前还是待解决。

感谢大家阅读这边文章。希望大家能提出宝贵的意见,希望我们能共同见证快应用的成长,享受快应用所带来的极致体验。


作者:执着的烙印
链接:https://juejin.im/post/5c21e2686fb9a049b41c7e1b
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

猜你喜欢

转载自www.cnblogs.com/maomao-Sunshine/p/12674102.html