作用域 此包旨在让开发者全面掌控其生命周期,包括初始化过程。因此,不提供预初始化的全局作用域;开发者必须自行配置各个作用域。 所谓作用域,指的是一组相关功能集合成的单一实体。例如,backButton 和 mainButton 就是作用域的示例。这样的设计使得 SDK 使用起来更加直观和高效。 需要注意的是,作用域以下列形式提供: 💠组件. 它们同时作为变量和函数集导出。 例如,开发人员可以使用导出的 backButton 变量或 其替代函数集:showBackButton、mountBackButton 等。 ⚙️Utilities. 它们作为一组函数导出。 这些作用域是抽象的,并没有将 组合成一个变量。 例如,openLink、shareURL 等。 实际上,导出变量只是相同导出函数的组合。 因此,backButton.isMounted 和 isBackButtonMounted 本质上是同一个实体。 这里有一个例子: - import {2 A7 a! `3 u1 \$ \# J, ~/ A3 }9 m
- backButton,9 Z0 Y7 `+ N* s' b' E1 C. m
- hideBackButton,
- M; J% O- @; n3 W Y4 t F - isBackButtonVisible,
, ] _/ b5 F' b3 [% r8 X2 W - } from '@telegram-apps/sdk';% H& Z; A* ?8 v; C
- y7 T E0 m, `4 B9 |/ z$ j
- isBackButtonVisible(); // false
9 g2 r! g7 `4 ` - 4 M' |/ H. m% u! a7 I4 A
- backButton.show();1 ?) O' T/ B: `+ r* V
- // backButton.isVisible and isBackButtonVisible are the same
8 o1 D- `6 ?2 K" q - // entity (signal). We can say the same about backButton.show
& _4 J( V l: C - // and showBackButton.- S2 I' n4 E) H5 Q8 I' A9 s3 `
- //
- P" M5 m# o# T" T8 h1 L$ w. R# }5 } - // backButton.isVisible() -> true
1 ]& Z1 Z+ L' M1 o8 U - // isBackButtonVisible() -> true" j4 l0 i# i6 Z8 }; J3 x
- 0 r) J4 Y4 I8 Y0 \! r, C
- hideBackButton();
/ q/ m& v1 V' O, f1 i - // backButton.isVisible() -> false- `- H- R$ E( X, O( F
- // isBackButtonVisible() -> false
复制代码这里的关键区别在于最终的捆绑尺寸。 在内部,backButton 输出通过以下代码进行处理:
; m( n! \ i% k3 P! x- export * as backButton from 'somewhere';
复制代码 在构建应用程序时不使用软件包源代码时,bundler 更有可能 使 backButton 成为不可树状移动的对象。 因此,来自 somewhere 的所有依赖项都将被 捆绑,从而略微增加了最终捆绑包的大小(尽管不会增加很多)。
9 X7 Z. Z! L, Z2 a, Z优化捆绑包让我们看看如何更有效地使用软件包:- 只使用函数可以让捆绑程序树状分叉未使用的作用域代码。' m- ~; y% @, A
( s d& m1 x s2 d+ G
- import { showBackButton, backButton } from '@telegram-apps/sdk';
7 m2 `( @# m- i. a9 T - 0 z" G/ R2 ~) X, I3 w- B
- showBackButton();5 b9 ?& x6 [3 {) u7 u/ e/ m" J: f
- // Only showBackButton's source code will be bundled.! W$ H; m. i/ V" Q: A
- 6 k3 C0 ? Q3 p- B: R$ o3 K2 @$ e
- backButton.show();; r9 t! ]7 ^/ Y5 H
- // All backButton dependencies will be bundled, even
% p* x- Q) a. k6 Z% I4 p+ _# _0 c - // if not used in the code: backButton.show(),
7 G7 _; }! f' G% B+ O, Y - // backButton.hide(), backButton.isVisible(), etc.
复制代码- 配置捆绑程序以使用源代码,而不是内置版本。
/ }4 n# q- ]2 w2 u$ m `) N/ z' M % F2 u9 f: W" k: I" D4 V
- import { backButton } from '@telegram-apps/sdk';
9 q/ I/ X7 O) ~( e, y# ]& Q - ; L% D7 q) ]3 |% u
- backButton.show();
( o! o8 g& M/ M# {: @ - // Only backButton.show's source code will be bundled 4 p" }5 E, z( q( L4 r; v! i
- // because the bundler is smart enough to understand
) y# }% I A, e. p - // that backButton.show is just the showBackButton % E9 n# m' g' d9 g& p9 k
- // function, so only its source code is bundled.
复制代码下面是一个使用 resolve 选项的 Vite 配置示例:
* O3 O4 W7 Q$ U; d; i- ] R# T- import { defineConfig } from 'vite';0 I" L. ^5 ?; G" T
- import { resolve } from 'node:path';
: Y* H/ W6 e/ {" Z" B2 a - 9 W, K: a# u' N2 J
- export default defineConfig({
, a2 Y" N* F/ { X- f' ~ - resolve: {; i9 [2 _# e+ ]) w# j" [/ L, X
- alias: {
" R! R( t6 M9 N, E* \ O - '@telegram-apps/sdk': resolve('node_modules/@telegram-apps/sdk/src'), o% O5 b# N/ U
- },( E: d* b- P, V7 V' R/ V: p" u
- },
9 A4 x3 v4 E, ?" X; Q) Y - });
复制代码 " q. ?- ~' i' k; f _$ a& p$ g
6 v, `, K4 q+ R+ t1 _( D
3 B; z" D; G2 J2 v) @. Q
( w+ G# b9 @. t- S3 \7 Z$ @$ }
0 w7 ^+ _& W: U& {$ w$ K4 C! V: h- W/ r y! x( i+ t9 G( N
2 f4 g) d3 V( M6 W% |
$ g) `) `( S: |* J/ l' A; C
|