https://www.u.tools/
Dev Docs: https://www.u.tools/docs/developer/welcome.html
- [Questions](#questions)
- [Manifest](#manifest)
- [Dev](#dev)
- [preload.js](#preloadjs)
- [Use Third Party Packages](#use-third-party-packages)
- [uTools API](#utools-api)
- [uTools DB API](#utools-db-api)
- [uTools Browser API](#utools-browser-api)
- [uTools Server API](#utools-server-api)
- [注意事项](#注意事项)
- [App Storage](#app-storage)
## Questions
1. How does uTools render UI?
2. How does uTools allow plugins to access system API?
## Manifest
```json title="plugin.json"
{
"main": "index.html",
"logo": "logo.png",
"features": [
{
"code": "hello",
"explain": "hello world",
"cmds": ["hello", "你好"]
}
]
}
```
- `main` is the entry point.
- `features` is a list of features
- `features.code` id code to distinguish features
- `features.cmds`: command list to trigger the feature (中文会自动支持 拼音及拼音首字母,无须重复添加)
- `"platform": ["win32", "darwin", "linux"]` optional
## Dev
The dev tools provided by uTools can load plugin for testing and bundle into `.ups` file which can be installed and shared. Like Alfred's workflow file.
Example: https://github.com/uTools-Labs/utools-tutorials/tree/main/utools-helloworld-example
Doc: https://www.u.tools/docs/developer/debug.html
Set `main` to a local url for development to achieve hot reload.
```json
{
"development": {
"main": "http://127.0.0.1:8080/index.html"
}
}
```
## preload.js
https://www.u.tools/docs/developer/preload.html
> 当你在 `plugin.json` 中配置了 `preload` 属性,将载入对应的预加载脚本。
>
> 在传统的 web 开发中,所有的 javascript 脚本都在浏览器沙盒中运行,权限被严格限制,所能实现的功能非常有限。
>
> 通过 `preload.js` 能够帮你突破沙盒限制,进入一个崭新的 JavaScript 世界。
`preload.js` is used to preload script and bypass sandbox limitation.
`preload.js` can access `nodejs`, `electron`, `uTools` API. APIs can be plugged into `window` object so that other JS code can access these APIs.
```js
// 开发者可以暴露自定义 API 供后加载脚本使用
// preload.js 中使用 nodejs
const { readFileSync } = require("fs");
window.readConfig = function () {
const data = readFileSync("./config.json");
return data;
};
// index.html 后加载的内容可以使用 window.readConfig() 方法,但不能使用 Node.js 特性
console.log(window.readConfig()); // 正常执行
console.log(readFileSync("./config.json")); // 报错
```
```js
function readFileAsync(filePath, encoding) {
return new Promise((resolve, reject) => {
require("fs").readFile(filePath, encoding, (error, data) => {
if (error) {
reject(error);
} else {
resolve(data);
}
});
});
}
window.services = {
readFile: (inputPath, encoding = "utf8") => {
return readFileAsync(inputPath, encoding);
},
};
```
`window.services.readFile` get's access to read files beyond the constraint by sandbox.
## Use Third Party Packages
> 通过源码方式使用第三方库
>
> Through source code
Download the library into `/public`
## uTools API
This is a wrapper for some common functions.
在插件应用初始化完成时,uTools 会自动在你的 window 对象上挂载 utools 对象。
```js
// 复制单个文件
utools.copyFile("/path/to/file");
// 复制多个文件
utools.copyFile(["/path/to/file1", "/path/to/file2"]);
// 路径
utools.copyImage("/path/to/img.png");
// base64
utools.copyImage("data:image/png;base64,xxxxxxxxx");
```
### uTools DB API
Data persistance.
```js
// 创建
utools.db.put({
_id: "demo",
data: "demo",
});
// 返回 {id: "demo", ok: true, rev: "1-05c9b92e6f24287dc1f4ec79d9a34fa8"}
// 更新
utools.db.put({
_id: "demo",
data: "demo",
_rev: "1-05c9b92e6f24287dc1f4ec79d9a34fa8",
});
// 异步方式更新
utools.db.promises.put({
_id: "demo",
data: "demo",
_rev: "1-05c9b92e6f24287dc1f4ec79d9a34fa8",
});
utools.db.get("demo");
// 返回 {_id: "demo", _rev: "3-9836c5c68af5aef618e17d615882942a", data: "demo"}
utools.db.remove("demo");
// 返回 {id: "demo", ok: true, rev: "2-effe5dbc23dffc180d8411b23f3108fb"}
```
### uTools Browser API
> uTools browser 简称 ubrowser,是根据 uTools 的特性,量身打造的一个可编程浏览器。利用 ubrowser 可以轻而易举连接一切互联网服务,且与 uTools 完美结合。
ubrowser 拥有优雅的链式调用接口,可以用口语化的数行代码,实现一系列匪夷所思的操作。例如:
1. RPA 自动化脚本
2. 网页魔改
3. 网页抓取
```js
// 打开"必应" 并搜索 "uTools"
utools.ubrowser
.goto("https://cn.bing.com")
.value("#sb_form_q", "uTools")
.click("#sb_form_go")
.run({ width: 1000, height: 600 });
```
This is interesting. This should be very simple. The browser window is loaded in a electron window, the API is just a wrapper around DOM APIs.
There is also `setCookies(cookies)` and `removeCookies(name)` API.
`evaluate(func, ...params)` allows developers to eval JS function.
```js
.evaluate((param1, param2) => {
return document.querySelector('div').innerText
}, 'param1', 'param2')
```
### uTools Server API
> 通过 uTools 的服务端 API,可以将你的应用和 uTools 用户关联,实现帐号互通、接收支付通知、查询用户支付记录等,为保护密钥安全,请仅在服务端调用接口。
APIs for account and payment. Regular API wrapper for web requests, skip.
## 注意事项
1. uTools 插件应用中不受跨域影响,可以访问任意网址。
2. 无需网页考虑兼容性问题,基于(Chromium 91 和 Node 14)
3. 在插件应用开发模式中,可以使用 http 协议加载远程资源( js、css )。当打包成 uTools 插件应用后,所有的静态资源都应该在包内,否则会加载失败。
4. 在打包目录中,请勿包含 `.git` `.js.map` `.css.map` 文件。
## App Storage
On Mac, the app data is stored in `/Users/<user>/Library/Application Support/uTools`.
Clipboard data stored in `clipboard-data/1715136702505/data`. The number is the timestamp.
In the `data` file, there is encoded (and potentially encrypted clipboard data).
Here is the tree structure with 2 layers of folders.
```
.
├── Cache
│ └── Cache_Data
├── Code Cache
│ ├── js
│ └── wasm
├── Cookies
├── Cookies-journal
├── Local Storage
│ └── leveldb
├── Network Persistent State
├── Partitions
│ └── %3Cutools%3E
├── Preferences
├── SingletonCookie -> 11472625255256702255
├── SingletonLock -> f4d488789185-8643
├── SingletonSocket -> /var/folders/f7/7c6q0gh121vdyh86bv192wpc0000gn/T/scoped_dirCsNUE2/SingletonSocket
├── blob_storage
│ └── 37646b27-ee51-41e8-a51d-91b911b09c42
├── clipboard-data
│ └── 1715136702505
├── database
│ └── default
├── plugins
│ ├── 170c1ee16af97ded0bdde9e7eb60294b.asar
│ ├── 5522e367c63f3d5490807c01b442211d.asar
│ ├── 668b903f4bcdf240dd228aab904f3892.asar
│ ├── 6ee51b94a1ffd0d90edfc1f3c2460f06.asar
│ ├── 6ee51b94a1ffd0d90edfc1f3c2460f06.asar.unpacked
│ ├── 878f2055a6213f3e8f4c38a8109e077c.asar
│ ├── 878f2055a6213f3e8f4c38a8109e077c.asar.unpacked
│ ├── 9325e4f7566857c5e4633eb2b1b564fc.asar
│ ├── b5a1343f92233a09aa4499f1a3389a12.asar
│ ├── b5a1343f92233a09aa4499f1a3389a12.asar.unpacked
│ ├── d030e1e61e13bf54f1b393938e80242c.asar
│ ├── e332887c9a7b922489ee3dba816901b1.asar
│ └── installs
└── settings
```
WASM is used, node addons are used. The app is built on Electron.