作用域 此包旨在让开发者全面掌控其生命周期,包括初始化过程。因此,不提供预初始化的全局作用域;开发者必须自行配置各个作用域。 所谓作用域,指的是一组相关功能集合成的单一实体。例如,backButton 和 mainButton 就是作用域的示例。这样的设计使得 SDK 使用起来更加直观和高效。 需要注意的是,作用域以下列形式提供: 💠组件. 它们同时作为变量和函数集导出。 例如,开发人员可以使用导出的 backButton 变量或 其替代函数集:showBackButton、mountBackButton 等。 ⚙️Utilities. 它们作为一组函数导出。 这些作用域是抽象的,并没有将 组合成一个变量。 例如,openLink、shareURL 等。 实际上,导出变量只是相同导出函数的组合。 因此,backButton.isMounted 和 isBackButtonMounted 本质上是同一个实体。 这里有一个例子: - import {
% }. \0 R+ |0 ` - backButton,
* W3 ?; {3 f# s" p2 H# _3 o8 X- Q - hideBackButton,6 |: Z1 M# V! O( H+ F7 }4 H- |% \
- isBackButtonVisible,3 v, r) V- }3 k
- } from '@telegram-apps/sdk';2 ~4 T% L) \2 C$ C5 \) L: q
* E( M" H- F7 Y) e: f1 {- isBackButtonVisible(); // false
7 g% G2 E3 v, k O# K
/ d# ~, u$ x) p" `/ u/ T) U, j- backButton.show();/ I ]- G4 O- W" z
- // backButton.isVisible and isBackButtonVisible are the same 6 ~6 i: S! f" \% i
- // entity (signal). We can say the same about backButton.show ) M: E- }9 p' E; w, h; |
- // and showBackButton.7 i1 @9 y- Q" I' E% U8 ~0 w
- //3 P9 b7 L& Z7 F; h, ^4 D
- // backButton.isVisible() -> true4 B5 W1 B- i+ C8 s; P5 h
- // isBackButtonVisible() -> true
9 l& V( l8 A/ l4 |( ] - ( T( F9 f5 V4 i/ C7 a5 r
- hideBackButton();
9 p3 t) g3 O C k - // backButton.isVisible() -> false
% s: p: [9 M" `- b) u5 _ - // isBackButtonVisible() -> false
复制代码这里的关键区别在于最终的捆绑尺寸。 在内部,backButton 输出通过以下代码进行处理:
, U$ Y% H. [+ j# L# G- export * as backButton from 'somewhere';
复制代码 在构建应用程序时不使用软件包源代码时,bundler 更有可能 使 backButton 成为不可树状移动的对象。 因此,来自 somewhere 的所有依赖项都将被 捆绑,从而略微增加了最终捆绑包的大小(尽管不会增加很多)。, {1 H% X. G9 u, b$ q' P
优化捆绑包让我们看看如何更有效地使用软件包:- 只使用函数可以让捆绑程序树状分叉未使用的作用域代码。
( ]4 X" W/ S9 Y" M9 V7 k6 Q
D8 \& f( m% f: h" ^) U; n- import { showBackButton, backButton } from '@telegram-apps/sdk';5 X; e" h& f+ Z
- 3 A3 S& Y4 _& c" r) R; n
- showBackButton();
% Q* L2 d0 K/ e p& o9 c - // Only showBackButton's source code will be bundled.
2 U: D3 l- {! g T( }( M
' i2 f0 h6 x- d, ] [1 u! z# | o- backButton.show();
0 }- q( J7 T, y* r) U& r - // All backButton dependencies will be bundled, even 1 e; M' t) g6 m6 E, t
- // if not used in the code: backButton.show(),
' J. k/ {3 i, j; u/ v7 x- e" w3 | - // backButton.hide(), backButton.isVisible(), etc.
复制代码- 配置捆绑程序以使用源代码,而不是内置版本。5 L: p" M! v4 L1 E1 L' l& O+ P
8 w" m, {, M7 G
- import { backButton } from '@telegram-apps/sdk';# u- ^. R g5 [& Y% v( d8 F
4 b* Z5 J4 { u- backButton.show();; C2 s1 P& p1 d6 L ?2 m
- // Only backButton.show's source code will be bundled
! w% U! g, V8 j& @; s. C - // because the bundler is smart enough to understand
+ \9 D9 Y8 n4 x" j5 p4 e3 Q" C - // that backButton.show is just the showBackButton 6 k% F+ r5 n! K2 G5 C
- // function, so only its source code is bundled.
复制代码下面是一个使用 resolve 选项的 Vite 配置示例: 7 i2 W0 p9 G# w- x2 B& o
- import { defineConfig } from 'vite';/ c' `/ H( T1 Y8 I1 g W$ R
- import { resolve } from 'node:path';
$ M N% [+ F* U - - j+ @9 A0 ~" \! {- _6 h4 @
- export default defineConfig({, {/ g% j! w& E5 c1 u
- resolve: {
2 `: F' g @! C8 [& H - alias: {0 i+ K1 B! L9 |9 m" d
- '@telegram-apps/sdk': resolve('node_modules/@telegram-apps/sdk/src'),- K9 Y5 k3 K7 A1 t. |1 m
- },2 K" e+ ^) a, C& h4 A D" K
- },
0 W: H- r: V4 K( i - });
复制代码
. J3 K% o+ i# k9 U. U" D: s/ `& y' F" B+ t8 g; y, T
8 x2 x- _: K4 {/ {! x. J, ]
, Z% g: |& W4 F7 Q, C. _+ M" n7 Q, @: L
: s" i3 E; U; C9 v5 X' W f7 Q1 L, k$ U
% `. C& Z9 R3 }% o5 n9 r% \" j |