@zerodep-dev/vue-tsx-pro-mini 0.0.0-stage → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +69 -2
- package/dist/build.d.ts +104 -0
- package/dist/build.js +430 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +123 -0
- package/dist/elements-BDIG7-jU.js +63 -0
- package/dist/globals.d.ts +1 -0
- package/dist/globals.js +16 -0
- package/dist/index.d.ts +188 -0
- package/dist/index.js +15 -0
- package/dist/page-upnBSowU.js +1219 -0
- package/dist/testing.d.ts +50 -0
- package/dist/testing.js +109 -0
- package/package.json +71 -3
- package/template/gitignore +2 -0
- package/template/index.html +17 -0
- package/template/mini.config.ts +12 -0
- package/template/package.json +22 -0
- package/template/src/app.ts +5 -0
- package/template/src/main.ts +5 -0
- package/template/src/pages/HomePage.tsx +25 -0
- package/template/tsconfig.json +16 -0
- package/template/vite.config.ts +5 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { cpSync, existsSync, readFileSync, readdirSync, renameSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { basename, join, resolve } from "node:path";
|
|
4
|
+
import { spawnSync } from "node:child_process";
|
|
5
|
+
import { pathToFileURL } from "node:url";
|
|
6
|
+
//#region src/cli.ts
|
|
7
|
+
/**
|
|
8
|
+
* 小程序的命令行,在应用目录(有 mini.config.ts)里运行:
|
|
9
|
+
*
|
|
10
|
+
* vtp-mini build [wx] [my] 构建两端(或指定的一端)工程到 dist/<平台>
|
|
11
|
+
* vtp-mini dev [wx|my] 监听模式(默认微信):改了源码只重打应用代码
|
|
12
|
+
* vtp-mini open [wx|my] 在开发者工具里打开产物(默认微信)
|
|
13
|
+
* vtp-mini create <目录> 从模板建一个新项目:H5 加两端小程序
|
|
14
|
+
*
|
|
15
|
+
* 微信开发者工具的命令行默认按安装位置找,装在别处时设环境变量 WECHAT_DEVTOOLS_CLI;
|
|
16
|
+
* 支付宝用 minidev(npx 临时取)
|
|
17
|
+
*/
|
|
18
|
+
const [command = "help", ...args] = process.argv.slice(2);
|
|
19
|
+
const cwd = process.cwd();
|
|
20
|
+
const platformsIn = (list) => list.filter((arg) => arg === "wx" || arg === "my");
|
|
21
|
+
/** 读应用目录里的 mini.config.ts(Node 直接按 TS 加载,不在 node_modules 里的文件会去掉类型) */
|
|
22
|
+
async function loadConfig() {
|
|
23
|
+
const file = resolve(cwd, "mini.config.ts");
|
|
24
|
+
if (!existsSync(file)) throw new Error(`没有找到 ${file}:vtp-mini 要在应用目录里运行`);
|
|
25
|
+
const { default: config } = await import(pathToFileURL(file).href);
|
|
26
|
+
if (!config || typeof config !== "object") throw new Error(`${file} 要默认导出 defineMiniConfig(…)`);
|
|
27
|
+
return config;
|
|
28
|
+
}
|
|
29
|
+
async function build(platforms) {
|
|
30
|
+
const { buildMini } = await import("./build.js");
|
|
31
|
+
const config = await loadConfig();
|
|
32
|
+
for (const platform of platforms.length ? platforms : ["wx", "my"]) {
|
|
33
|
+
const started = performance.now();
|
|
34
|
+
const { outDir, pages } = await buildMini({
|
|
35
|
+
...config,
|
|
36
|
+
root: cwd,
|
|
37
|
+
platform
|
|
38
|
+
});
|
|
39
|
+
const seconds = ((performance.now() - started) / 1e3).toFixed(1);
|
|
40
|
+
console.log(`${platform}: ${pages.length} 个页面 → ${outDir}(${seconds}s)`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async function dev(platform) {
|
|
44
|
+
const { watchMini } = await import("./build.js");
|
|
45
|
+
await watchMini({
|
|
46
|
+
...await loadConfig(),
|
|
47
|
+
root: cwd,
|
|
48
|
+
platform,
|
|
49
|
+
development: true
|
|
50
|
+
}, ({ outDir, ms, count }) => console.log(`${platform}: 第 ${count} 次(${ms} ms)→ ${outDir}`));
|
|
51
|
+
}
|
|
52
|
+
/** 微信开发者工具的命令行:环境变量优先,再按 Windows、macOS 的默认安装位置找 */
|
|
53
|
+
function wechatCli() {
|
|
54
|
+
const found = [
|
|
55
|
+
process.env.WECHAT_DEVTOOLS_CLI,
|
|
56
|
+
"C:\\Program Files (x86)\\Tencent\\微信web开发者工具\\cli.bat",
|
|
57
|
+
"C:\\Program Files\\Tencent\\微信web开发者工具\\cli.bat",
|
|
58
|
+
"/Applications/wechatwebdevtools.app/Contents/MacOS/cli"
|
|
59
|
+
].find((path) => path && existsSync(path));
|
|
60
|
+
if (!found) throw new Error("没找到微信开发者工具的命令行,装在别处时设环境变量 WECHAT_DEVTOOLS_CLI");
|
|
61
|
+
return found;
|
|
62
|
+
}
|
|
63
|
+
async function open(platform) {
|
|
64
|
+
const config = await loadConfig();
|
|
65
|
+
const project = resolve(cwd, config.outDir ?? `dist/${platform}`);
|
|
66
|
+
if (!existsSync(project)) throw new Error(`${project} 还没有构建,先运行 vtp-mini build ${platform}`);
|
|
67
|
+
const [file, fileArgs] = platform === "wx" ? [wechatCli(), [
|
|
68
|
+
"open",
|
|
69
|
+
"--project",
|
|
70
|
+
project
|
|
71
|
+
]] : ["npx", [
|
|
72
|
+
"--yes",
|
|
73
|
+
"minidev",
|
|
74
|
+
"ide",
|
|
75
|
+
"-p",
|
|
76
|
+
project
|
|
77
|
+
]];
|
|
78
|
+
const quoted = [file, ...fileArgs].map((part) => /\s/.test(part) ? `"${part}"` : part);
|
|
79
|
+
const result = spawnSync(quoted.join(" "), {
|
|
80
|
+
stdio: "inherit",
|
|
81
|
+
shell: true
|
|
82
|
+
});
|
|
83
|
+
process.exitCode = result.status ?? 1;
|
|
84
|
+
}
|
|
85
|
+
/** 模板在包里的 template 目录(src/cli.ts 与 dist/cli.js 都在它的上一级) */
|
|
86
|
+
const TEMPLATE = new URL("../template/", import.meta.url);
|
|
87
|
+
function create(dir) {
|
|
88
|
+
if (!dir) throw new Error("用法:vtp-mini create <目录>");
|
|
89
|
+
const target = resolve(cwd, dir);
|
|
90
|
+
if (existsSync(target) && readdirSync(target).length) throw new Error(`${target} 不是空目录`);
|
|
91
|
+
cpSync(TEMPLATE, target, { recursive: true });
|
|
92
|
+
renameSync(join(target, "gitignore"), join(target, ".gitignore"));
|
|
93
|
+
const own = JSON.parse(readFileSync(new URL("../package.json", TEMPLATE), "utf8"));
|
|
94
|
+
const manifest = JSON.parse(readFileSync(join(target, "package.json"), "utf8"));
|
|
95
|
+
manifest.name = basename(target);
|
|
96
|
+
Object.assign(manifest.dependencies, {
|
|
97
|
+
"@zerodep-dev/vue-tsx-pro-mobile": `^${own.version}`,
|
|
98
|
+
"@zerodep-dev/vue-tsx-pro-tsx": own.peerDependencies["@zerodep-dev/vue-tsx-pro-tsx"],
|
|
99
|
+
vue: own.peerDependencies.vue
|
|
100
|
+
});
|
|
101
|
+
Object.assign(manifest.devDependencies, {
|
|
102
|
+
"@zerodep-dev/vue-tsx-pro-mini": `^${own.version}`,
|
|
103
|
+
vite: own.peerDependencies.vite
|
|
104
|
+
});
|
|
105
|
+
writeFileSync(join(target, "package.json"), `${JSON.stringify(manifest, null, 2)}\n`);
|
|
106
|
+
console.log(`已建好 ${target}\n cd ${dir}\n npm install\n npm run dev # H5\n npm run dev:wx # 微信,另开一个终端 npm run open:wx`);
|
|
107
|
+
}
|
|
108
|
+
const HELP = `用法:
|
|
109
|
+
vtp-mini build [wx] [my] 构建两端(或指定的一端)
|
|
110
|
+
vtp-mini dev [wx|my] 监听模式(默认微信)
|
|
111
|
+
vtp-mini open [wx|my] 在开发者工具里打开产物(默认微信)
|
|
112
|
+
vtp-mini create <目录> 从模板建一个新项目`;
|
|
113
|
+
try {
|
|
114
|
+
if (command === "build") await build(platformsIn(args));
|
|
115
|
+
else if (command === "dev") await dev(platformsIn(args)[0] ?? "wx");
|
|
116
|
+
else if (command === "open") await open(platformsIn(args)[0] ?? "wx");
|
|
117
|
+
else if (command === "create") create(args[0]);
|
|
118
|
+
else console.log(HELP);
|
|
119
|
+
} catch (error) {
|
|
120
|
+
console.error(error instanceof Error ? error.message : error);
|
|
121
|
+
process.exitCode = 1;
|
|
122
|
+
}
|
|
123
|
+
//#endregion
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
//#region src/elements.ts
|
|
2
|
+
/** 标签 → 模板类型;没列出的都是 view */
|
|
3
|
+
const TEMPLATES = {
|
|
4
|
+
"#text": "x",
|
|
5
|
+
"#comment": "n",
|
|
6
|
+
svg: "svg",
|
|
7
|
+
img: "image",
|
|
8
|
+
input: "input",
|
|
9
|
+
textarea: "textarea"
|
|
10
|
+
};
|
|
11
|
+
const templateOf = (tag) => TEMPLATES[tag] ?? "v";
|
|
12
|
+
/** 浏览器里默认行内的标签:映射成 view 后挂 vtp-inline */
|
|
13
|
+
const INLINE = /* @__PURE__ */ new Set([
|
|
14
|
+
"a",
|
|
15
|
+
"abbr",
|
|
16
|
+
"b",
|
|
17
|
+
"code",
|
|
18
|
+
"em",
|
|
19
|
+
"i",
|
|
20
|
+
"kbd",
|
|
21
|
+
"label",
|
|
22
|
+
"mark",
|
|
23
|
+
"s",
|
|
24
|
+
"small",
|
|
25
|
+
"span",
|
|
26
|
+
"strong",
|
|
27
|
+
"sub",
|
|
28
|
+
"sup",
|
|
29
|
+
"u"
|
|
30
|
+
]);
|
|
31
|
+
/** 浏览器里默认行内块的标签 */
|
|
32
|
+
const INLINE_BLOCK = /* @__PURE__ */ new Set([
|
|
33
|
+
"button",
|
|
34
|
+
"select",
|
|
35
|
+
"textarea"
|
|
36
|
+
]);
|
|
37
|
+
/** 标签的默认显示方式对应的基础类(app 样式表里定义,见 build/styles.ts) */
|
|
38
|
+
function baseClassOf(tag) {
|
|
39
|
+
if (INLINE.has(tag)) return "vtp-inline";
|
|
40
|
+
if (INLINE_BLOCK.has(tag)) return "vtp-inline-block";
|
|
41
|
+
return "";
|
|
42
|
+
}
|
|
43
|
+
/** 浏览器里禁用后不派发 click 的表单控件 */
|
|
44
|
+
const FORM_CONTROLS = /* @__PURE__ */ new Set([
|
|
45
|
+
"button",
|
|
46
|
+
"input",
|
|
47
|
+
"select",
|
|
48
|
+
"textarea",
|
|
49
|
+
"fieldset"
|
|
50
|
+
]);
|
|
51
|
+
/** HTML 的布尔属性:值为 false 时等于没有这个属性(同 Vue 的 includeBooleanAttr) */
|
|
52
|
+
const BOOLEAN_ATTRS = /* @__PURE__ */ new Set([
|
|
53
|
+
"checked",
|
|
54
|
+
"disabled",
|
|
55
|
+
"hidden",
|
|
56
|
+
"multiple",
|
|
57
|
+
"open",
|
|
58
|
+
"readonly",
|
|
59
|
+
"required",
|
|
60
|
+
"selected"
|
|
61
|
+
]);
|
|
62
|
+
//#endregion
|
|
63
|
+
export { templateOf as i, FORM_CONTROLS as n, baseClassOf as r, BOOLEAN_ATTRS as t };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {}
|
package/dist/globals.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
//#region src/globals.ts
|
|
2
|
+
/**
|
|
3
|
+
* 小程序逻辑层缺的全局函数:组件库的依赖(animejs 等)在模块顶层就会取用,构建时排在打包入口最前面(build/index.ts)。
|
|
4
|
+
* 只补缺的,宿主已有的不动;都用 setTimeout 实现,逻辑层没有屏幕刷新的回调。
|
|
5
|
+
*/
|
|
6
|
+
const scope = typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : {};
|
|
7
|
+
/** 一帧按 16ms 算 */
|
|
8
|
+
const FRAME = 16;
|
|
9
|
+
const fill = (name, value) => {
|
|
10
|
+
if (typeof scope[name] === "undefined") scope[name] = value;
|
|
11
|
+
};
|
|
12
|
+
fill("setImmediate", (callback, ...args) => setTimeout(callback, 0, ...args));
|
|
13
|
+
fill("clearImmediate", (id) => clearTimeout(id));
|
|
14
|
+
fill("requestAnimationFrame", (callback) => setTimeout(() => callback(Date.now()), FRAME));
|
|
15
|
+
fill("cancelAnimationFrame", (id) => clearTimeout(id));
|
|
16
|
+
//#endregion
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { App, Component } from "vue";
|
|
2
|
+
//#region src/node.d.ts
|
|
3
|
+
/** 一个触点:视口坐标与页面坐标 */
|
|
4
|
+
interface MiniTouch {
|
|
5
|
+
readonly identifier: number;
|
|
6
|
+
readonly clientX: number;
|
|
7
|
+
readonly clientY: number;
|
|
8
|
+
readonly pageX: number;
|
|
9
|
+
readonly pageY: number;
|
|
10
|
+
}
|
|
11
|
+
/** 小程序事件转成的 DOM 风格事件:组件的 onClick、onTouchstart 收到它 */
|
|
12
|
+
interface MiniEvent {
|
|
13
|
+
readonly type: string;
|
|
14
|
+
readonly target: MiniNode;
|
|
15
|
+
currentTarget: MiniNode;
|
|
16
|
+
defaultPrevented: boolean;
|
|
17
|
+
/** 小程序原始事件的 detail(input 的 value 等) */
|
|
18
|
+
readonly detail: unknown;
|
|
19
|
+
/** 触摸事件:屏幕上的触点(同 TouchEvent.touches 的形状,只有坐标) */
|
|
20
|
+
readonly touches: readonly MiniTouch[];
|
|
21
|
+
/** 触摸事件:这次变化的触点(touchend 时 touches 已经空了,坐标在这里) */
|
|
22
|
+
readonly changedTouches: readonly MiniTouch[];
|
|
23
|
+
/** 键盘事件的键:输入框里按了键盘的确认键时是 Enter(小程序的 confirm 转成 keydown) */
|
|
24
|
+
readonly key?: string;
|
|
25
|
+
preventDefault(): void;
|
|
26
|
+
stopPropagation(): void;
|
|
27
|
+
}
|
|
28
|
+
type Listener = (event: MiniEvent) => void;
|
|
29
|
+
/** 节点所在的页面:节点变化时告诉它,它负责合并成 setData(page.ts) */
|
|
30
|
+
interface NodeHost {
|
|
31
|
+
/** 节点自己的字段变了(类名、样式、属性、文字) */
|
|
32
|
+
touch(node: MiniNode): void;
|
|
33
|
+
/** 节点的子节点列表变了 */
|
|
34
|
+
restructure(node: MiniNode): void;
|
|
35
|
+
}
|
|
36
|
+
export declare class MiniNode {
|
|
37
|
+
/** 模板里的 data-s,事件按它找回节点 */
|
|
38
|
+
readonly sid: string;
|
|
39
|
+
parent: MiniNode | null;
|
|
40
|
+
readonly children: MiniNode[];
|
|
41
|
+
/** 文本节点的文字 */
|
|
42
|
+
text: string;
|
|
43
|
+
/** 普通属性:aria-*、data-* 统一成连字符写法 */
|
|
44
|
+
readonly attrs: Map<string, unknown>;
|
|
45
|
+
/** 渲染时的事件属性(onClick 等):事件名 → 处理函数;随重新渲染整体替换 */
|
|
46
|
+
readonly handlers: Map<string, Listener[]>;
|
|
47
|
+
/** addEventListener 加上的 */
|
|
48
|
+
readonly listeners: Map<string, Listener[]>;
|
|
49
|
+
className: string;
|
|
50
|
+
/** 行内样式:Vue 的 style 绑定、动态样式的变量、样式绑定直接改的变量;排在类展开的样式后面 */
|
|
51
|
+
readonly inline: Map<string, string>;
|
|
52
|
+
/** 正被按着(:active) */
|
|
53
|
+
pressed: boolean;
|
|
54
|
+
/** 根节点才有:所在的页面 */
|
|
55
|
+
host: NodeHost | null;
|
|
56
|
+
/** Web 标签(div、span、button),文本节点是 #text,注释是 #comment */
|
|
57
|
+
readonly tag: string;
|
|
58
|
+
constructor(tag: string);
|
|
59
|
+
static text(text: string): MiniNode;
|
|
60
|
+
get nextSibling(): MiniNode | null;
|
|
61
|
+
/** 沿父节点找到页面 */
|
|
62
|
+
private get page();
|
|
63
|
+
/** 自己的字段变了 */
|
|
64
|
+
changed(): void;
|
|
65
|
+
insertBefore(child: MiniNode, anchor: MiniNode | null): void;
|
|
66
|
+
removeChild(child: MiniNode): void;
|
|
67
|
+
setChildren(children: MiniNode[]): void;
|
|
68
|
+
/** 属性的字符串值;没有这个属性时 undefined(布尔属性为 false 时也算没有) */
|
|
69
|
+
attribute(name: string): string | undefined;
|
|
70
|
+
setAttribute(name: string, value: unknown): void;
|
|
71
|
+
/** 输入框的值:用户输入时运行时随事件写回(page.ts),组件照 DOM 的写法读 `event.target.value` */
|
|
72
|
+
get value(): string;
|
|
73
|
+
/** 让输入框获得焦点:模板的 focus 属性;失焦时运行时去掉 */
|
|
74
|
+
focus(): void;
|
|
75
|
+
/** 让输入框失去焦点 */
|
|
76
|
+
blur(): void;
|
|
77
|
+
getAttribute(name: string): string | null;
|
|
78
|
+
removeAttribute(name: string): void;
|
|
79
|
+
addEventListener(type: string, listener: Listener): void;
|
|
80
|
+
removeEventListener(type: string, listener: Listener): void;
|
|
81
|
+
/** 样式引擎的绑定(bindings.ts)直接改变量用;赋值写法(vShow 的 style.display)也走这里 */
|
|
82
|
+
readonly style: {
|
|
83
|
+
setProperty(name: string, value: string): void;
|
|
84
|
+
removeProperty(name: string): void;
|
|
85
|
+
} & Record<string, unknown>;
|
|
86
|
+
/** 样式引擎的 css.select 就地换组合类用 */
|
|
87
|
+
readonly classList: {
|
|
88
|
+
add: (...names: string[]) => void;
|
|
89
|
+
remove: (...names: string[]) => void;
|
|
90
|
+
replace: (from: string, to: string) => void;
|
|
91
|
+
contains: (name: string) => boolean;
|
|
92
|
+
};
|
|
93
|
+
private updateClasses;
|
|
94
|
+
getBoundingClientRect(): {
|
|
95
|
+
x: number;
|
|
96
|
+
y: number;
|
|
97
|
+
top: number;
|
|
98
|
+
left: number;
|
|
99
|
+
right: number;
|
|
100
|
+
bottom: number;
|
|
101
|
+
width: number;
|
|
102
|
+
height: number;
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
//#endregion
|
|
106
|
+
//#region src/page.d.ts
|
|
107
|
+
/** 页面实例上要用到的部分(微信、支付宝相同) */
|
|
108
|
+
interface PageInstance {
|
|
109
|
+
setData(data: Record<string, unknown>, callback?: () => void): void;
|
|
110
|
+
}
|
|
111
|
+
/** 小程序事件里要用到的部分;支付宝的事件名是驼峰(touchStart),统一转小写 */
|
|
112
|
+
interface NativeEvent {
|
|
113
|
+
type: string;
|
|
114
|
+
/** 事件发生的时间:bind 的 touchmove 会沿祖先冒泡,同一次移动按它只处理一次 */
|
|
115
|
+
timeStamp?: number;
|
|
116
|
+
detail?: unknown;
|
|
117
|
+
currentTarget?: {
|
|
118
|
+
dataset?: Record<string, string>;
|
|
119
|
+
};
|
|
120
|
+
touches?: readonly NativeTouch[];
|
|
121
|
+
changedTouches?: readonly NativeTouch[];
|
|
122
|
+
}
|
|
123
|
+
/** 小程序事件里的触点:微信给 clientX / pageX,支付宝有的版本只给 pageX(页面坐标),缺的用另一个补 */
|
|
124
|
+
interface NativeTouch {
|
|
125
|
+
identifier?: number;
|
|
126
|
+
clientX?: number;
|
|
127
|
+
clientY?: number;
|
|
128
|
+
pageX?: number;
|
|
129
|
+
pageY?: number;
|
|
130
|
+
}
|
|
131
|
+
export declare function dispatchToCurrentPage(event: NativeEvent): void;
|
|
132
|
+
/** 页面的选项:交给小程序的 Page() */
|
|
133
|
+
export declare function pageOptions(component: Component, setup?: (app: App<MiniNode>) => void): {
|
|
134
|
+
data: {
|
|
135
|
+
root: {
|
|
136
|
+
cn: never[];
|
|
137
|
+
};
|
|
138
|
+
ss: {};
|
|
139
|
+
};
|
|
140
|
+
onLoad(this: PageInstance, query: Record<string, string>): void;
|
|
141
|
+
onUnload(this: PageInstance): void;
|
|
142
|
+
onShow(this: PageInstance): void;
|
|
143
|
+
onHide(this: PageInstance): void;
|
|
144
|
+
onReachBottom(this: PageInstance): void;
|
|
145
|
+
/** 模板上所有事件的入口(build/templates.ts) */
|
|
146
|
+
eh(this: PageInstance, event: NativeEvent): void;
|
|
147
|
+
/** 页面滚动:记下位置,通知组件(吸顶、回到顶部、下拉刷新) */
|
|
148
|
+
onPageScroll(this: PageInstance, { scrollTop }: {
|
|
149
|
+
scrollTop: number;
|
|
150
|
+
}): void;
|
|
151
|
+
};
|
|
152
|
+
//#endregion
|
|
153
|
+
//#region src/renderer.d.ts
|
|
154
|
+
/** 建一个渲染到 MiniNode 树上的 Vue 应用 */
|
|
155
|
+
export declare const createMiniApp: (component: Component, props?: Record<string, unknown>) => App<MiniNode>;
|
|
156
|
+
//#endregion
|
|
157
|
+
//#region src/lifecycle.d.ts
|
|
158
|
+
/** 页面显示(第一次进入,以及从别的页面、后台回来)时;组件 setup 里调用 */
|
|
159
|
+
export declare const onPageShow: (listener: () => void) => void;
|
|
160
|
+
/** 页面隐藏(进入下一页、切到后台)时 */
|
|
161
|
+
export declare const onPageHide: (listener: () => void) => void;
|
|
162
|
+
/** 页面滚到底时(加载更多);离底部多近算到底在页面配置的 onReachBottomDistance */
|
|
163
|
+
export declare const onReachBottom: (listener: () => void) => void;
|
|
164
|
+
/** 跳转的参数:值会转成字符串,页面组件的 query 属性里取回 */
|
|
165
|
+
type PageQuery = Record<string, string | number | boolean>;
|
|
166
|
+
/** 页面名 → 路径(构建时页面在 pages/<名字>/index) */
|
|
167
|
+
export declare function pageUrl(page: string, query?: PageQuery): string;
|
|
168
|
+
/** 打开另一个页面(压进页面栈,可以返回) */
|
|
169
|
+
export declare const navigateTo: (page: string, query?: PageQuery) => void;
|
|
170
|
+
/** 换成另一个页面(不能返回到当前页) */
|
|
171
|
+
export declare const redirectTo: (page: string, query?: PageQuery) => void;
|
|
172
|
+
/** 关掉所有页面,打开这一个 */
|
|
173
|
+
export declare const reLaunch: (page: string, query?: PageQuery) => void;
|
|
174
|
+
/** 返回上一页(或上几页) */
|
|
175
|
+
export declare const navigateBack: (delta?: number) => void;
|
|
176
|
+
//#endregion
|
|
177
|
+
//#region src/index.d.ts
|
|
178
|
+
/** 应用里的页面:页面名(pages/<名字>/index)→ 页面组件 */
|
|
179
|
+
export type PageMap = Readonly<Record<string, Component>>;
|
|
180
|
+
/** 构建产物导出的对象:各页面的 Page() 选项按名字取 */
|
|
181
|
+
export interface MiniPages {
|
|
182
|
+
readonly names: readonly string[];
|
|
183
|
+
page(name: string): ReturnType<typeof pageOptions>;
|
|
184
|
+
}
|
|
185
|
+
/** 声明应用的页面;setup 对每个页面的 Vue 应用调用一次(装插件、provide) */
|
|
186
|
+
export declare function definePages(pages: PageMap, setup?: (app: App<MiniNode>) => void): MiniPages;
|
|
187
|
+
//#endregion
|
|
188
|
+
export type { MiniEvent, PageQuery };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { a as onPageHide, c as pageUrl, d as createMiniApp, f as MiniNode, i as navigateTo, l as reLaunch, n as pageOptions, o as onPageShow, r as navigateBack, s as onReachBottom, t as dispatchToCurrentPage, u as redirectTo } from "./page-upnBSowU.js";
|
|
2
|
+
//#region src/index.ts
|
|
3
|
+
/** 声明应用的页面;setup 对每个页面的 Vue 应用调用一次(装插件、provide) */
|
|
4
|
+
function definePages(pages, setup) {
|
|
5
|
+
return {
|
|
6
|
+
names: Object.keys(pages),
|
|
7
|
+
page(name) {
|
|
8
|
+
const component = pages[name];
|
|
9
|
+
if (!component) throw new Error(`没有这个页面:${name}(已声明 ${Object.keys(pages).join("、")})`);
|
|
10
|
+
return pageOptions(component, setup);
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
//#endregion
|
|
15
|
+
export { MiniNode, createMiniApp, definePages, dispatchToCurrentPage, navigateBack, navigateTo, onPageHide, onPageShow, onReachBottom, pageOptions, pageUrl, reLaunch, redirectTo };
|