本帖最后由 riyad 于 2025-2-21 19:28 编辑 ( c: W$ P3 O/ ~; J
0 v. `: m8 M2 E4 d4 ?* N$ \' h
简而言之,所有迷你应用程序都是典型的网络应用,每个应用程序都需要独立的 URL 来获取和展示内容。Telegram 不为开发者的应用提供存储空间,因此开发者需要为自己的应用创建存储空间并获取 URL。 $ y4 ^8 m2 `$ V0 H
Telegram 只接受具有有效 SSL 证书并使用 HTTPS 协议的链接。与生产环境不同,测试环境允许直接使用 IP 地址。 9 r2 q2 r: ~% D/ O: n
尽管我们可以使用测试环境来开发应用程序,但环境 往往无法显示出良好的性能。 如果在 测试环境中遇到低性能问题,请考虑切换到生产环境。 ' z7 r* `" g' U% Y& ~! @
导言
0 D) \) A7 b1 G6 }! P2 C& \5 W在深入了解本指南之前,首先需要了解为什么我们需要一些链接。通常情况下,我们需要应用链接来实现以下目的之一: 用于开发:这些链接是临时的,仅用于通过开发服务器展示应用程序。它们还可以用来与其他用户分享,展示当前的进度。9 ^" a9 ~1 H: }
用于生产:这些链接用于在生产环境中访问应用程序,通常是供普通用户使用的。 本指南将涵盖这两种情况。在 React.js 的模板中,您可以找到实际的链接生成和使用方法。 接下来的章节将使用 Vite作为应用程序的基本打包工具。 * Q/ k0 v7 r* ?1 a3 C1 C
关于开发
/ @6 m6 p/ ]4 K# J应用程序的开发过程被认为是一个持续不断的过程。长期运行的应用程序总是需要维护,为此,应该通过降低准入门槛和减少由此产生的认知负荷来优化这一过程。 开发链接用于查看应用程序当前的开发状态。这些链接可以分为两类:本地链接和远程链接。让我们来仔细看看。 2 }' N! l% L/ P) i& Q8 s4 l- o% |4 D4 H
WARNING 开发链接不应在生产中使用。 生产链接不应是动态的 ,必须引用提供迷你应用程序内容的服务器。 在本地环境
$ n+ o0 i) F% z: t用于开发的本地链接是指仅对当前设备可用的链接。 流行的打包工具(如 Vite)提供了运行本地服务器的功能,用于开发。因此,您将获得一个可以在 BotFather 中使用或直接在浏览器中打开的 IP 地址。
' B. L) N- p7 e+ _
以下是运行开发服务器并返回开发链接的基本 Vite 配置。
3 U! Q9 }* S. y0 @" i# c. K
- import { defineConfig } from 'vite';- @9 S& q* y; V$ Q t8 s* v7 |6 \( o
- + f& _1 b+ R o; W+ |7 ^
- export default defineConfig();</font>
复制代码 $ p- [; C1 I) ^9 q z
你会在控制台中看到一条信息: - VITE ready in 112 ms% b. S8 z8 H8 @" ? i- M
- - Q: ?- L2 w, |1 `0 ?8 p5 S
- ➜ Local: http://localhost:5173
* u. d& ?" @/ X. t! f" c( ~) C - ➜ press h + enter to show help</font>
复制代码您可能已经注意到,该链接不符合 BotFather 的要求,因为它必须使用 HTTPS 协议。接下来,我们来获取 HTTPS 链接。
4 t; @5 Z, }2 i Vite 插件[color=var(--vp-c-brand-1)]Vite 的生态系统提供了 @vitejs/plugin-basic-ssl 插件。 允许在指定域上使用自签名 SSL 证书启动应用程序。 下面是一个基本例子: - import { defineConfig } from 'vite';
/ F% x5 v1 ^. K9 e7 _6 _$ b - import basicSsl from '@vitejs/plugin-basic-ssl';" h" {+ o1 ^- D1 N% \4 a
- , v$ m; F& z4 J5 A0 |! w
- export default defineConfig({4 ?7 \/ C4 C3 T1 l* h: c
- plugins: [
# k3 M2 c( b0 e - basicSsl(),$ n; p/ w1 w/ u: A
- ],! F5 @. F" p% N; X% Q& ]& z
- });</font>
复制代码您可能会发现还有一些其他有用的选项。 要了解更多相关信息,请访问 插件的 文档 。 启动开发服务器后,您会看到类似的信息: - VITE ready in 275 ms- A) q. V& q( z% g
* ]/ V3 u1 `1 c" Z4 V- ➜ Local: https://localhost:5173
& L6 _1 ]2 H; T& x$ | - ➜ press h + enter to show help</font>
复制代码本地链接 (https://localhost:5173) 指向本地开发服务器。在浏览器、Telegram for macOS、Telegram Desktop 或 Telegram Web A/K 中打开此链接时,会出现一条与不信任证书相关的警告消息。 只需将此作为例外,然后继续申请。 mkcert
' K3 M# E! {/ E& F" rmkcert 是一个允许开发人员生成 SSL 证书及相关私钥的工具。它还会创建一个证书颁发机构,使本地设备信任生成的证书。以下是安装指南。 比方说,您想创建一个只有您的设备知道的自定义域,仅用于开发目的。 让它类似于 tma.internal。 为了让当前设备 知道哪个 IP 与该域相关联,我们应该修改 hosts文件,并将 tma.internal 映射到 127.0.0.1。 然后,运行指定该域的 mkcert 工具,就会收到两个文件:SSL 证书和私钥。 这两个文件都应在 Vite 配置中指定。 下面是使用 mkcert 生成的实体配置 Vite 开发服务器的示例: - import { defineConfig } from 'vite';) o7 S0 \: t% j2 X n# ?' `
- import { resolve } from 'node:path';
( O8 F! Z" o8 _3 O - import { readFileSync } from 'node:fs';. q, ~* ?- _: c2 f6 C+ X
- 0 o$ {% H+ b2 h% |2 m- k* p L
- export default defineConfig({1 D# z& _ A- ~3 [6 R: e
- server: {9 }: B' }- }7 Q! _5 j0 W# Z2 |: _
- host: 'tma.internal',& J2 \2 _6 v& J2 u; f! o+ X
- https: {5 N- q/ W& k, C# L i8 G
- cert: readFileSync(resolve('tma.internal.pem')),
/ Y% d% i* ]' H3 S5 i" E: N! j - key: readFileSync(resolve('tma.internal-key.pem')),! {& D' e6 \/ \# F' z
- },
; g0 v3 ^+ p2 y3 e6 _% y - },- S9 N0 l' e" p
- });</font>
复制代码网络 有时,开发人员需要在不同设备上打开应用程序。我们可以通过在 Vite 中使用 host 选项来实现这一功能。 - import { defineConfig } from 'vite';
4 T8 k" D* P' a# E
4 A+ `7 @+ V; z6 H. U- export default defineConfig({
( v: x" x& l; d - server: {
& k# D3 N! i8 V7 N* X( c& _! G7 [9 \ - host: true,
1 P0 n+ ^, g' n- @' I - },
% d, I, `7 S* n a' ] - });</font>
复制代码或者,我们可以使用以下命令:vite --host. 启动开发服务器后,您会在控制台中看到类似的信息: - VITE v5.2.12 ready in 15 ms
7 P7 b4 i4 m! g/ d: T# p
k5 g# ], O/ u- ➜ Local: http://localhost:5173
$ U6 k* {& z" B - ➜ Network: http://172.20.10.8:5173
4 h; C M3 s$ z' B8 ^ - ➜ press h + enter to show help</font>
复制代码现在,你可以在同一网络的设备上访问 "网络 "链接 (http://172.20.10.8:5173)。 要获取 HTTPS 链接,请参阅本指南的前几节。
: z$ ^2 G$ o; B% \- r: M9 O8 J* x* E/ r$ j" x! |0 ^
用于生产获得生产链接也并非难事。 为此,您可以使用流行的免费 静态服务:
. h+ y, K* _% `7 r" Q( j1 Z ], j v) F' Z2 Q4 W- P
w; N8 U+ w" I J M
, J" A$ ?* i* T2 L% }) r5 ?5 V7 R, |3 P# E) p# B8 U
|