由于暑培的特性——时间短、覆盖面广、且每人负责一部分,每位主讲人都希望在自己的部分倾囊相授、达到“速成”的效果,因此我们倾向于选择知识密集型的教学方式,或多或少造成了“填鸭式”、“量子波动速读”的效果。一项技术(特别是编程领域)的知识点何其之多,即便主讲人们努力抓住主干脉络,也难免落入长篇累牍堆砌知识点的境地,不仅让听者产生厌烦,也不利于同学们实打实地掌握这门技术。
在反思这种教学方式的弊端过程中,我们打算在今年对暑培的形式做出新的尝试:贯穿始终的学习型工程。在不影响核心知识点的讲解前提下,主讲者们通过演示一个实际工程的搭建过程,来提高同学们对暑培内容的掌握程度。
这个做法有三大好处:
这个学习型工程的主题是一个趣味会议软件,希望实现的基本功能有:用户创建和登录、会议创建和加入、会议中倒计时、随机点名等趣味功能,同学们可以把他理解为不含直播的“雨课堂”或“腾讯会议”,也可以理解成一款桌游辅助工具。
以下是各讲对应的演示内容及其在整个工程中的作用:
HTML&CSS
HTML、CSS、JS 是网页三大语言,是网页的基础和本质。其中只需 HTML 和 CSS 文件就已经可以构建好看的静态网页了。我们在本节中将“画”出整个应用的首页、主页和“关于这个工程”页,并用简单的素材美化这些页面。在此过程中,我们希望同学们感受到“原来网页就是这么简单的东西“。
JS&TS
JS 是让网页动起来的关键,也是一种通用编程语言。这里的”动“不是移动,而是”动态“——不同的情况显示不同的内容。在本节中,我们对之前的页面施加一些魔法,使网页的背景可以随机变化、菜单内容可以展开收缩、表单提交后数据可以保存到文件中以备后用。此外,我们还会介绍 TS——带有类型系统的 JS。
DataBase (SQL&GraphQL)
当数据的关系复杂度、规模、并发需求提高到用简单文件保存已不能满足,数据库便应运而生,并成为互联网中最重要的基础设施。在本节中,我们将对用户、会议二个对象和它们之间的关系进行数据库设计和创建(使用 SQL),并使用 Hasura 和 GraphQL 进行数据访存,从而为用户创建和登录、会议创建和加入功能作铺垫。
Backend (NodeJS&Express)
在浏览器的操作是受限的、在客户端的身份是可伪造的,因此我们需要在服务器端完成诸如复杂计算、身份验证等功能——即后端。NodeJS 和 Express 是后端的一种实现方式,其中 NodeJS 使 JS 脱离浏览器环境独立运行成为可能。我们在本节中将配合数据库构建完整的用户系统,并探索邮件验证功能。
Frontend (React&Webpack)
使用纯 HTML、CSS、JS 搭建网页,我们面临两个挑战:(1) 如果一次只改变部分(但很多)的页面元素,无论是用 JS 改 DOM 树还是重新写一个 HTML 都太费力 (2) 相同的页面元素组合只能复制粘贴,无法简单复用。为此,声明式、组件化的前端框架出现了。在本节中,我们会使用前端框架之一的 React 实现大部分的会议趣味功能,完成所有页面搭建。
Deployment (CI/CD&Server)
在前 5 节中,我们已经在本地完成了网站的全部开发工作,但如何让世界上所有人都能 24 小时访问你的网站呢?在本节,我们将运用 Github CI/CD 来构建前端和后端的 Docker 镜像,使用 Github Pages 来托管前端页面,并尝试自己购买一个云服务器来提供网站的后端和数据库服务。
这个仓库隶属于 EESAST 组织,并关闭了直接提交的权限。要对代码进行修改,需要在你自己的个人账户中复刻这个仓库(本质是两个仓库,不同姓也可以不同名,但有天然的关联)。
复刻后的仓库只储存在 Github 云端。为了更方便地修改、测试代码,需要克隆到本地电脑上(本质也是两个仓库,不要求同姓或同名,但有天然的关联)。
在克隆之前,请确保:
在本地文件夹中,用任意终端(可右键打开)运行
git clone <先前复制的仓库URI>
克隆应当在几秒内完成,并在当前文件夹中创建一个名为web-workshop
的子文件夹(即本工程)。
若出现网络问题,请自行根据现象/报错搜索解决方案,也可在暑培群中反馈。
简要介绍仓库内的主要文件夹:
./github/workflows
:Github CI/CD 的配置文件,在 Deployment 一节中会用到/assets
:说明文档中插入的图片素材,无需关心/backend
:后端代码存放位置,Backend 一节中会用到/database
:数据库相关代码存放位置,Database 一节中会用到/frontend
:前端代码存放位置,HTML&CSS、JS&TS、Frontend 三节中会用到/server
:部署云服务相关配置文件,在 Deployment 一节中会用到/tutorials
:每一节演示内容和作业的说明,以及授课的讲义注:以下 git 指令都可以使用 vscode 图形化界面操作替代,有需要的请自行摸索
切换到本节演示内容对应的分支(本地只有主分支是正常的,请在 Github 云端仓库查看所需的分支名)
git checkout "<branch-name>"
请先阅读/tutorials/<branch-name>.md
,确保你已经正确地配置了环境
分支上已有了一些提交,每个提交都对应新增的功能,你可以在/tutorials/<branch-name>.md
中找到说明。若要查看运行每次提交的修改内容和实际效果,请找到提交对应的 Hash 值并运行以下命令
git checkout <commit-hash>
在你对代码做任何修改前,请确保你已经切换回到分支的最新提交
git checkout "<branch-name>"
你可以根据/tutorials/<branch-name>.md
中的作业要求编码代码,或自由地修改对应代码来探索效果
在修改完成后,记得保存并提交你的修改,建议使用规范化地提交命名
git add <files>
git commit -m "<commit-message>"
为了与之前几节中你的修改内容配合起来,需要将新增的提交合并到主分支
git checkout main
git rebase "<branch-name>"
为了其他人能看到你的提交,请同步到 Github 云端仓库(克隆前的)
git push --all