MERN 全栈项目搭建
· 阅读需 16 分钟
技术选型
- 前端框架:React
- 后端框架:Express.js + Node.js
- 数据库:MongoDB
预期的项目结构
my-mern-project/ # 项目根目录
│
├── backend/ # 后端代码目录
│ ├── models/ # 数据模型目录
│ ├── routes/ # 路由目录(将 controllers 和 routes 合并到同一个目录,便与后续维护)
│ │ ├── userRoutes.js
│ │ └── userController.js
│ ├── config/ # 配置文件目录
│ ├── index.js # 后端入口文件
│ └── package.json # 后端依赖管理文件
│
├── frontend/ # 前端代码目录
│ ├── public/ # 静态资源目录
│ ├── src/ # 源代码目录
│ │ ├── components/ # React 组件目录
│ │ ├── pages/ # 页面组件目录
│ │ ├── App.js # React 应用入口文件
│ │ └── index.js # React 应用渲染入口文件
│ └── package.json # 前端依赖管理文件
│
└── README.md # 项目说明文档
项目搭建步骤
- 新建文件夹 my-mern-project 保存前后端项目
- 新建前后端项目根目录 /frontend, /backend
- 在 frontend、backend 中各自用脚手架初始化项目
- 分别优化前后端项目目录结构
- 基于优化的项目结构启动项目并联调协作
# 新建项目文件夹
mkdirmkdir my-mern-project
cd my-mern-project
# 脚手架初始化前端项目,会创建名为 frontend 的 react 项目
npx create-react-app@latest frontend
# 全局安装 express-generator
npm install -g express-generator
# 脚手架初始化后端项目,会创建名为 backend 的后端项目
express backend --no-view
至此项目结构已经基本搭建起来了,接下来是按照预期的项目结构来优化一下目录结构
后端项目结构优化
└─── backend/ # 后端代码目录
├── models/ # 数据模型目录
├── routes/ # 路由目录(将 controllers 和 routes 合并到同一个目录,便与后续维护)
├── config/ # 配置文件目录
├── index.js # 后端入口文件
└── package.json # 后端依赖管理文件
routes/index.js 统一管理路由,让路由配置更为集中和清晰
routes/index.js
// routes/index.js
const express = require('express')
const router = express.Router()
const userRoutes = require('./userRoutes')
const postRoutes = require('./postRoutes')
router.use('/users', userRoutes)
router.use('/posts', postRoutes)
module.exports = router
routes/userRoutes.js
// userRoutes.js
const express = require('express')
const router = express.Router()
const { getUser, createUser } = require('./userController')
// GET 请求处理
router.get('/', getUser)
// POST 请求处理
router.post('/', createUser)
// 导出路由对象
module.exports = router
routes/userController.js
// userController.js
// 中间件函数 - 获取用户
const getUser = (req, res) => {
// 中间件处理逻辑
res.send('GET request to the homepage')
}
// 中间件函数 - 创建用户
const createUser = (req, res) => {
// 中间件处理逻辑
res.send('POST request to the homepage')
}
// 使用ES6解构导出中间件函数
module.exports = {
getUser,
createUser,
}
提示
postRoutes.js postController.js 的初始化文件结构也基本一致,只是修改一下变量名称
数据库与环境变量配置
安装 dotenv 创建 .env 文件配置全局环境变量
# .env
DB_HOST=localhost
DB_PORT=27017
DB_NAME=mydatabase
DB_USER=myusername
DB_PASS=mypassword
config/env.js 中引入环境变量,配置各个环境的启动参数
// config/env.js
require('dotenv').config()
module.exports = {
development: {
PORT: process.env.PORT || 3000,
MONGO_URI: `mongodb://${process.env.DB_USER}:${process.env.DB_PASS}@${process.env.DB_HOST}:${process.env.DB_PORT}/${process.env.DB_NAME}`,
// 其他开发环境配置...
},
test: {
PORT: process.env.PORT || 4000,
MONGO_URI: `mongodb://${process.env.DB_USER}:${process.env.DB_PASS}@${process.env.DB_HOST}:${process.env.DB_PORT}/${process.env.DB_NAME}`,
// 其他测试环境配置...
},
production: {
PORT: process.env.PORT || 5000,
MONGO_URI: process.env.MONGODB_URI,
// 其他生产环境配置...
},
}
提示
注意:这里测试环境和开发环境的本地环境配置脚本和上面的 .env 一致
生产环境的话只需要配置 MONGODB_URI=xxxxxx 这一项就可以了