本帖最后由 riyad 于 2025-2-21 19:28 编辑
# T$ ]+ P+ ~1 b, u1 d# c4 B e& l2 |$ @
简而言之,所有迷你应用程序都是典型的网络应用,每个应用程序都需要独立的 URL 来获取和展示内容。Telegram 不为开发者的应用提供存储空间,因此开发者需要为自己的应用创建存储空间并获取 URL。
1 w& g! _; o' s7 D s% V& u8 d4 X
Telegram 只接受具有有效 SSL 证书并使用 HTTPS 协议的链接。与生产环境不同,测试环境允许直接使用 IP 地址。 " }$ p2 E- F! F5 t) h5 E0 o
尽管我们可以使用测试环境来开发应用程序,但环境 往往无法显示出良好的性能。 如果在 测试环境中遇到低性能问题,请考虑切换到生产环境。 * T- [+ S, {' S1 ~
导言
& J( L7 ?4 A/ c. O2 k' Y在深入了解本指南之前,首先需要了解为什么我们需要一些链接。通常情况下,我们需要应用链接来实现以下目的之一: 用于开发:这些链接是临时的,仅用于通过开发服务器展示应用程序。它们还可以用来与其他用户分享,展示当前的进度。. \* m! D3 ^# Z( |+ T. Z
用于生产:这些链接用于在生产环境中访问应用程序,通常是供普通用户使用的。 本指南将涵盖这两种情况。在 React.js 的模板中,您可以找到实际的链接生成和使用方法。 接下来的章节将使用 Vite作为应用程序的基本打包工具。
6 z% J; U9 g0 ~3 U; v3 f
关于开发
% y3 P- V1 U0 H7 n应用程序的开发过程被认为是一个持续不断的过程。长期运行的应用程序总是需要维护,为此,应该通过降低准入门槛和减少由此产生的认知负荷来优化这一过程。 开发链接用于查看应用程序当前的开发状态。这些链接可以分为两类:本地链接和远程链接。让我们来仔细看看。
9 X, ^2 ~9 ]# F) O6 n8 a
WARNING 开发链接不应在生产中使用。 生产链接不应是动态的 ,必须引用提供迷你应用程序内容的服务器。 在本地环境
: y3 J5 C+ o. o2 o用于开发的本地链接是指仅对当前设备可用的链接。 流行的打包工具(如 Vite)提供了运行本地服务器的功能,用于开发。因此,您将获得一个可以在 BotFather 中使用或直接在浏览器中打开的 IP 地址。 7 O4 f2 p( R, g( f/ m P( i1 N
以下是运行开发服务器并返回开发链接的基本 Vite 配置。
4 i+ S, u# E) j
- import { defineConfig } from 'vite';
9 Z3 K$ r) O% d/ U& t4 p - & x, ^, H. J1 L& w8 @
- export default defineConfig();</font>
复制代码
4 V) t$ i' y+ g/ A1 }你会在控制台中看到一条信息: - VITE ready in 112 ms
; Z3 b* Y# D" ~9 {1 b, z5 ^4 |8 `( n
f. R: H! S' j" h3 I2 f- ➜ Local: http://localhost:5173. a8 r, @! C9 g3 m1 ^
- ➜ press h + enter to show help</font>
复制代码您可能已经注意到,该链接不符合 BotFather 的要求,因为它必须使用 HTTPS 协议。接下来,我们来获取 HTTPS 链接。
1 q# i4 I, F$ _ Vite 插件[color=var(--vp-c-brand-1)]Vite 的生态系统提供了 @vitejs/plugin-basic-ssl 插件。 允许在指定域上使用自签名 SSL 证书启动应用程序。 下面是一个基本例子: - import { defineConfig } from 'vite';4 V5 t% v( I' w* H8 w
- import basicSsl from '@vitejs/plugin-basic-ssl';, B& Z5 f7 O9 Y4 ~* C6 }
- 7 T6 t) r" u# k6 K/ L0 b8 G' Z- N
- export default defineConfig({0 t( z2 ]4 S' N8 \, K! i4 [
- plugins: [: K* A' G! l& a7 D- [% m1 ]6 z
- basicSsl(),
- }% b8 w' ]: m& |: E6 ^4 Z - ],
7 d! \% P7 }* |: v" N - });</font>
复制代码您可能会发现还有一些其他有用的选项。 要了解更多相关信息,请访问 插件的 文档 。 启动开发服务器后,您会看到类似的信息: - VITE ready in 275 ms
" i) {) B( [: q. t& E
& F4 K! s, l7 Z( ?4 j- l- ➜ Local: https://localhost:5173" b$ r1 ?/ ^9 s- Z
- ➜ press h + enter to show help</font>
复制代码本地链接 (https://localhost:5173) 指向本地开发服务器。在浏览器、Telegram for macOS、Telegram Desktop 或 Telegram Web A/K 中打开此链接时,会出现一条与不信任证书相关的警告消息。 只需将此作为例外,然后继续申请。 mkcert
$ Q4 o: C; v2 ^7 nmkcert 是一个允许开发人员生成 SSL 证书及相关私钥的工具。它还会创建一个证书颁发机构,使本地设备信任生成的证书。以下是安装指南。 比方说,您想创建一个只有您的设备知道的自定义域,仅用于开发目的。 让它类似于 tma.internal。 为了让当前设备 知道哪个 IP 与该域相关联,我们应该修改 hosts文件,并将 tma.internal 映射到 127.0.0.1。 然后,运行指定该域的 mkcert 工具,就会收到两个文件:SSL 证书和私钥。 这两个文件都应在 Vite 配置中指定。 下面是使用 mkcert 生成的实体配置 Vite 开发服务器的示例: - import { defineConfig } from 'vite';2 Z) I6 n. }. w. g8 d% q- }
- import { resolve } from 'node:path';
+ C* k K8 h6 h5 X2 G - import { readFileSync } from 'node:fs';
$ |( ?1 g5 U6 n" u/ F* K
' P- u; V( W5 F- export default defineConfig({! A) B: P2 x# Q% h" ^& h/ n ?6 a
- server: {. Z- c9 m3 d7 `1 x
- host: 'tma.internal',5 h0 _; y' }- b; z7 a' }. o( f
- https: {; A& a' A8 t! S# r
- cert: readFileSync(resolve('tma.internal.pem')),5 T) e0 ^5 g n- t* E7 u: f
- key: readFileSync(resolve('tma.internal-key.pem')),
- o/ K n5 T( m# i% ] - },
( H, b) h' R1 y - },/ O+ d* Q3 { J% X/ Z7 q
- });</font>
复制代码网络 有时,开发人员需要在不同设备上打开应用程序。我们可以通过在 Vite 中使用 host 选项来实现这一功能。 - import { defineConfig } from 'vite';, e7 A; M, X: o, F
- , u: j/ `2 ?* u# W" W+ r+ a. h' [( n
- export default defineConfig({
3 s8 ?8 b3 U2 z - server: {' `: R5 e& h% {8 P
- host: true,! B0 T& v1 D+ L5 E; W
- },7 z: l$ Z E" ?4 e
- });</font>
复制代码或者,我们可以使用以下命令:vite --host. 启动开发服务器后,您会在控制台中看到类似的信息: - VITE v5.2.12 ready in 15 ms
9 P( z% R, h0 r! f0 ~& I& |; E/ S( A
7 R& U3 j( Y7 O8 H* {; s V- ➜ Local: http://localhost:5173; p# X0 C; V( i$ o
- ➜ Network: http://172.20.10.8:5173
' |* P& k9 r0 p4 y0 f% D( R; k - ➜ press h + enter to show help</font>
复制代码现在,你可以在同一网络的设备上访问 "网络 "链接 (http://172.20.10.8:5173)。 要获取 HTTPS 链接,请参阅本指南的前几节。 5 H: ]/ ^- _/ b, h. W7 a9 Z
* \) F% @5 `) U l8 u' u
用于生产获得生产链接也并非难事。 为此,您可以使用流行的免费 静态服务:
: G1 k9 D/ |/ r, r y% O( Y, t* P5 F) J: {0 m+ I! u2 E
+ t! W' w7 t- b5 n$ z% w/ O ^2 r' M7 I8 n5 g/ F( p. g2 w m
. z; q3 ?/ U8 `. U) Z7 z |