本帖最后由 riyad 于 2025-3-11 23:12 编辑
; S6 S$ K! K- W' Z8 |# r/ w
3 b8 t& I+ |# V% f2 V( PGitHub Pages 是发布 dApp 的理想平台,适用于开发和生产。它是免费的开源托管服务,支持 HTML/CSS/JS 静态网站,并允许自定义域名。 GitHub Pages 仅支持静态网站,避免了中心化的后台依赖,符合 dApp 的去中心化原则。此外,它基于 Git 仓库,便于社区管理,支持协作开发和分叉。任何人都可自由创建独立版本并发布。 - echo "# first_contract_front_end" >> README.md
- ^3 ?& E. s8 x* Z) M - git init) W, ?6 T" d! t5 l" p7 i
- git add README.md
1 ^- d c1 D: k - git commit -m "first commit"+ g& t' s) c9 a0 y% b3 N
- git branch -M main
% A/ q1 i5 I) O* t0 H% l) x" b4 e+ U - git remote add origin https://github.com/markokhman/first_contract_front_end.git1 C7 D! y( n) e
- git push -u origin main
复制代码我们从这里开始: - git init* Y4 j# H [, b& u: I
复制代码Git 仓库已初始化,而且我们已经有了 .gitignore 文件。好极了。现在把所有东西都加进去吧:
8 J3 b' |: B g C8 W- git add .
6 k6 g% P9 r% Z% C- b
复制代码提交初始提交:
8 s2 \" Q( w' U: t% D% A: |8 p- git commit -m "Initial commit"
: a* j' h/ G+ Q8 }
复制代码现在,我调用我们的远程源,即之前从 GitHub 仓库复制的链接: - git remote add origin https://github.com/xxxxxxxx/first_contract_front_end.git
. f; K7 E+ Z9 @, C
复制代码然后,我进行首次推送,其中包括我们的初始代码: - git push origin master
* }, |/ v0 s& \* S
复制代码在 GitHub Pages 上托管网站,我们使用用户名和仓库名称作为子域。例如,我的用户名 Markokhman 加上 github.io 形成域名。 & S: {; O0 ?3 N# Y% d
接下来,需要创建清单文件以准备发布。转到 main.tsx,找到清单文件的 URL,并在 public 文件夹下创建 tonconnect-manifest.json,其中包含网站的 URL。 - "url": "https:///join.toncompany.org"
' ~3 E4 r$ P5 ]; g" M, Y* R
复制代码那我们就用这个名字: - "name": "TON&Co. Tutorial"
9 F) K! A7 _0 g8 l5 v
复制代码 然后是图标 URL。我们希望它也成为资源库的一部分。因此,我现在要在公共文件夹中放置一个图标文件,但稍后我会在这里创建一个适当的 URL,一旦我们部署了这个文件,它就会指向这个文件。目前,链接看起来是这样的,因为一旦我们构建了项目,公共文件夹实际上会解析到根目录:
2 L0 c7 [5 S; ]# z* w( n3 F r; A- "iconUrl": "https://xxxxxxxxx.github.io/first_contract_front_end/icon.png") V3 e9 Y. W& V. w; r" s7 G
复制代码这就是我们全新的清单文件: - {
1 z2 i/ X) W- o/ r! t# T" t4 B: E0 \ - "url": "https://join.toncompany.org",* s+ L# @' k1 u1 R/ v
- "name": "TON&Co. Tutorial",: j% f7 ~, O5 K& |
- "iconUrl": "https://xxxxxxxxxxxx.github.jo/first_contract_front_end/icon.png", C2 }- H* V8 z* y
- }
复制代码现在,我们前往 main.tsx 文件,在这里编写一个合适的 URL: - const manifestUrl = "https://xxxxxxxxxxxx.github.io/first_contract_front_end/tonconnect-manifest.json"
# K3 A$ Y4 b# E8 _" i( \8 u
复制代码现在我们需要做的最后一件事是准备好 vite 本身,以便为我们正确构建。如图所示,vite 配置有一个基础: - // https://vitejs.dev/config/* }, U+ l0 d1 D8 [' L- `
- export default defineConfig({# a2 ^) d$ x1 ^5 _
- plugins: [react (), nodePolyfills()],5 L; N. R) q7 w7 ^3 m" S3 _
- base: "/",
1 A7 d7 Y7 c5 H' x5 f+ c; W% @ - });
复制代码 这个 base 不会是 root,因为我们还有另一个 base:在我的例子中是 first_contract_front_end。这是 GitHub 的规则:仓库名称必须是基本路径。所以我们就把它作为项目的基础:
) P5 r: x9 E% T7 U* b3 n2 `4 a) ?8 O- // https://vitejs.dev/config/
3 I9 `, P% r% W( t* a - export default defineConfig({
7 V8 L$ z, Y8 r* m l2 X' S - plugins: [react (), nodePolyfills()],
. C9 a+ B% e4 _9 J - base: "/first_contract_front_end/",
! `2 S6 s* f5 s" y. }- n& F/ N) i - });
复制代码 创建 GitHub 工作流程至此,我们已经掌握了现有的代码,但还有一件事要做。首先,我们运行 - yarn build
5 {2 G* f- T7 A7 l; K, }
复制代码我们需要构建项目,因为 TypeScript 代码无法直接在浏览器中运行。构建后的文件存放在 dist 文件夹中,但该文件夹通常被 gitignored,因此不会被推送到 GitHub。 GitHub Pages 依赖特定分支来托管网站内容,因此我们可以创建一个专用分支,仅包含 dist 文件夹的内容,并将其链接到 GitHub Pages 的 URL。为了自动完成这一过程,我们使用 GitHub Actions 工作流。 在项目根目录下创建 .github/workflows/ 文件夹,并在其中新建 deploy.yml,粘贴以下代码即可自动部署网站。 - name: Deploy8 |% ?' ~) t h1 A1 U
- ' `. U) o+ D; N; }
- on:
7 D9 z+ B0 V* @* |4 I5 ^ - push:4 C* J7 ^7 f: [9 {) F# p
- branches:5 g* h2 n0 }1 p
- - master
: \, q$ i0 ~+ C! G( Z7 E9 x: l - 9 S0 p( g* F6 l& g5 o. Y' O
- jobs:
, Y' s3 C" R, {: ^ - build:! p2 L( {8 K& N* ~
- name: Build! l5 A! }0 C8 r& o) F7 R
- runs=on: ubuntu-latest
5 x: m# C6 W' Y5 L2 v - / j3 v+ x$ a, h, M1 c/ {6 Y
- steps:
6 L3 C! g: Q6 V' A - - name: Checkout repo. I5 `, x: C0 m8 G
- uses: actions/checkout@v29 [+ z4 V: E* G
- O- b" ?$ B: J( B# U) ^0 S1 W$ K
- - name: Setup Node+ A7 `. L8 [& o
- uses: actions/setup-node@v1
9 `$ B& u# ]* u6 h5 u3 Q - with:
: l0 T( Z# }$ y$ u+ X7 q - node-version: 16% r- ]9 h ?( X* D5 g4 b: M
- # M. h8 i" @- c
- - name: Install dependencies
; N3 i1 U/ v) T; v+ e/ a- e - uses: bahmutov/npm-install@v1
# O& g/ t. B# Y, Z/ o
' [$ R4 j4 v% a+ a+ {/ u. o8 I" v- - name: Build project) l; A0 C) l% J! ~
- run: npm run build
3 a- E8 G3 q& q `! R
* Q. y2 s7 @# W- - name: Upload production-ready build files
' t) i$ Y$ W3 a) M: X) ]( j/ E8 _. R4 a - uses: actions/upload artifact@v2* X& w6 H. R# }% N% [
- with:5 d+ E7 O- X I5 O' o' ~
- name: production-files- i) K f6 d; S2 f' B
- path: ./dist# i- E+ G! K3 _' G; L8 \# q, s) f
8 e% b! K1 J5 `1 n# O9 I( ?" D- deploy:
$ p u% X* d5 j7 F. O. y - name: Deploy: t; G+ c6 ~1 |8 F
- needs: build
+ G% U; Q( c# A+ W' G0 C - runs-on: ubuntu-latest
$ I) |: M! C! X% {8 A5 o - if: github.ref == 'refs/heads/master'( R+ m/ k- z+ }* t
- " a6 y! J$ b F. H: ~7 x8 y' R& `
- steps:
+ Z4 J2 X& R: i* A - - name: Download artifact2 d& M4 p0 Y" E" Y! w
- uses: actions/download-artifact@v2
8 f) c' |$ Z/ c( Z& g8 s% U - with:4 \0 Y1 `: ^2 h: f
- name: production-files
- O9 e b6 ?2 Q- _ P7 {2 r - path: ./dist9 o w+ a9 |1 W6 ?
% P) B4 L& _' ~0 s2 [, |- - name: Deploy to GitHub Pages) S( t: N5 G. e/ A
- uses: peaceiris/actions-gh-pages@v3% W& O2 ^' a8 U/ Y- M
- with:) D% b% G4 R9 p) O0 e
- github_token: ${{ secrets.GITHUB_TOKEN }}& z. W1 n& ^8 X6 ]3 d* F6 A8 N
- publish_dir: ./dist
复制代码这个部署工作流会在主分支推送时自动触发,包括 构建 和 部署 两个步骤。 构建阶段 指定运行环境,配置 Node.js 版本,并执行 npm install。最终会生成 dist 文件夹,其中包含编译后的文件,就像本地构建一样。 部署阶段 负责下载 dist 文件夹的工件,并将其推送到 GitHub Pages 分支,以便网站自动更新。 保存并提交 deploy.yml 后,检查 Git 状态 (git status),确保 vite.config.ts 和 tonconnect-manifest.json 已更新。然后运行: - git commit -m "Workflow"6 B' s$ B5 z1 @& @2 o- Z, |
复制代码很好,我们已经准备好了这个工作流!我们进入 GitHub 仓库设置,"操作">"常规",确保工作流权限设置为 "读写";否则我们将无法创建文件夹。 推送代码下一步是推送我们提交的内容。回到 .gitignore 并使用以下命令: - git push origin master
+ H& q- T- f# c% w
复制代码前往 GitHub 仓库中的 "操作 "选项卡,查看工作流程的运行情况。如有必要,请刷新:
- k! z8 `$ c m7 `您可以点击一个工作流程,查看它目前正在做什么: ( t3 @2 b* {: m5 F, H
这个工作流的最终结果是一个名为 gh-pages 的新分支。每次向主分支推送更新时,工作流会运行并重新创建 gh-pages,确保部署的版本始终是最新的。 部署 GitHub Pages- 进入 Settings > Pages,在 Build and Deployment 选项中选择 gh-pages 分支。
- 返回 Actions 页面,查看工作流的运行状态,它正在将 dist 文件夹部署到子域。
, l- ~* Q: p+ D( } 测试 GitHub Pages- 部署完成后,在 Settings > Pages 页面顶部找到网站链接,点击访问,确认它正常运行。
- 测试功能:点击 连接钱包 → 选择 Wallet > Tonkeeper → 扫描二维码。
- 升级 清单文件 后,检查是否正确显示 图标和名称,以及所有操作按钮是否正常。
# a0 M/ F. x3 M4 Z. {! [6 R" ^
/ M( Y' L+ a, Q+ Q( O/ |$ o点击 "递增 5" 后,所有操作都在域上执行。交易确认后,区块链数据更新,计数器变为 10,同时合约余额增加,反映交易费用的支出。 部署完成!我们成功将第一个 dApp 部署到生产环境,测试网与主网的流程相同,具体推送哪些证书和代码由你决定。至此,你已构建并上线了一个公开可访问的 Web 应用。 下一步在下一章,我们将学习如何将该界面嵌入 Telegram,并构建一个 聊天机器人界面,让用户通过钱包进行交互。你将探索聊天机器人和网页界面的区别,并掌握其实现方式。 敬请期待,我们将迈向新的知识领域! 🚀 |