作用域 此包旨在让开发者全面掌控其生命周期,包括初始化过程。因此,不提供预初始化的全局作用域;开发者必须自行配置各个作用域。 所谓作用域,指的是一组相关功能集合成的单一实体。例如,backButton 和 mainButton 就是作用域的示例。这样的设计使得 SDK 使用起来更加直观和高效。 需要注意的是,作用域以下列形式提供: 💠组件. 它们同时作为变量和函数集导出。 例如,开发人员可以使用导出的 backButton 变量或 其替代函数集:showBackButton、mountBackButton 等。 ⚙️Utilities. 它们作为一组函数导出。 这些作用域是抽象的,并没有将 组合成一个变量。 例如,openLink、shareURL 等。 实际上,导出变量只是相同导出函数的组合。 因此,backButton.isMounted 和 isBackButtonMounted 本质上是同一个实体。 这里有一个例子: - import {8 j- c- c% N7 {0 G
- backButton,8 _) Y* e7 K+ h" ^$ f9 ~0 J; @
- hideBackButton,
, O' ^: \- o( ?% o/ w5 j* X - isBackButtonVisible,
1 j% l) W/ q7 x6 M - } from '@telegram-apps/sdk';
( X6 v$ O0 S3 C* E+ H) r) A
4 ^9 w3 w" m* X9 F$ ~3 v: B- isBackButtonVisible(); // false
- E1 N/ ]6 d9 ~' ~
9 R% L- {: [" I- backButton.show();, Y) F: [! z5 V/ F+ I5 L6 t* C
- // backButton.isVisible and isBackButtonVisible are the same
$ A3 |0 g+ Q" Q3 X) a2 K) v - // entity (signal). We can say the same about backButton.show * r. C% _) S9 X; W2 E9 c
- // and showBackButton.
. }) d2 F7 W/ | - //
1 H% n* i& Q4 i( Z - // backButton.isVisible() -> true
/ S; e1 y1 w. Z# ~ - // isBackButtonVisible() -> true
0 {& X; E% t; t' M& v - + X3 S( k6 y- |
- hideBackButton();% o* T G u9 _! i3 O" D
- // backButton.isVisible() -> false0 n: L- Q* R3 l+ K' ^( b
- // isBackButtonVisible() -> false
复制代码这里的关键区别在于最终的捆绑尺寸。 在内部,backButton 输出通过以下代码进行处理: 1 m) A! i% G1 ?
- export * as backButton from 'somewhere';
复制代码 在构建应用程序时不使用软件包源代码时,bundler 更有可能 使 backButton 成为不可树状移动的对象。 因此,来自 somewhere 的所有依赖项都将被 捆绑,从而略微增加了最终捆绑包的大小(尽管不会增加很多)。+ p( H5 Z; w" {
优化捆绑包让我们看看如何更有效地使用软件包:- 只使用函数可以让捆绑程序树状分叉未使用的作用域代码。- v; C: n6 u# K* f+ X! m
+ X/ s& G0 U5 n5 M4 k' b h- import { showBackButton, backButton } from '@telegram-apps/sdk';) k4 x4 \* E Z1 s3 s6 ^$ v. W* ]
- ' n* q; e; z" [( ]- r, w2 A
- showBackButton();
( ?* y* @' o, C% I' [3 j/ p3 v7 [5 C - // Only showBackButton's source code will be bundled.
s. E2 M$ G- K) v* z; T j - * ?* D: }+ U4 F$ V( w+ `
- backButton.show();# a- U- E7 ^$ c6 o0 |! @. s% A) v
- // All backButton dependencies will be bundled, even ; r c" ~0 G& q7 \7 y" B* b4 G
- // if not used in the code: backButton.show(), ; D9 T1 g* a+ H, p* D1 H" L0 T
- // backButton.hide(), backButton.isVisible(), etc.
复制代码- 配置捆绑程序以使用源代码,而不是内置版本。, S0 s+ ]3 v. h3 e. a, b
8 M" {. M3 a# J4 T- import { backButton } from '@telegram-apps/sdk';& F- e5 j( f' G6 e! U3 e
- 6 G$ |6 {5 ~' Y' p
- backButton.show(); X7 g! ?0 `- n# T2 @# B6 G1 l: D5 n
- // Only backButton.show's source code will be bundled
# V/ W! q: p8 [2 D% x - // because the bundler is smart enough to understand
6 t! \! ]0 {8 W9 ~0 {0 i4 } - // that backButton.show is just the showBackButton % {& L& C+ B. R/ e2 ^
- // function, so only its source code is bundled.
复制代码下面是一个使用 resolve 选项的 Vite 配置示例: $ [/ N/ R, t5 @6 n; w s
- import { defineConfig } from 'vite';3 |2 `4 t6 ^8 x+ F
- import { resolve } from 'node:path';
( j& J& r- t' e; ?( ~ - % x. \9 X0 ^* l3 \, l, Z! c/ q. e9 K9 c
- export default defineConfig({5 m( ]' k8 `$ m! L G
- resolve: {- `5 i! N) y' P9 y A$ D
- alias: {
& f: I- \! C" R5 z# D+ K% _ - '@telegram-apps/sdk': resolve('node_modules/@telegram-apps/sdk/src'),
) ?# l8 N+ x# f4 i: |( v - },7 I5 [, u8 b+ [) j+ j
- },, c& O; \8 X. F7 M
- });
复制代码 4 R% U* \0 |9 @
7 o: S5 D4 B$ Z6 e; n' z
; s6 D' {! e5 r L3 \4 o' N/ A& g: E4 R$ X+ j7 v" N4 X. x
) s8 n; X0 a, T. Z+ L
m S# K$ P1 h7 U( e, I, o. b" _
% W" I8 [# o. Y1 I8 [
1 p0 O w. |/ m |