ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

从零搭建前后端分离开发环境:装环境到底在装什么?

从零搭建前后端分离开发环境:装环境到底在装什么? “你到底在装什么”这句话在每个开发者的电脑前大概都出现过一两次。可能是室友路过看到你对着黑乎乎的终端窗口敲了一下午命令忍不住问了一句也可能是系统持续报错时你自己对着屏幕发出的灵魂拷问。作为一名长期跟开发环境打交道的人我太熟悉这种“装着装着就崩了”的体验了。尤其是打开一个新手教程别人三分钟跑起来的项目你这边光环境就装了三天最后还不知道问题出在哪。这篇文章我想把这些年装环境、排依赖、调版本的经验整理成一套可复用的思路。选题并不是某个高深框架而是一个非常基础的场景从零开始在本地装好一套前后端分离的项目环境并让它真正跑起来。内容会覆盖 JDK、Maven、Node.js、MySQL 这些常用组件的安装与配置也会讲为什么你照着教程敲了同样的命令却还是启动失败。适合刚接触后端开发、准备搭建本地开发环境或者已经被各种版本问题折磨过的读者。看完之后你应该能理解“装环境”到底是在装什么以及遇到报错时怎么快速定位并解决。1. “装环境”的本质你到底在装什么很多初学者对“安装环境”这件事有一个误解觉得就是下载一个软件然后疯狂点“下一步”装完就算结束了。真正开始跑项目的时候却一脸懵因为项目根本起不来。要理解装环境首先要分清三个概念运行时、依赖和构建工具。1.1 运行时、依赖与构建工具一个 Java 项目代码写完了其实还是一个.java文本文件计算机不认识。它需要被编译成字节码再交给 Java 虚拟机JVM解释执行。那么 JDK 就是运行时和编译器的集合这是最底层的基础。项目里要用的第三方库比如 JSON 解析库、数据库驱动、工具类包这些就是依赖。你不可能把所有第三方库的 jar 包都手动下载放到项目里所以需要构建工具来管Maven 或者 Gradle 就是干这个事的。构建工具会根据项目配置文件自动去远程仓库下载对应版本的依赖。所以你看“装环境”不是装一个软件就完事而是要装一整条工具链装 JDK是为了让 Java 程序能编译和运行。装 Maven是为了管理依赖和打包。装 Node.js是为了跑前端工程。装 MySQL是为了提供数据存储服务。1.2 装上 ≠ 配好配好 ≠ 能跑这里还有一个常见误区软件装上了不代表就能用。比如 JDK 装上之后系统 PATH 环境变量里没有配java命令的路径你在命令行输入java -version系统还是提示“找不到命令”。这不是没装好而是没有告诉操作系统去哪里找这个命令。再比如 Maven 默认从中央仓库下载依赖国内网络环境下速度可能非常慢你需要在settings.xml里配置国内镜像。配置不对项目一创建就卡在依赖下载环节。这类问题在后面的实战里都会遇到。先记住一个结论装环境的本质是配置工具链让每个环节都能被正确调用。2. 环境准备与版本说明在开始动手之前先统一一下演示环境。不同操作系统的命令会有些差异但整体思路一致。2.1 操作系统与终端工具本文的演示环境是 Windows 10/11终端使用 PowerShell 或者 CMD 都可以。如果你用的是 macOS 或 Linux命令差别主要在于环境变量配置文件和包管理器核心步骤不变。使用 Windows 的读者建议先检查电脑上是否已经有常见工具。在命令行执行以下命令java -version node -v npm -v mvn -v如果命令能正常输出版本信息说明对应工具已经装好如果提示“不是内部或外部命令”说明还没装或者环境变量没配好。2.2 版本选择建议版本需要根据你的项目实际情况调整本文示例以常见环境为例重点演示配置思路。JDK建议使用 JDK 8 或 JDK 11。这两个版本在企业和老项目中仍占很高比例。新版 JDK 17 也可以但部分老依赖可能出现兼容问题。Maven3.6.x 或 3.8.x 都可以不要追求过新。Node.js建议 16.x 或 18.x LTS 版本不要直接用最新大版本很容易遇到前端依赖不兼容。MySQL5.7 或 8.0 都可以本文以 MySQL 8.0 为例。因为这些软件版本迭代较快直接写死版本号意义不大。关键在于理解不同版本之间的兼容关系后面遇到报错时优先检查版本是否匹配。2.3 规划项目结构我们后面要做一个最简的前后端分离项目先规划好目录结构避免文件乱放D:\demo-project ├── backend # Spring Boot 后端 ├── frontend # Vue 前端 └── sql # 数据库脚本这个结构很清晰后端归后端前端归前端数据库脚本单独放一个目录。后面所有代码文件都会按照这个结构存放。3. 项目选型为什么用 Spring Boot Vue既然目标是“装好环境并且跑起来”选择一个技术栈相对主流、教程多、踩坑资料全的方向会省很多事。这里选了 Spring Boot Vue 这个组合并不是说它一定最好而是它足够典型。3.1 Spring Boot 为什么适合新手Spring Boot 最大的优势是“约定大于配置”。它帮你把 Spring 框架里大量繁琐的 XML 配置简化掉了你只需要通过注解和配置文件就能快速启动一个 Web 服务。同时Spring Boot 内置了 Tomcat开发阶段不用单独装 Tomcat写好代码直接启动 main 方法就能访问接口。这对理解“后端是什么”非常有帮助。3.2 Vue 为什么适合新手Vue 的入门曲线相对平缓单文件组件的方式比较容易理解。配合 Vite 或 Vue CLI 脚手架一条命令就能创建项目一条命令就能启动开发服务器。用在本地演示场景里前后端分离的架构一目了然前端发送请求后端处理请求并返回 JSON 数据前端再把数据渲染到页面上。3.3 “能跑起来”的标准是什么很多人装了环境后不知道该怎么验证其实标准很明确后端启动后浏览器能访问到一个接口地址并看到 JSON 数据。前端启动后浏览器能打开页面并且能通过接口请求到后端数据。MySQL 服务正常启动后端可以成功连接到数据库。三个条件都满足说明这一整套环境基本没有问题。任何一个环节断了你也能根据报错去定位是哪个组件出了问题。4. 从零搭建后端环境Spring Boot接下来进入实操环节。不要急着复制命令每执行一步都先理解这一步在干什么。4.1 安装 JDK 并配置环境变量第一步是下载 JDK。下载好后直接安装记住安装路径。比如C:\Program Files\Java\jdk-11然后配置 JAVA_HOME 环境变量。右击“此电脑” → “属性” → “高级系统设置” → “环境变量”。在系统变量中新建变量名JAVA_HOME 变量值C:\Program Files\Java\jdk-11接着编辑 Path 变量在变量值末尾追加%JAVA_HOME%\bin配置完成后重新打开一个终端窗口输入java -version javac -version如果出现类似下面的输出说明 JDK 安装成功java version 11.0.18 Java(TM) SE Runtime Environment 18.9 (build 11.0.1810) Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.1810, mixed mode)注意java -version能执行不一定代表javac也能执行。如果javac提示找不到命令通常是%JAVA_HOME%\bin没有配置到 Path 中。4.2 安装 Maven 并配置国内镜像Maven 是一个构建工具负责下载和管理项目依赖。安装包可以到 Apache Maven 官网下载解压后放到一个纯英文路径下比如D:\apache-maven-3.8.8同样配置环境变量新建 MAVEN_HOME变量名MAVEN_HOME 变量值D:\apache-maven-3.8.8然后在 Path 中追加%MAVEN_HOME%\bin验证方式mvn -v不过如果你不修改 Maven 的配置直接用它创建项目大概率会卡在依赖下载上。因为 Maven 默认从中央仓库下载国内访问比较慢。这里需要修改 Maven 的settings.xml文件位置在D:\apache-maven-3.8.8\conf\settings.xml用文本编辑器打开找到mirrors标签在其中添加一个阿里云镜像mirror idaliyunmaven/id mirrorOfcentral/mirrorOf namealiyun maven mirror/name urlhttps://maven.aliyun.com/repository/public/url /mirror保存后再执行 Maven 命令依赖下载速度会有非常明显的提升。4.3 创建 Spring Boot 项目环境准备好了就可以创建项目。最靠谱的方式是直接访问 Spring Initializrhttps://start.spring.io/在页面上选择构建工具为 Maven语言为 JavaSpring Boot 版本选一个稳定版本。Group 填com.exampleArtifact 填demo-backend。Dependencies 这里需要添加Spring Web然后点击生成下载 zip 包解压到D:\demo-project\backend目录。4.4 编写一个测试接口用 IDEA 打开 backend 项目先看一下默认生成的目录结构backend ├── src │ ├── main │ │ ├── java │ │ │ └── com.example.demo │ │ │ └── DemoBackendApplication.java │ │ └── resources │ │ └── application.properties │ └── test ├── pom.xml找到DemoBackendApplication.java这个类就是项目的入口。为了验证环境能不能用写一个最简单的接口新建一个类文件文件路径backend/src/main/java/com/example/demo/controller/TestController.javapackage com.example.demo.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; import java.util.Map; RestController RequestMapping(/api) public class TestController { GetMapping(/hello) public MapString, String hello() { MapString, String result new HashMap(); result.put(code, 200); result.put(message, hello, csdn); return result; } }这段代码的含义是当浏览器访问/api/hello时后端返回一个 JSON 对象。4.5 运行并验证后端在 IDEA 中直接运行DemoBackendApplication的 main 方法。当控制台出现类似日志时说明启动成功Tomcat started on port(s): 8080 (http) Started DemoBackendApplication in 2.3 seconds打开浏览器访问http://localhost:8080/api/hello页面或者浏览器工具里应该能看到{code:200,message:hello, csdn}到这里后端环境就算真正跑通了。5. 从零搭建前端环境Vue后端能返回数据了接下来把前端也跑起来。5.1 安装 Node.js 与 npmNode.js 的安装基本是一路下一步安装包会把 npm 一起装上。装完后在命令行验证node -v npm -v如果输出版本号说明安装成功。这里要注意npm 默认下载源在国外建议切换到国内镜像源。很多人npm install卡住就是因为这个。执行以下命令把 registry 永久修改为淘宝镜像npm config set registry https://registry.npmmirror.com查看是否修改成功npm config get registry如果显示https://registry.npmmirror.com说明镜像源配置完成。5.2 创建 Vue 项目进入前端目录cd D:\demo-project\frontend使用 Vite 创建 Vue 项目项目名设为demo-frontendnpm create vitelatest demo-frontend -- --template vue然后进入项目并安装依赖cd demo-frontend npm install安装完成后启动开发服务器npm run dev命令行会出现一个类似这样的地址Local: http://localhost:5173/用浏览器访问这个地址能看到 Vue 默认欢迎页说明前端环境没有问题了。5.3 安装 Axios 并调用后端接口为了验证前后端能否通信先安装 axiosnpm install axios然后修改前端的主界面文件。文件路径frontend/demo-frontend/src/App.vue把文件中原来的内容全部替换为template div stylemargin: 40px; h1CSDN 环境搭建实战/h1 p后端返回的数据/p pre{{ responseData }}/pre /div /template script setup import { ref, onMounted } from vue import axios from axios const responseData ref() onMounted(async () { try { const res await axios.get(http://localhost:8080/api/hello) responseData.value JSON.stringify(res.data, null, 2) } catch (error) { responseData.value 请求失败 error.message } }) /script这里通过 axios 向后端发起 GET 请求然后把返回的 JSON 渲染到页面上。但如果直接这样写浏览器可能会报跨域错误。这是因为前端跑在 5173 端口后端跑在 8080 端口两者端口不一致。解决办法是在后端代码里允许跨域请求。修改后端入口类文件路径backend/src/main/java/com/example/demo/DemoBackendApplication.javapackage com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; SpringBootApplication public class DemoBackendApplication { public static void main(String[] args) { SpringApplication.run(DemoBackendApplication.class, args); } Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurer() { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/api/**) .allowedOrigins(http://localhost:5173) .allowedMethods(*); } }; } }重启后端再刷新前端页面如果页面上出现hello, csdn的 JSON数据说明前后端联调成功。6. 数据库与本地服务MySQL 的安装与初始化Web 项目几乎没有不用数据库的。即使是最简单的项目也建议把 MySQL 跑起来否则后面做登录、存储、查询时还得回炉重造。6.1 安装 MySQLMySQL 的安装方式很多有 MSI 安装包也有免安装的 zip 压缩包。这里说一种比较可控的方式使用 zip 压缩包安装。下载 MySQL 的 zip 包后解压到D:\mysql-8.0.32-winx64然后在解压目录下新建一个配置文件文件路径D:\mysql-8.0.32-winx64\my.ini[mysqld] basedirD:/mysql-8.0.32-winx64 datadirD:/mysql-8.0.32-winx64/data port3306 character-set-serverutf8mb4注意这里的路径是示例你需要替换成自己实际的 MySQL 解压路径。datadir对应的data文件夹通常不存在需要初始化。以管理员身份打开终端进入 MySQL 的 bin 目录执行初始化命令cd D:\mysql-8.0.32-winx64\bin mysqld --initialize-insecure执行完初始化后data目录会自动生成并且root用户默认没有密码。然后启动 MySQL 服务mysqld --console看到类似ready for connections的日志说明 MySQL 启动成功。6.2 创建一个简单的数据库重新打开一个终端窗口连接 MySQLmysql -u root创建一个数据库并新建一张用户表CREATE DATABASE demo_db DEFAULT CHARACTER SET utf8mb4; USE demo_db; CREATE TABLE user_info ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL, age INT ); INSERT INTO user_info (username, age) VALUES (zhangsan, 25);这组 SQL 创建了一个最基本的表并插入了一条数据后面可以用于测试后端是否成功连接数据库。6.3 在 Spring Boot 中配置数据库连接回到后端项目在pom.xml中添加 MySQL 驱动依赖注意添加在dependencies标签内dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId scoperuntime/scope /dependency然后修改配置文件文件路径backend/src/main/resources/application.propertiesspring.datasource.urljdbc:mysql://localhost:3306/demo_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai spring.datasource.usernameroot spring.datasource.password如果前面初始化时没有设置密码password 就留空。如果你的 MySQL 设置了密码需要填上实际密码。再写一个接口从数据库里读取用户列表验证数据库连接是否正常。文件路径backend/src/main/java/com/example/demo/controller/UserController.javapackage com.example.demo.controller; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; import java.util.Map; RestController RequestMapping(/api) public class UserController { private final JdbcTemplate jdbcTemplate; public UserController(JdbcTemplate jdbcTemplate) { this.jdbcTemplate jdbcTemplate; } GetMapping(/users) public ListMapString, Object getUsers() { return jdbcTemplate.queryForList(SELECT * FROM user_info); } }这里用了 JdbcTemplate它在 spring-boot-starter-jdbc 中需要补充添加依赖dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-jdbc/artifactId /dependency重启后端访问http://localhost:8080/api/users如果返回了包含zhangsan的 JSON 数据说明整个 Java 后端 MySQL 的链路已经完全打通。7. 把项目跑起来联调与验证到了这一步你的电脑上已经有了一个完整的本地项目链路。很多人容易在“单独能跑但合起来跑不通”这个环节崩溃。这里单独讲一下联调时的操作顺序和判断方式。7.1 按顺序启动服务启动顺序建议是数据库 → 后端 → 前端。数据库先启动是因为后端启动时如果发现数据库连不上几个数据源的初始化逻辑可能报错。这不是一定发生但按依赖顺序启动问题最少。7.2 分阶段验证启动完成后用下面这个顺序验证访问http://localhost:8080/api/hello确认后端基础接口正常。访问http://localhost:8080/api/users确认数据库连接正常。访问http://localhost:5173确认前端页面加载正常。观察前端页面是否显示了后端返回的数据。如果第 1 步就失败说明问题在后端环境或代码本身如果第 2 步失败问题在数据库连接或 MySQL 配置如果第 3、4 步失败问题可能在前端或跨域配置。这个排查思路很重要它能帮你在混乱的报错信息里快速划分责任边界。7.3 演示效果全部正常时前端页面会显示类似内容CSDN 环境搭建实战 后端返回的数据 { code: 200, message: hello, csdn }同时访问/api/users也能看到刚刚插入的zhangsan数据。到这里一套前后端分离的本地开发环境就算完整跑通了。8. 常见问题与排查思路环境搭建中遇到的问题九成以上是同一个类型路径、版本、端口、网络源。下面把这些高频问题整理成一个清单建议直接收藏遇到问题按表排查。问题现象常见原因解决思路java -version提示未知命令JDK 未安装或 Path 未配置检查 JAVA_HOME并把%JAVA_HOME%\bin加入 Pathmvn -v提示未知命令Maven 未安装或 Path 未配置检查 MAVEN_HOME并把%MAVEN_HOME%\bin加入 PathMaven 下载依赖很慢或卡住默认中央仓库访问不稳定配置阿里云镜像到 settings.xmlnpm install一直卡住npm 默认源慢执行npm config set registry https://registry.npmmirror.com后端启动后端口被占用8080 被其他程序占用使用netstat -ano | findstr 8080找到占用进程并处理访问后端接口出现 404接口路径写错或请求方法不对检查 Controller 中GetMapping路径与请求 URL 是否一致前端访问后端接口报跨域错误前端端口与后端端口不一致在后端配置 CORS 映射或者使用代理转发MySQL 连接报Access denied用户名或密码错误确认 application.properties 中的账号密码MySQL 连接报Unknown database数据库没有创建登录 MySQL 执行CREATE DATABASE demo_db ...后端启动时立即报数据库连接失败MySQL 服务未启动先启动 MySQL再启动后端除了表格里的情况还有一个经常会遇到的现象照着教程配置一模一样但别人成功你报错。这个时候不要怀疑人生优先检查版本。比如教程用的是 MySQL 5.7你本地装的是 MySQL 8.0驱动类名和连接 URL 就会有差异教程用的 JDK 8你用的 JDK 17某些 Spring Boot 老版本就起不来。遇到这种情况最稳的办法是把项目里 pom.xml 的依赖版本和本地环境版本列成一张表逐个对照交叉验证。9. 最佳实践与工程建议环境搭好只是第一步。真正决定后续开发效率的是你有没有从一开始就建立起规范。这一节的内容不是鸡汤都是实际项目中会踩到的点。9.1 尽量统一环境版本小团队也好个人项目也好最好把开发环境版本统一记录到一个 README 文件里。比如JDK 11 Maven 3.8.8 Node 18 LTS MySQL 8.0这样即使半年后你再打开这个项目也不用靠回忆去猜版本。9.2 端口和配置要有规划本地开发时避免所有服务都挤在同一端口。可以约定服务端口后端 Spring Boot8080前端 Vite5173MySQL3306如果某个端口被占用了优先排查是不是上一次启动的服务没有关干净再考虑换端口。9.3 不要盲目追求最新版本网上很多人建议“装最新版”这个说法在写新项目时有一定道理但在本地练习和多数企业项目中并不适用。很多开源框架的大版本升级会带来破坏性变更比如 Spring Boot 2.x 升级到 3.x 后很多老 API 被移除。项目能正常跑就不要随便升级核心组件的版本。9.4 使用镜像源的时候注意安全配置镜像源可以加速下载但也要保持基本的判断。原则上优先选择知名度高、维护稳定的公开镜像源。下载软件时尽量从官网获取安装包不要使用来路不明的链接。另外涉及数据库操作时尤其是删除或更新数据一定要先备份再操作。代码中也要尽量避免拼接 SQL使用参数绑定或预编译语句防止 SQL 注入风险。9.5 日志与报错信息要留好遇到启动失败不要只看最后一行要往前翻找到真正的错误栈。控制台里通常会出现Caused by:之类的信息那才是根因。把完整的报错信息复制下来再去搜索解决方案比凭记忆找答案可靠得多。10. 总结与下一步学习建议写到这里我们已经完成了一套完整的本地开发环境搭建JDK、Maven、Spring Boot 后端、Node.js、Vue 前端、MySQL 数据库并且通过接口把整条链路串联了起来。现在你再看“装环境”这件事应该能理解它不只是在装软件而是在配置一套协作链路。下一步可以试着在这个项目基础上继续扩展。比如给后端加一个 POST 接口实现新增用户的功能。使用 MyBatis-Plus 或 Spring Data JPA 替换 JdbcTemplate体验更完整的持久层方案。给前端增加一个表单页面把用户输入的数据提交到后端并存入数据库。学习如何使用 Docker 容器化这些服务进一步降低环境迁移成本。环境搭建过程中的“崩溃瞬间”其实大多数来自于对底层链路的不熟悉。当你理解了 JDK、Maven、Node、MySQL 各自负责什么、彼此怎么协作之后再遇到报错就不会再对着屏幕问“到底在装什么”了。希望这篇实战笔记能帮你在开发环境的坑里少走几步。建议先把这套流程完整跑通一遍跑通之后你会对本地开发环境建立更强的掌控感。
返回列表