本帖最后由 riyad 于 2025-3-11 23:12 编辑
' D3 w# |+ p7 ?. j. i. ~) g/ q! |, M# T+ H) D/ \( |
GitHub Pages 是发布 dApp 的理想平台,适用于开发和生产。它是免费的开源托管服务,支持 HTML/CSS/JS 静态网站,并允许自定义域名。 GitHub Pages 仅支持静态网站,避免了中心化的后台依赖,符合 dApp 的去中心化原则。此外,它基于 Git 仓库,便于社区管理,支持协作开发和分叉。任何人都可自由创建独立版本并发布。 - echo "# first_contract_front_end" >> README.md
, K' W1 ~7 C3 P$ r. e, R M. S - git init
. i. a- U/ W! }. @ - git add README.md& w" L5 o$ ~# I2 J& g# p
- git commit -m "first commit"
2 C3 q- c" V! F7 Z3 } - git branch -M main
; Z8 x6 W- t, Q" ?; H) h - git remote add origin https://github.com/markokhman/first_contract_front_end.git) ? n, E* F4 P" _+ U
- git push -u origin main
复制代码我们从这里开始: - git init; o' o0 Z0 T ?& p5 `+ w& K
复制代码Git 仓库已初始化,而且我们已经有了 .gitignore 文件。好极了。现在把所有东西都加进去吧: * u! w' g) z1 [# D+ d" ]1 G
- git add .+ @8 R! i1 M8 l- f. \" P
复制代码提交初始提交:
# O/ @& ^2 m1 U8 w- git commit -m "Initial commit"6 t1 i/ u7 D: y
复制代码现在,我调用我们的远程源,即之前从 GitHub 仓库复制的链接: - git remote add origin https://github.com/xxxxxxxx/first_contract_front_end.git4 M, R; k6 @2 _2 ^; n* g
复制代码然后,我进行首次推送,其中包括我们的初始代码: - git push origin master9 D0 v# R; R$ j2 B
复制代码在 GitHub Pages 上托管网站,我们使用用户名和仓库名称作为子域。例如,我的用户名 Markokhman 加上 github.io 形成域名。 : \# B+ ]' T# {! j" H4 N* B2 ^
接下来,需要创建清单文件以准备发布。转到 main.tsx,找到清单文件的 URL,并在 public 文件夹下创建 tonconnect-manifest.json,其中包含网站的 URL。 - "url": "https:///join.toncompany.org"
8 ]( Q: V5 l# s
复制代码那我们就用这个名字: - "name": "TON&Co. Tutorial"
0 X% Y+ F: a' Y3 a
复制代码 然后是图标 URL。我们希望它也成为资源库的一部分。因此,我现在要在公共文件夹中放置一个图标文件,但稍后我会在这里创建一个适当的 URL,一旦我们部署了这个文件,它就会指向这个文件。目前,链接看起来是这样的,因为一旦我们构建了项目,公共文件夹实际上会解析到根目录:
$ M$ ^+ A# u' m8 o- "iconUrl": "https://xxxxxxxxx.github.io/first_contract_front_end/icon.png"
- O+ e( j' s8 Q# a. w4 b
复制代码这就是我们全新的清单文件: - {& x( c: l8 ` r& T0 O- Y
- "url": "https://join.toncompany.org",' z7 i# R0 { J8 O" u
- "name": "TON&Co. Tutorial",: i- b1 d$ y- [: P3 c$ V k& A) h/ Y
- "iconUrl": "https://xxxxxxxxxxxx.github.jo/first_contract_front_end/icon.png"
! s* K2 p3 u' }/ g. A$ q: Q1 m - }
复制代码现在,我们前往 main.tsx 文件,在这里编写一个合适的 URL: - const manifestUrl = "https://xxxxxxxxxxxx.github.io/first_contract_front_end/tonconnect-manifest.json"
/ x4 H+ |. u: Y4 ?
复制代码现在我们需要做的最后一件事是准备好 vite 本身,以便为我们正确构建。如图所示,vite 配置有一个基础: - // https://vitejs.dev/config/( c7 ~! O$ ^4 @9 F" p' z3 l
- export default defineConfig({
2 h, J0 P0 s% n. j* Y - plugins: [react (), nodePolyfills()],9 c$ E! y( S, D
- base: "/",
1 u4 U8 m% d9 I2 s/ }. Q - });
复制代码 这个 base 不会是 root,因为我们还有另一个 base:在我的例子中是 first_contract_front_end。这是 GitHub 的规则:仓库名称必须是基本路径。所以我们就把它作为项目的基础:
0 r# v1 b c& C- // https://vitejs.dev/config/
& d- V& ?$ N5 |3 `1 ] - export default defineConfig({
$ K# z4 \% @' U' C ? - plugins: [react (), nodePolyfills()],. f# A9 u* P4 w
- base: "/first_contract_front_end/",0 z. X6 h" e$ B# V* L
- });
复制代码 创建 GitHub 工作流程至此,我们已经掌握了现有的代码,但还有一件事要做。首先,我们运行 - yarn build+ P( ] v5 U# n7 f. i- v
复制代码我们需要构建项目,因为 TypeScript 代码无法直接在浏览器中运行。构建后的文件存放在 dist 文件夹中,但该文件夹通常被 gitignored,因此不会被推送到 GitHub。 GitHub Pages 依赖特定分支来托管网站内容,因此我们可以创建一个专用分支,仅包含 dist 文件夹的内容,并将其链接到 GitHub Pages 的 URL。为了自动完成这一过程,我们使用 GitHub Actions 工作流。 在项目根目录下创建 .github/workflows/ 文件夹,并在其中新建 deploy.yml,粘贴以下代码即可自动部署网站。 - name: Deploy
2 k( L8 B+ d+ S - 3 H- f+ F5 U! R9 o8 [2 @% G
- on:" n( V q, Q1 d3 j+ ?. v
- push:
( }: R7 i ^% x6 W+ J - branches:
" _& }( g4 ^9 r8 O! u0 C1 T# B! F - - master5 G; u0 K) b+ X; u" }6 e
1 ?, p9 W) O! e, e/ L2 d- jobs:
+ X' Y; r6 D6 }' L8 T: Q - build:$ G( V- y) g' E) q
- name: Build; d0 r! L% `! E) C" D7 j0 W2 `
- runs=on: ubuntu-latest% @1 |3 ~, K' @% ^6 p8 `, u, z4 y0 \7 v
. Q* g" E4 ~8 G4 r/ O1 O/ x0 m0 B- steps:2 X7 }" Q; D& g/ _: Y5 }6 G
- - name: Checkout repo) Y" ^9 P* L" d' w, X) t) ]2 Z
- uses: actions/checkout@v2* d! \! C' k7 X) d
- $ W$ Q: t) J$ k: R5 W
- - name: Setup Node
+ Z S- Y8 f7 } O# n - uses: actions/setup-node@v1$ g. o" T+ L$ m4 c9 N) |1 O& v
- with:6 A% w% Z) [; A6 L# b w
- node-version: 16% {& l2 `# x# z, h' D' q* N1 c
- , z. ]! B( b* j
- - name: Install dependencies4 l$ f, b* _- ^/ V% s4 T% _
- uses: bahmutov/npm-install@v15 s h: |5 ?4 w$ K
- 3 L5 ^. c R4 o6 M- |: k
- - name: Build project
. F9 t: t! J! ]/ Q; q9 w: H' v! p - run: npm run build1 M, m( z" U( e1 g& l5 ^
S" p6 B" k$ c- t, C- - name: Upload production-ready build files9 C2 }% w. G7 `: M, Z
- uses: actions/upload artifact@v2
, g' P4 h" L% b7 s' b% L. O - with:0 N5 T+ Y* F) _" k* d1 P
- name: production-files
2 z' r% K# C: x. E2 y( h - path: ./dist
. S7 j. H0 S5 O) E, t. A6 A( ] W
4 f; o1 H6 M, B9 ]' |" L- deploy:* ]% p6 i4 w. |- N" h2 _6 d6 M
- name: Deploy4 ~2 \% r4 Y# ^$ r
- needs: build
' r, W2 u* R/ G7 H" V" O' ? - runs-on: ubuntu-latest% e2 C8 ^4 b+ \8 B1 i
- if: github.ref == 'refs/heads/master'
( K/ H. ~ {" ^% } `, {
0 ?9 ^ ~# P' T5 E$ h- steps:! a! d! m& ?$ x2 T; L: s5 a
- - name: Download artifact, s7 C4 v8 f& Q9 W8 x! l
- uses: actions/download-artifact@v2. r- q* {2 ?* P! m6 Z4 Z
- with:8 i% w) U! ]! A8 j6 I' \0 [4 k) y
- name: production-files
% y; @6 n! v$ z' h$ e" W7 P/ k# ^1 y - path: ./dist* ~/ n; I' x% C% Q
* n9 a$ v; v0 ?( n+ o' H# _- - name: Deploy to GitHub Pages
; r( _ u7 l/ V6 a - uses: peaceiris/actions-gh-pages@v3
% U- S2 u, N4 y8 Z$ S" j8 m - with:
. D# @8 g1 g9 t) v3 O8 |4 A; Q - github_token: ${{ secrets.GITHUB_TOKEN }}
1 z- F/ d8 g/ U, l: } v - 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"
5 A) |; h, v! r6 O$ }/ X
复制代码很好,我们已经准备好了这个工作流!我们进入 GitHub 仓库设置,"操作">"常规",确保工作流权限设置为 "读写";否则我们将无法创建文件夹。 推送代码下一步是推送我们提交的内容。回到 .gitignore 并使用以下命令: - git push origin master1 T/ F) o. j4 N- L: h0 W1 S
复制代码前往 GitHub 仓库中的 "操作 "选项卡,查看工作流程的运行情况。如有必要,请刷新: ) }' I) r9 Z9 Y0 E' d, T
您可以点击一个工作流程,查看它目前正在做什么:
: e7 F% b4 O( o R- z这个工作流的最终结果是一个名为 gh-pages 的新分支。每次向主分支推送更新时,工作流会运行并重新创建 gh-pages,确保部署的版本始终是最新的。 部署 GitHub Pages- 进入 Settings > Pages,在 Build and Deployment 选项中选择 gh-pages 分支。
- 返回 Actions 页面,查看工作流的运行状态,它正在将 dist 文件夹部署到子域。- S; o3 X0 z5 w- r
测试 GitHub Pages- 部署完成后,在 Settings > Pages 页面顶部找到网站链接,点击访问,确认它正常运行。
- 测试功能:点击 连接钱包 → 选择 Wallet > Tonkeeper → 扫描二维码。
- 升级 清单文件 后,检查是否正确显示 图标和名称,以及所有操作按钮是否正常。
0 ^- @ H& M: d% l
6 z( F3 v( ?. W4 U. v7 u& V8 R点击 "递增 5" 后,所有操作都在域上执行。交易确认后,区块链数据更新,计数器变为 10,同时合约余额增加,反映交易费用的支出。 部署完成!我们成功将第一个 dApp 部署到生产环境,测试网与主网的流程相同,具体推送哪些证书和代码由你决定。至此,你已构建并上线了一个公开可访问的 Web 应用。 下一步在下一章,我们将学习如何将该界面嵌入 Telegram,并构建一个 聊天机器人界面,让用户通过钱包进行交互。你将探索聊天机器人和网页界面的区别,并掌握其实现方式。 敬请期待,我们将迈向新的知识领域! 🚀 |