提交 12972b57 编写于 作者: W wanganxp

修复错误路径和补充编译器详情

上级 7a44f596
......@@ -2,12 +2,12 @@
uni-app x项目的uts代码中可以使用很多API。包括:
- uts的api [详见](../../uts/buildin-object-api/global.md)
- uts的api [详见](../uts/buildin-object-api/global.md)
- 全局api,前面不需要加`uni.`。如`getApp`
- uni.xxx的内置api。见左侧
- uniCloud.xxx的内置api。见左侧
- dom的api [详见](dom/README.md)
- vue的api [详见](../../tutorial/vue3-api.md)
- vue的api [详见](../vue/README.md)
- 原生api
由于uts可以直接调用Android和iOS的api,所以os和三方sdk的能力都可以在uts中调用。如下:
......@@ -39,7 +39,7 @@ uni-app x项目的uts代码中可以使用很多API。包括:
插件市场也有很多做好的uts插件,方便开发者拿来即用。[uts插件](https://ext.dcloud.net.cn/?cat1=8&type=UpdatedDate)
虽然上述页面可以直接调用原生能力,但一般原生能力建议封装为[uni_modules](../../plugin/uni_modules.md)形式的[uts插件](../../plugin/uts-plugin.md)。这样方便共享、方便跨平台。
虽然上述页面可以直接调用原生能力,但一般原生能力建议封装为[uni_modules](https://uniapp.dcloud.net.cn/plugin/uni_modules.html)形式的[uts插件](https://uniapp.dcloud.net.cn/plugin/uts-plugin.html)。这样方便共享、方便跨平台。
uni-app x 中不再支持plus和weex的API。过于plus api中一些常用的api,在uni-app x中进行了替换增补。
- plus.runtime.quit => [uni.exit](./exit.md)
......
......@@ -22,7 +22,7 @@ system的定位仅支持wgs84坐标系、不支持逆地址解析、且某些老
可下载[腾讯定位插件](https://ext.dcloud.net.cn/plugin?id=14569),在插件中配置key打包后生效。
上述腾讯定位插件属于[ext api插件](../../api/extapi.md),引用到工程后,会覆盖uni.getLocation的实现,替换掉系统定位。
上述腾讯定位插件属于[ext api插件](https://uniapp.dcloud.net.cn/api/extapi.html),引用到工程后,会覆盖uni.getLocation的实现,替换掉系统定位。
如需其他定位,请在插件市场搜索定位相关的uts插件。
......
......@@ -22,8 +22,8 @@ App一键登陆是替代短信验证码登录的更优选择:对开发者而
<!-- UTSAPIJSON.getUniverifyManager.example -->
## Tips
- 运营商对一键登陆给用户呈现的ui有强制要求。(需补充细节)
- 目前一键登陆的UI可自定义性有限。仅支持配置登录页全屏/半屏、登录页背景色、登录按钮文案以及登录页logo。
- 运营商对一键登陆给用户呈现的ui有强制要求:必须有运营商的隐私协议和服务条款、不得默认勾选同意、手机号掩码显示、需要用户手动再点按钮获取而不能自动获取。
- 目前一键登陆的UI可自定义性有限。仅支持配置登录页全屏/半屏、登录页背景色、登录按钮文案以及登录页logo。后续会继续扩展自定义性。
<!-- UTSAPIJSON.general_type.name -->
......
......@@ -14,7 +14,7 @@
## 注意事项
* request 接口内部通过[特殊方式读取了泛型类型](../../uts/generics.md#使用限制),不支持传入动态的泛型:比如将外层方法的普通泛型参数传入 request。
* request 接口内部通过[特殊方式读取了泛型类型](../uts/generics.md#使用限制),不支持传入动态的泛型:比如将外层方法的普通泛型参数传入 request。
* 如果使用泛型先创建RequestOptions实例,再传入uni.request(),此时请务必确保request要显式指定泛型,例:
```typescript
const options: RequestOptions<Person> = ...
......
#### 什么是 uni-app x 编译器
## 什么是 uni-app x 编译器
`uni-app x`的编译器由uvue编译器、uts语言编译器共同组成,还调用了kotlin、swift编译器。
`uni-app x`的编译器由uts语言编译器、uvue编译器共同组成,其中uts编译器还调用了kotlin、swift编译器。
编译器把开发者书写的uvue和uts代码进行编译,配合运行时实现了跨平台。
......@@ -10,7 +10,17 @@ uvue编译器是在Vite基础上进行扩展开发的。
支持less、sass、scss等css预编译。
#### 编译缓存 @cache
## 条件编译
多端框架,离不开条件编译。
uni-app发明了完善的条件编译,帮助开发者处理平台差异。即保证了大部分通用逻辑的开发效率和复用,又保证了平台特色的充分利用。
在uni-app x中,进一步新增了APP-ANDROID、APP-IOS的条件编译。
因与uni-app的条件编译大部分相同,请详见[uni-app的条件编译文档](https://uniapp.dcloud.net.cn/tutorial/platform.html)
## 编译缓存@cache
`uni-app x`编译器引入了编译缓存机制,以优化开发体验。
......@@ -28,7 +38,7 @@ App原生语言的编译过程耗时较长,因此编译器引入了缓存机
![](https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/uni-app-x/clean-up-the-build-cache.jpg)#{.zooming width="400px"}
#### 注意 @tips
### 注意@tips
- `uni-app x`编译器会产生kt、class等临时文件。安全软件(如360、微软)会对其进行木马扫描,消耗电脑性能。建议将项目的unpackage目录设置为信任,以提升编译性能。
......@@ -43,3 +53,62 @@ App原生语言的编译过程耗时较长,因此编译器引入了缓存机
![](https://web-assets.dcloud.net.cn/hbuilderx-doc/360/win_1.png)#{.zooming width="400px"}
![](https://web-assets.dcloud.net.cn/hbuilderx-doc/360/win_2.png)#{.zooming width="400px"}
## 静态资源文件的处理逻辑@static
编译器首先会扫描全局文件和pages.json,根据pages.json扫描每一个页面,再分析每个页面引用的外部资源,比如uts文件、css文件、uvue组件、图片字体等本地静态资源。
**静态资源文件**,分2类:
1. 本地的图片、字体、音视频文件。存放在工程的/static目录(或uni_modules的/static目录)
2. web-view组件加载的本地html文件及配套资源,存放在工程的/hybrid目录
通常,您只需记住:**所有静态资源图片字体音视频文件,都放置在项目根目录下的static目录**。如果是`uni_modules`,放置在`uni_modules`根下的static目录。
但是你会发现,有时候不放在static下的文件也有机会被访问到。如果您好奇这块的细节,可以继续阅读本节。如果觉得繁琐,只需记住上一条。
编译器在扫描页面文件时,对于页面里import的静态资源文件、以及非变量的静态资源,识别比较容易,
这些静态资源文件会被识别然后复制到编译后的assets目录(不是Android apk的assets目录,是uni-app x编译后和static平级的一个目录),
并且为了防止不同目录的重名文件,assets目录下的文件名末尾会补充hash值。但不确定的文件名也会导致无法使用[file manager](../api/get-file-system-manager.md)的api来访问这些文件。
而对于变量路径的静态资源,因为可能涉及拼接运算等复杂情况,这样的静态资源编译器无法识别,打包后会**丢失这个静态资源文件**
所以,强烈建议把静态资源都存放在static目录(含uni_modules下的static目录),这个目录下的文件会整体copy到编译产物目录。
当然,由于这个目录是整体copy,所以目录下若存在废弃文件,也会被打包进去。所以要记得清理static目录下的废文件,以减少包体积。
```html
<template>
<image src="./1.png"/> <!-- 非变量的静态资源,会被编译到assets目录。不推荐 -->
<image :src="logo"/> <!-- import的静态资源,会被编译到assets目录。不推荐 -->
<image :src="imga"/> <!-- 变量的静态资源,不会被编译器打包,文件丢失。不推荐 -->
<image src="/static/3.png"/> <!-- static目录会整体被copy到编译产物。推荐 -->
</template>
<script>
import logo from './logo.png';
export default {
data() {
return {
imga: './2.png'
}
}
}
</script>
```
以上代码被编译为apk后,解压apk可以看到如下目录结构:
`assets\apps\%APPID%\www`目录下,有4个目录:
<pre v-pre="" data-lang="">
<code class="lang-" style="padding:0">
┌─assets
│ ├─1.ab33ac77.png
| └─logo.abb6eead.png
├─hybrid App端存放web-view加载的本地html文件的目录
├─static 本地静态资源(如图片、字体、音视频等文件)的目录
| └─3.png
└─uni_modules
└─static uni_modules下的本地静态资源(如图片、字体、音视频等文件)的目录
</code>
</pre>
......@@ -22,7 +22,7 @@ uni-app x支持的组件包括:
- uts组件插件
`uts组件插件`的名称可能有点拗口,这是因为是相对于另一个分类`uts api插件`
它们同属于`uts插件`,是[uni_modules](../../plugin/uni_modules.md)。api插件指能力扩展,比如蓝牙api。而组件插件指界面元素扩展,比如video、map、lottie动画等。
它们同属于`uts插件`,是[uni_modules](https://uniapp.dcloud.net.cn/plugin/uni_modules.html)。api插件指能力扩展,比如蓝牙api。而组件插件指界面元素扩展,比如video、map、lottie动画等。
uts组件插件,指把原生的、需要在界面上显示的、内嵌于页面中整体排版的组件,编写uts代码调用原生sdk,通过uni_modules插件的方式集成到uni-app项目中。比如
* lottie组件,使用uts调用原生的lottie sdk来开发组件,再引入页面中。[详见](https://ext.dcloud.net.cn/plugin?name=uni-animation-view)
......
......@@ -97,7 +97,7 @@ uvue的策略是:在新建页面时,提供一个选项,让开发者选择
</template>
```
考虑到未来web平台和基于webview的小程序的兼容,自动套在页面顶层的scroll-view写在了[条件编译](../../tutorial/platform.md)里。
考虑到未来web平台和基于webview的小程序的兼容,自动套在页面顶层的scroll-view写在了[条件编译](https://uniapp.dcloud.net.cn/tutorial/platform.html)里。
这样在web浏览器里就无需多套一层scroll-view,自然的使用浏览器的页面滚动就好了。
......
......@@ -26,7 +26,7 @@ uni-app x的项目,在左侧项目管理器的图标是圆形的U(之前是
## 项目结构
uni-app x的项目结构与[uni-app js引擎版的项目结构](../tutorial/project.md)基本一致。
uni-app x的项目结构与[uni-app js引擎版的项目结构](https://uniapp.dcloud.net.cn/tutorial/project.html)基本一致。
主要的差别是没有nativeplugins目录和wxcomponents目录。原因是uni-app x不支持uni-app js引擎版的原生语言插件,不支持微信小程序wxml组件。
......
......@@ -62,9 +62,9 @@ uvue渲染引擎包括uts版的vue框架(组件、数据绑定...)、跨平
> * 所以在nvue渲染时,增加了bindingX技术
> * 所以在skyline渲染时,增加了worklet技术
但这些补丁技术都不治根。过去只有flutter解决了dart和ui层的通信问题,但dart和原生层通信也还是有延时。
但这些补丁技术都不治根。过去只有flutter解决了dart和ui层的通信问题,但dart和原生层通信也还是有延时,对象传递需要序列化;另外混合原生控件的渲染也有问题,比如原生的信息流广告、输入法交互
在 uni-app x 中,App端只有1种编程语言(Android里是kotlin),再也没有通信问题。
在 uni-app x 中,App端只有1种编程语言(Android里是kotlin),再也没有通信问题。渲染引擎也都是原生渲染,比混合渲染的内存占用更低、稳定性兼容性更好。
对于原生应用开发者而言,uvue提供了更快捷、更舒服的界面开发方式,并且不降低性能。
......
......@@ -192,8 +192,8 @@ p.age //12
但是在强类型语言中,如果想要使用`p.age`,那么p必须是一个对象,而age则是这个对象的属性。然后必须为p对象、name属性、age属性,都定义类型,比如name是string,age是number。
uts中有2种方式使用json数据:
1. 把json数据转为type,自定义一个类型,声明json数据内容中每个属性的类型。然后就可以使用对象属性的方式来使用json数据。[详见](../../uts/data-type.md#type)
2. 使用UTSJSONObject,不为json定义类型,然后通过下标和方法来使用json数据。[详见](../../uts/data-type.md#ustjsonobject)
1. 把json数据转为type,自定义一个类型,声明json数据内容中每个属性的类型。然后就可以使用对象属性的方式来使用json数据。[详见](../uts/data-type.md#type)
2. 使用UTSJSONObject,不为json定义类型,然后通过下标和方法来使用json数据。[详见](../uts/data-type.md#ustjsonobject)
如果是联网获取服务器发下的json数据,那么**务必需要读教程**[request](request.md)
......@@ -267,8 +267,8 @@ request({url: 'https://www.example.com/request'} as RequestOptions)
- 不支持undefined。任何变量被定义后,都需要赋值
- App-iOS平台暂不支持async、await
- 函数声明方式不支持[作为值传递](../../uts/function.md#作为值传递)
- 函数表达式方式不支持[默认参数](../../uts/function.md#默认参数)
- 函数声明方式不支持[作为值传递](../uts/function.md#作为值传递)
- 函数表达式方式不支持[默认参数](../uts/function.md#默认参数)
## 调用组件方法@methods
......
......@@ -317,4 +317,4 @@ hx的json转type工具,会对一些敏感符合和关键字自动转义。但
## 注意事项
* request 接口内部通过[特殊方式读取了范型类型](../../uts/generics.md#使用限制),不支持传入动态的范型:比如将外层方法的普通范型参数传入 request。所以目前尽量直接使用uni.request而不是封装。如确需封装,可不使用type,改用UTSJSONObject。
\ No newline at end of file
* request 接口内部通过[特殊方式读取了范型类型](../uts/generics.md#使用限制),不支持传入动态的范型:比如将外层方法的普通范型参数传入 request。所以目前尽量直接使用uni.request而不是封装。如确需封装,可不使用type,改用UTSJSONObject。
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册