资源访问
资源访问
URI 和路径
可以在应用中通过 URI 或者路径访问应用中的资源。这些资源包括应用安装包中的文件、应用的运行时数据文件和共享数据文件等。与 Web 环境不同,Glyphix 应用中的 URI 和路径主要用于访问本地文件,而不能访问网络上的资源。
许多 API 和原生组件都使用 URI 或者路径访问资源,在这些接口中 URI 或者路径一般可以混用。
URI
URI 的格式和 URL 类似,语法定义如下图所示:
各字段的说明为:
- scheme:指定资源访问的协议,例如
app
、internal
等; - authority:通常表示包名或者域名,其意义由具体的资源协议决定;
- path:资源在资源包内部的路径,必须是
/
字符开头的字符串(就像 Unix 中的路径一样); - query:指定查询数据,一般只用于应用跳转时传递参数。
这是一些 URI 的实例:
authority
↓
app://com.example.app/icon.png
↑ ↑
scheme path
authority
↓
internal://files/favicon.png
↑ ↑
scheme path
authority query
↓ ↓
app://com.example.app/icon.png?key=value
↑ ↑
scheme path
使用 URI 可以定位其他应用中的资源以及系统资源,也可以访问应用的缓存或临时文件,在访问外部资源时要注意应用是否有相应的权限。与 Web 平台不同,Glyphix URI 通常用于访问本地资源,而无法访问网络资源。请使用 system.fetch
或者 system.request
模块。
路径
路径是另一种定位资源的方式,它只能定义应用包内部的资源。路径有两种写法,一种是使用 /
开始的绝对路径,例如 /assets/images/icon.png
;另一种是相对路径,例如 images/icon.png
。绝对路径相对于应用资源包的根目录(也就是项目的 src
目录),而相对路径则相对于当前资源文件。因此
// in file: /Common/module-a.js
import x from '/Common/module-b.js'
import y from 'module-b.js'
中,x
和 y
实际上引入了同一个模块。
使用 ..
可以定位上一级目录,例如 ../fonts/Times.ttf
或 /images/../fonts/Times.ttf
。不过 ..
无法超越项目根目录的层次,因此 /a/../..
会被限制为 /
。
绝对路径可以用于 URI 的 path 字段。
URI 协议
app
此协议下 authority 字段为应用的包名,也就是 mainfest.package
字段。path
字段为应用资源包内资源的路径。
使用 app
协议可以访问其他应用的资源。
file
待补充
pkg
待补充
internal
internal
URI 协议用于访问应用内部的资源文件,尤其是那些无法通过常规静态路径访问的文件。例如,应用程序可能生成临时文件、缓存文件或私有文件,这些文件无法通过路径访问(路径智能访问资源包内的静态资源),而应通过 internal 协议来访问和管理。
常见的 internal
URI 协议的基本格式如下:
internal://<authority>/<path>
- authority:决定资源文件的存储位置,具体作用见下文。
- path:相对于指定存储位置的路径,指向具体的文件。
authority 字段
authority 字段是 internal
决定了内部资源的类别和存储位置。依据不同的取值,authority
字段的作用如下:
cache
:表示该 URI 定位到应用程序的缓存目录,通常用于存储缓存文件。此目录下的文件是应用运行时生成的临时文件,可以随时被删除或重建。files
:表示该 URI 定位到应用程序的私有文件目录。这是应用程序专用的存储位置,用于保存需要持久化的文件数据。mass
:表示该 URI 定位到所有应用共享的文件目录。这通常是一个公用目录,多个应用可以在此目录下存储和读取文件。tmp
:表示该 URI 定位到系统的临时文件目录,通常用于存储短期使用的临时文件。文件在这里存储的时间是短暂的,可能会在系统或应用重启时被清除。
例如
internal://cache/images/avatar.png
这个 URI 用于访问缓存目录中的图片文件 avatar.png
。该 URI 可以在 image 组件等多个位置使用:
<image src="internal://cache/images/avatar.png" />
应用文件隔离
使用 internal
URI 协议时,cache
、files
和 tmp
类别都是应用的私有存储区域,只有当前应用可以访问这些目录下的文件。因此,同一个 internal
URI 在不同的应用中可能指向不同的文件。每个应用都有独立的私有缓存、文件和临时文件存储空间,确保了应用之间的文件隔离和数据安全。
假设有两个不同的应用 A 和 B,分别使用同一个 URI 来访问私有文件:
internal://files/config/settings.json
那么
- 应用 A 中该 URI 指向其私有文件目录中的
settings.json
文件。 - 应用 B 中该 URI 指向其私有文件目录中的
settings.json
文件。
这种机制确保了应用之间各自管理自己的文件,互不干扰,也避免了潜在的数据泄露。
于此不同 internal://mass/
是所有应用共享的公共文件存储区域。同一个 internal
URI 在不同的应用中指向相同的文件。因此,mass
目录下的文件可以被多个应用共同访问和共享。例如应用 A 和应用 B 都使用:
internal://mass/public/shared_image.png
那么该 URI 在两个应用中指向同一个公用文件 shared_image.png
,允许它们共享该文件资源。
注意
如果一个应用将敏感数据存储在 mass
空间中,其他应用可能会读取该数据。因此,开发者应避免在 mass
目录中存储任何敏感或私密的信息,确保存储在其中的文件是可公开访问和共享的资源。
资源 API
URI
全局函数、@system.path
、@system.file
等接口提供在 JavaScript 中操作资源的能力。本节介绍 URI
函数的用法。
URI
此函数接受一个字符串,并将其解析为 Uri
对象用于后续处理。参数 uri
是待解析的 URI 字符串。
返回值是一个对象,包含以下字段:
scheme: string
:从参数中解析到的 scheme 字段;authority: string
:从参数中解析到的 authority 字段;path: string
:从参数中解析到的 path 字段;query: string
:从参数中解析到的 query 字段;origin: string
:参数中的原始 URI 字符串toString: ( string
:此方法可以将本对象重新编码为 URI 字符串。
例如:
console.log(URI("https://app-name/icon.png"))
// {
// scheme: 'https',
// authority: 'app-name',
// path: '/icon.png',
// query: '',
// origin: 'https://app-name/icon.png',
// toString: <function>
// }
URI
函数还接受对象作为参数,这种情况下 URI
函数会给参数对象增加一个 toString
方法,通过该方法可以将 URI 对象编码为字符串:
let uri = {
scheme: 'https',
authority: 'app-name',
path: '/icon.png',
query: ''
}
console.log(URI(uri).toString()) // 'https://app-name/icon.png'