返回

全干工程师养成记(上): Next.js 多用户全栈基建实践

前端

次世代全干工程师养成计划(上)

欢迎来到「次世代全干工程师养成计划」的第一篇章,我们将带领大家使用 Vercel 和 Next.js 相关技术快速构建一个多用户体系的全栈基建项目。

何为全干工程师?

全干工程师是近年来兴起的一个新概念,指的是能够独立完成整个软件开发生命周期的工程师,从需求分析、设计、开发、测试到部署运维,无所不能。

本系列教程的目标

本系列教程旨在通过一个实战项目,帮助大家掌握全栈开发的基本流程和核心技术,培养独立解决问题的能力,进阶成为一名合格的全干工程师。

教程内容

我们将在本系列教程中使用以下技术:

  • 前端:Next.js(TypeScript)
  • 后端:GraphQL(Apollo Server)
  • 数据库:MongoDB(Atlas)
  • 部署:Vercel
  • 测试:Jest、Cypress
  • CI/CD:GitHub Actions
  • 容器化:Docker

项目概览

我们将构建一个多用户博客系统,具有以下功能:

  • 用户注册和登录
  • 文章发布和管理
  • 评论和点赞功能

准备工作

在开始之前,请确保您已经安装并配置了以下工具:

  • Node.js 和 npm
  • Next.js CLI
  • Vercel CLI
  • MongoDB Atlas
  • Docker
  • GitHub

开始构建

1. 创建 Next.js 项目

npx create-next-app my-blog-app --typescript

2. 安装依赖项

cd my-blog-app
npm install apollo-server-express graphql express mongoose dotenv

3. 设置数据库

在 MongoDB Atlas 中创建一个新的数据库并获取连接字符串。

4. 设置环境变量

.env 文件中设置以下环境变量:

MONGODB_URI=<YOUR_MONGODB_CONNECTION_STRING>

5. 编写后端代码

pages/api/graphql.ts 文件中编写 GraphQL 后端代码:

import { ApolloServer, gql } from 'apollo-server-express';
import { ApolloServerPluginLandingPageGraphQLPlayground } from 'apollo-server-core';
import express from 'express';
import mongoose from 'mongoose';
import { typeDefs } from './schema';
import { resolvers } from './resolvers';

const app = express();
app.use(express.json());

const server = new ApolloServer({
  typeDefs,
  resolvers,
  plugins: [ApolloServerPluginLandingPageGraphQLPlayground()],
});

mongoose.connect(process.env.MONGODB_URI, { useNewUrlParser: true, useUnifiedTopology: true })
  .then(() => {
    server.start().then(() => {
      server.applyMiddleware({ app });
    });
  });

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

6. 部署到 Vercel

在 Vercel 上创建一个新项目并连接您的 GitHub 仓库。

7. 编写前端代码

pages/index.tsx 文件中编写前端代码:

import { useQuery } from 'react-query';
import { gql } from 'graphql-request';
import { getSdk } from '../generated/graphql';

const query = gql`
  query MyQuery {
    posts {
      id
      title
      content
    }
  }
`;

const IndexPage = () => {
  const { data, isLoading, error } = useQuery('posts', async () => {
    const sdk = getSdk();
    const data = await sdk.MyQuery();
    return data.posts;
  });

  if (isLoading) return <p>Loading...</p>;
  if (error) return <p>Error: {error.message}</p>;

  return (
    <ul>
      {data.map((post) => (
        <li key={post.id}>{post.title}</li>
      ))}
    </ul>
  );
};

export default IndexPage;

总结

在本篇教程中,我们介绍了如何使用 Next.js 和 Vercel 构建一个多用户全栈基建项目,涵盖了前端、后端、数据库、部署、测试和容器化等方面的知识。在后续的教程中,我们将继续深入探讨这些技术,并完成博客系统的更多功能。

让我们一起踏上全干工程师养成的征程,成为下一个技术大牛!