视频站日志 - 04 我是如何独立开发软件 - 前端篇

视频

https://www.bilibili.com/video/BV1Pt4y1u75Y

前言

本文说下我前端是如何技术选型、搭建、部署,以及遇到的一些问题。

猫哥视频站 https://ducafecat.com

正文

技术选型

一开始我很乐观,选用 flutter 全栈方案 web ios android,但是 flutter web 的表现实在太差了,看我第一篇文章就行,这里不再重述。

https://bestofjs.org/

这个网站整理了优秀的 js 项目,可以发现 react vue 热度最。

之前单位里用 vue 居多,所以这次我选用 react 的 nextjs ssr 来实现前端。

nextjs 架构

SSR 是 server side render,即服务端渲染,就是把前端页面渲染的部分工作交给服务端来做,而不是纯客户端。

目录结构规范

整体的代码目录风格平移了我在 flutter 中的习惯,这样我就可以很快上手了。

静态化页面

https://ducafecat.com/

大家可以体验下这个列表、详情页的访问速度。

这两个页面不需要登录就可以访问,这种页面就可以静态化,即在构建时就生成,而不是在运行时生成。

缺点就是每次改完数据,需要重新生成一次,不过这个操作我留给了 cicd ,不需要我参与。

SWR 简化数据请求

https://swr.vercel.app/zh-CN

  • 简化请求 hook
import useSWR from "swr";

function Profile() {
  const { data, error } = useSWR("/api/user/123", fetcher);

  if (error) return <div>failed to load</div>;
  if (!data) return <div>loading...</div>;

  // 渲染数据
  return <div>hello {data.name}!</div>;
}
  • 自动重复请求

useSWR("/api/todos", fetcher, { refreshInterval: 1000 });

权限控制

延续了前后端分离的 token 鉴权方式,用户的 token 我放在了 cookies 里,每次请求带上。

import useSWR from "swr";
import { getToken } from "../utils/auth";

export default function useUser() {
  const token = getToken();
  const { data, mutate, error } = useSWR(
    {
      path: "/users/me",
      token: token,
    },
    { refreshInterval: token ? 1000 * 10 : 0 }
  );

  const loading = !data && !error;

  return {
    loading,
    error,
    user: data,
    mutate,
  };
}

按道理应该 再写一层 ssr 的 pages/api,但是我简化了直接访问了 fastify 写的后端 api 接口。

用户登录鉴权、数据访问都放在 api 里处理安全可靠。

这是我的技术负债,找时间处理了。

部署前端项目

nextjs 本身是一个 nodejs 服务,所以我采用 docker 的方式部署。

过程是生成镜像,推送到阿里镜像服务,服务器上 docker-compose 拉取。

  • cicd 用的阿里云 flow 服务

https://flow.aliyun.com/

  • cicd 排列

  • 构建过程

  • 手动执行

正常都是代码修改后推送到仓库后自动执行。

因为我采用了页面静态化,所以每次改完数据,需要手动重新执行一次。

Dockerfile 参考

  • 减少镜像体积采用了 alpine 版本
  • 提升构建速度做了一个 node 16 版本的阿里镜像。
  • yarn 设置淘宝镜像加速
# https://hub.docker.com/_/node
# FROM node:16.15.1-alpine
# 阿里镜像加速
FROM registry.cn-zhangjiakou.aliyuncs.com/ducafe/node:16.15.1-alpine

# 工作目录
WORKDIR /usr/src/app

# 时区
ENV TZ Asia/Shanghai

# yarn 加速
ARG registry=https://registry.npm.taobao.org
ARG disturl=https://npm.taobao.org/dist
RUN yarn config set disturl $disturl
RUN yarn config set registry $registry

# 包配置
COPY package*.json ./

# 拉取包
RUN yarn install --production=true

# 复制项目代码
COPY . .

# 生产环境
ENV NODE_ENV production

# 编译
RUN yarn build

# 端口
EXPOSE 8080

# 执行命令, docker run ... 可复写
CMD [ "yarn", "start" ]

总结

几点建议:

  • 如果你和我一样工作中用 vue 很多,其实可以尝试下一些其它的技术栈来感受不同的设计思想。
  • 技术负载还是需要早点去把坑填掉,不然后面会越来越多。
  • 竟可能的用 cicd 自动部署来节省你的时间。
  • 形成你的代码目录规范,我写前端基本上就是一套规范,不管是 vue 还是 react flutter,这样可以提高效率。
  • 可以通过 github 搜索别人的代码来快速学习、借鉴。 https://github.com/search?l=TypeScript&q=useSWR&type=Code

独立开发软件 系列到此告一个段落,这个系列出发点还是建议大家尽可能早的尝试去做产品,技术都是工具,程序员是一群 Geek ,去探索、发现、改变。

Everything will get better!


end

Last Updated:
Contributors: ducafecat