☰
Flutter环境搭建与flutter doctor排错指南
2026/10/26 11:21:37 网站建设 项目流程

不少人在装 Flutter 的时候,卡住的地方往往不是写代码,而是打开终端敲下第一行flutter doctor之后,屏幕上那一串红黄相间的提示。有人反复卸载重装三五次,有人把系统环境变量改到乱七八糟,也有人干脆放弃转去别的方案。我自己的第一套 Flutter 环境是在一台配置不算新的笔记本上搭起来的,前后折腾了将近两天,最后发现问题其实只出在一个路径里带了空格。这件事让我意识到,Flutter 环境搭建真正考验的不是手速,而是对这套工具链各部件之间关系的理解。

这篇内容围绕 Flutter 环境搭建展开,讲清楚一套能长期使用的开发环境是怎么一步步配出来的:SDK 放在哪里、环境变量怎么设、Android 和 iOS 两边的工具链各自缺什么、flutter doctor的输出怎么读、编辑器怎么调、第一个项目跑起来之后还会遇到哪些问题。不管你是完全没接触过 Flutter 的新手,还是换机器重新配环境的老手,都能从里面找到可以直接照做的步骤和容易踩的坑。

1. 先把 Flutter 环境的拼图关系理清楚

1.1 SDK 只是大脑,不是整套系统

很多人对"装 Flutter"这件事有个误解,以为下载一个压缩包解压完就万事大吉,结果flutter doctor一跑发现缺一堆东西。原因在于 Flutter 本身只是一个跨平台的 UI 框架加一套命令行工具,它自己并不包含编译安卓应用所需要的构建工具,也不包含编译 iOS 应用需要的编译器。它更像是一个项目经理:负责把你的 Dart 代码分发到各个平台的工具链上,由那些工具链去完成真正的编译打包。

所以完整的一套 Flutter 开发环境,实际包含四个层次。最底层是操作系统本身,Windows、macOS、Linux 各有差异。往上一层是平台工具链,Android 侧需要 JDK、Android SDK、Gradle,iOS 侧需要 Xcode 和 CocoaPods。再往上是 Flutter SDK 和它自带的 Dart SDK。最上面才是编辑器、插件和调试工具。这四层里任何一层没配好,构建就会在某个环节断掉。

理解这个分层带来的第一个好处是:出问题的时候你知道该往哪一层找。比如提示Gradle task assembleDebug failed,问题基本就在平台工具链层,跟 Flutter SDK 没关系;提示Unable to find bundled Java version,那是 SDK 跟 JDK 之间的衔接问题;提示找不到设备,则属于最上层的调试工具没连通。分层清楚,排查范围就能立刻缩小。

我见过有人一遇到报错就去删掉 Flutter SDK 重下,这个动作在绝大多数情况下是无效的,因为问题根本不在那一层。所以配环境之前先花十分钟把分层想明白,比盲目操作一小时更省时间。

1.2 各平台工具链的依赖差异

三个主流操作系统能支持的目标平台并不一样,这一点必须在动手之前就搞清楚,否则会做很多无用功。

主机系统AndroidiOSWebWindows 桌面macOS 桌面Linux 桌面
Windows支持不支持支持支持不支持不支持
macOS支持支持支持不支持支持不支持
Linux支持不支持支持不支持不支持支持

从表格能看出一个很现实的问题:想编译 iOS 应用,就必须有一台 macOS 设备,没有别的办法。这一点经常让刚入门的人感到意外,但 iOS 的编译链条被官方工具严格限制在自家系统上,任何绕过的方案都不具备长期可用性。如果你的目标平台里有 iOS,那设备选型在项目立项阶段就得定下来。

另一个容易忽略的差异是文件系统。macOS 默认的文件系统对大小写不敏感,Linux 是敏感的,这会导致在 mac 上写得好好的一片代码,挪到 Linux 构建机器上因为文件名大小写不一致而报错。如果团队里同时有这两种机器,建议在项目里统一命名规范,所有文件名只用小写加下划线。

第三点是路径长度限制。Windows 上某些旧的构建工具对超过 260 字符的路径处理不友好,而 Flutter 的依赖缓存路径经常很深。所以 SDK 和项目都尽量放在层级浅的目录里,比如D:\dev\或者~/dev/这种,别放在桌面套三层文件夹的位置。

1.3 磁盘和内存的预留

这一点很少有人提前说,但实际很影响体验。Flutter SDK 本体解压后大概 1GB 出头,但真正占空间的是后面陆续下载的东西:Android SDK 各个版本的平台包、构建工具、系统镜像,加上 Gradle 缓存和 pub 依赖缓存,一套完整环境轻松超过 20GB。如果还要装 iOS 模拟器,再往上加十几 GB 也很正常。

内存方面,第一次构建一个空项目,Gradle 加上 Dart 编译进程同时运行,峰值占用 4GB 内存是常态。如果机器只有 8GB 内存又要开编辑器,构建过程会非常慢,甚至触发系统的内存回收。我一般建议至少 16GB,实在不行就关掉浏览器标签页再构建。

磁盘类型也值得注意。机械硬盘上一次全新构建可能要好几分钟,换成固态之后能压缩到几十秒。这个差距在反复调试阶段会被放大得非常明显,所以如果条件允许,把 SDK、项目、缓存都放在固态盘上。

2. SDK 落地的三条路和路径配置的坑

2.1 压缩包、包管理器、IDE 向导怎么选

安装 Flutter SDK 常见的有三种方式,每种适合的人群不一样。

第一种是下载官方压缩包手动解压。这种方式最透明,你能清楚知道 SDK 落在哪个目录,版本切换也好操作——想换版本就再解压一份到旁边,改一下环境变量指向即可。缺点是每次升级要手动下载,得自己记着当前用的哪个版本。我个人的主力机一直用这种方式,因为多版本并存的需求比较常见,比如某个老项目卡在旧版本上跑不动。

第二种是通过系统的包管理器安装,比如 macOS 上的包管理工具或者 Windows 上的包管理工具。优点是升级方便,一条命令搞定。缺点是包管理器装的版本可能不是最新稳定版,而且路径由包管理器管理,想同时装多个版本比较麻烦。这种方式适合只想快速体验、不打算长期折腾版本的人。

第三种是编辑器向导。部分 IDE 提供了"安装 Flutter SDK"的引导流程,点几下就自动下载配置。对完全新手来说门槛最低,但它把过程封装了,一旦出问题你反而不知道发生了什么,而且它装的 SDK 路径往往藏在用户目录的深层文件夹里,后续想手动操作会有点别扭。

我的建议是:如果是主力开发环境,用第一种;如果只是临时看看,用第三种;包管理器方式更适合对系统管理有洁癖的人。无论选哪种,路径都要满足三个条件——不含空格、不含中文、层级不要过深。

2.2 环境变量写错的几种典型形态

Flutter 的flutter命令能被终端识别,靠的是把flutter/bin加到系统的 PATH 里。这一步看着简单,实际出错率很高。

最常见的错误是把bin目录本身加进 PATH,而不是它的父目录。具体来说,PATH 里应该是.../flutter/bin,而不是.../flutter/bin/flutter。加错之后终端会提示找不到命令,或者在某些系统上提示权限不足。

第二个常见错误是路径里带了空格,比如放在C:\Program Files\flutter下面。Windows 的某些脚本对含空格路径处理不规范,编译到一半报错,而且报错信息完全看不出跟路径有关。这是最坑的一种情况——因为它不会在配置阶段暴露,而是在用了半小时之后突然炸出来。

第三个错误是多个 SDK 版本共存时 PATH 顺序不对。如果你装了两份 Flutter,PATH 里写在前面那个会生效。有时候你以为在用的是新版,实际上跑的是旧版,因为两行 PATH 的顺序反了。用flutter --version确认实际生效的版本是必要的习惯,尤其在切换项目之后。

第四个错误是用了相对路径。PATH 里必须是绝对路径,写成./flutter/bin这种在某些 shell 里能跑,换个终端就失效。配置环境变量时一律用绝对路径,省得后面莫名其妙。

改完环境变量之后,一定要重开一个终端窗口。已经打开的终端进程会继承旧的环境变量,改了也看不到效果,这一点经常让人误以为配置没生效。

2.3 给网络加一点的缓冲

首次运行 Flutter 的时候会去下载 Dart SDK、引擎产物和依赖包,这些资源都在境外。如果处在网络条件不理想的环境,可能会卡在Downloading Dart SDK这一步很久,或者干脆超时失败。

应对办法是配置镜像地址。Flutter 支持通过两个环境变量指定下载源,一个用于 SDK 和引擎产物,另一个用于 pub 依赖包。具体地址以官方文档公布的为准,配置成系统级环境变量之后,后续的下载和flutter pub get都会走镜像,速度会明显改善。

这里有个细节值得提醒:镜像地址配置之后,flutter doctor不会额外提示你正在用镜像,所以如果换了网络环境想改回默认源,记得手动把这两个变量删掉。我曾经因为忘了这回事,换到另一个网络后下载一直失败,查了半天才发现是老镜像地址已经不通了。

3. 平台工具链:Android 和 iOS 各缺什么

3.1 Android 侧的三件套:JDK、SDK、许可证

Android 这一侧是绝大多数人踩坑最多的地方,因为它涉及的东西最多。需要准备的主要是三样:JDK、Android SDK 和构建工具,以及接受一堆许可证协议。

JDK 的选择上,现在较新的 Flutter 版本要求 JDK 17 或以上。最省事的做法是直接用 Android Studio 自带的那个 JDK,路径一般在 Android Studio 安装目录下的jbr文件夹里。这样能避免版本冲突问题。如果你想用系统单独装的 JDK,必须确认版本匹配,否则会出现编译时能过、打包时报 Java 版本不兼容的尴尬情况。用java -version命令确认当前生效版本,再在 Flutter 的配置里明确指向 JDK 路径。

Android SDK 一般通过 Android Studio 的 SDK Manager 安装。这里要注意两件事。第一是 SDK 的存放路径,默认在用户目录下的一个隐藏文件夹里,路径可能很深,建议改成D:\android-sdk之类好记的位置,然后在环境变量里设置ANDROID_HOME指向它。第二是必须安装cmdline-tools这个组件,因为 Flutter 的命令行工具需要调用它里面的sdkmanager和avdmanager。很多人 SDK 装了一堆平台包但漏了 cmdline-tools,flutter doctor就会一直提示 Android SDK 配置不完整。

许可证这一步是这样:Android SDK 的部分组件使用前需要接受协议,Flutter 提供了flutter doctor --android-licenses命令来批量处理。运行后一路敲y就行。如果这个命令报错,多半还是 cmdline-tools 没装好或者ANDROID_HOME指错了,先解决前者。

还有一个经常被忽视的点:Gradle 的下载。第一次构建 Android 项目时,Gradle 要去下载对应版本的发行包和依赖,这个过程可能几百 MB。公司网络如果有防火墙或者需要走特定代理配置,得在项目里的 Gradle 配置文件中单独设置,跟 Flutter 的镜像设置是两套东西,别混在一起。这一块的具体配置方式以 Gradle 官方文档为准,我这里只提醒你要预留出时间和排查路径。

3.2 iOS 侧:Xcode 与 CocoaPods 的连锁依赖

iOS 相关的内容只在 macOS 上有意义。需要的核心是 Xcode 和一个叫 CocoaPods 的依赖管理工具。

Xcode 从 App Store 装完之后,还有一个必须执行的步骤:运行xcode-select --install安装命令行工具,然后用sudo xcode-select -s /Applications/Xcode.app/Contents/Developer把路径指到完整的 Xcode 而非命令行工具上。这一步漏掉的话,flutter doctor会识别到 Xcode 但构建时报找不到 SDK。

装完 Xcode 之后还需要同意许可协议,用sudo xcodebuild -license accept一行命令解决。有些版本还需要额外下载模拟器运行时,在 Xcode 的设置里能找到。如果模拟器列表是空的,八成就是运行时没下载。

CocoaPods 是 Ruby 生态的工具。macOS 自带的 Ruby 版本可能偏旧,直接用sudo gem install cocoapods装容易出问题。比较稳的做法是用版本管理工具装一个新的 Ruby,再去装 CocoaPods。装好之后跑一次pod setup初始化本地仓库,这一步会下载一个比较大的索引,需要耐心等。

这里有个连锁依赖的概念要理解:Flutter 的 iOS 构建实际是先生成 Xcode 工程,再用 CocoaPods 装原生依赖,最后调 Xcode 编译。所以三个环节任何一环出问题都会中断。如果报错信息里出现pod install失败,那就是 CocoaPods 这一层的事;如果出现xcodebuild失败,那是 Xcode 编译层的事。分清楚层级,排查方向就不会错。

值得一提的是 CocoaPods 的索引仓库更新有时会比较慢,如果一直卡住,可以先跳过更新直接使用现有索引,构建时加--no-repo-update参数。这个参数在 CI 环境里几乎是标配,能省掉大量等待时间。

3.3 桌面端和 Web 端的补充项

如果你的目标平台包含桌面端或 Web,还有额外的东西要准备。

Web 端最简单,只要机器上装了 Chrome 或者 Edge,Flutter 就能把项目跑在浏览器里调试。用flutter devices能看到浏览器设备,用flutter run -d chrome启动。不需要额外安装什么,这也是 Flutter 入门体验最顺滑的一条路——如果你的 Android 环境一时半会配不好,先用 Web 跑起来看看效果,能有效缓解挫败感。

Windows 桌面端需要安装 Visual Studio,注意是完整版不是 VS Code,安装时要勾选"使用 C++ 的桌面开发"这个工作负载。这一步经常被漏掉,导致flutter doctor提示找不到 Visual Studio 的 C++ 工具链。装完之后还要运行flutter config --enable-windows-desktop打开桌面支持开关。

macOS 桌面端相对简单,Xcode 装好之后基本就绪,运行flutter config --enable-macos-desktop打开开关即可。Linux 桌面端需要装一堆系统开发库,具体包名各发行版不一样,按flutter doctor的提示逐个装上就行。

这些桌面端的开关默认可能是关闭状态,flutter devices里看不到对应设备时,先确认开关有没有打开,再去查其他的。

4. flutter doctor:把诊断输出真正读懂

4.1 每一项检查到底在查什么

flutter doctor是配环境过程中最重要的工具,但很多人只看到有红色的叉就慌了,没仔细读提示到底在说什么。它其实是在逐项检查前面提到的那些分层是否完整,每一项对应一个独立的组件。

大致上它会检查这几类:Flutter SDK 本身的版本和状态、Android 工具链(包含 SDK、JDK、许可证)、Xcode 和 CocoaPods、各类编辑器插件、连接的设备、以及网络资源可达性。每一项后面如果有[✓]表示通过,[!]表示有警告但可能不影响使用,[✗]表示这项确实有问题。

关键在于理解[!]和[✗]的区别。很多新手看到黄色的感叹号就以为环境坏了,实际上那可能只是"你没有装某个可选组件"或者"你装了多个版本的某个工具"。比如提示 Android Studio 有多个版本,或者提示某个插件的版本不是最新的,这些完全不影响你构建项目。真正需要处理的是红色的叉。

另外,输出里每一项下面通常会有一行建议,告诉你具体该做什么。这行字信息量很大,比在网上搜"flutter doctor 报错"得到的答案准确得多。养成先读建议再动手的习惯,能省掉大量试错。

还有一个实用性很强的参数是flutter doctor -v,它会输出详细版本信息,包括各个工具的路径和版本号。当你不确定当前生效的是哪个 JDK、哪个 Android SDK 时,用这个命令一眼就能看明白。排查环境冲突问题的时候,这个参数基本是必用的。

4.2 一次完整的排查记录

说一个我印象比较深的排查过程,整个过程大概花了两个小时,但每一步的思路是可以复用的。

换到一台新机器之后跑flutter doctor,Android 那一项是红叉,提示找不到 Android SDK。第一步确认ANDROID_HOME环境变量的值,发现指向的目录确实存在,但目录里只有platform-tools,没有platforms和build-tools。也就是说 SDK 目录建了,但核心组件没装。于是打开 Android Studio 的 SDK Manager 补齐组件,同时装上cmdline-tools。

补齐之后重新跑 doctor,红叉变成提示许可证未接受。运行flutter doctor --android-licenses,一路确认,这项过了。

接着又出现新问题:构建时报 Java 版本不兼容。用flutter doctor -v看,发现 Flutter 调用的 JDK 是一个很老的系统 JDK 版本,而不是 Android Studio 自带的那个。于是用flutter config --jdk-dir明确指向 Android Studio 的jbr目录,问题解决。

最后还剩一个警告,说检测到多个 Android SDK 位置。查了一下是因为系统里还留着一个旧的 SDK 路径在环境变量里。删掉多余的那条 PATH 配置,警告消失。

这一串问题如果混在一起看会很乱,但拆成"缺组件 → 缺许可 → JDK 版本不对 → 路径重复"四个独立问题,每个都很清晰。这也是为什么我强调分层思维:每次只解决一层的问题,解决完重新跑诊断,让工具告诉你下一个问题是什么,而不是一次性去猜所有可能。

还有一点经验:doctor 的输出最好在每次改动环境变量之后重新跑一遍,因为环境变量是很多问题的根因。改完不重开终端、不重新 doctor,就很容易误判成"改了也没用"。

5. 编辑器配置:让写代码这件事顺手起来

5.1 Android Studio 和 VS Code 该选哪个

两个都是 Flutter 官方支持的主流选择,但定位不太一样。

Android Studio 的优势在于原生 Android 工具链集成得最完整,布局检查器、性能分析器、模拟器管理这些都在一个地方,排查 Android 相关问题的时候特别方便。缺点是启动慢、占内存多,机器配置一般的话开着它再构建项目会比较吃力。另外它本身就是为 Android 开发设计的,如果你只做 iOS 或 Web,很多功能用不上。

VS Code 的优势是轻快,启动瞬间完成,插件生态灵活,写 Dart 代码的体验其实相当好,代码补全和跳转都很顺。缺点是对 Android 原生层面的支持弱一些,比如查看 Android 的日志、操作模拟器这些,还是得回到 Android Studio 或者命令行。

我自己的用法是两个都装,日常写代码用 VS Code,需要深度调试 Android 问题时切到 Android Studio。这个组合在团队里也挺常见。如果你是纯新手,建议先用 Android Studio 把环境跑通,它对环境问题的提示更直白,等熟悉了再按偏好选。

5.2 必装的插件和几个关键设置

无论用哪个编辑器,Flutter 和 Dart 这两个插件是必须装的。装完之后编辑器才能识别.dart文件、提供语法高亮和代码补全。

VS Code 里还有几个插件值得加。一个是用于在保存时自动格式化代码的,配合 Dart 自带的格式化工具,能保证团队代码风格一致。另一个是用于查看 widget 层级结构的,调试界面问题时很有用。Android Studio 这边对应的是 Flutter 和 Dart 插件,装完会多出几个工具窗口。

关键设置我列几个实际影响体验的。第一是自动保存时格式化,在设置里把 format on save 打开,省得每次手动按格式化快捷键。第二是代码补全的触发方式,默认设置有时候会跟输入法冲突,可以调一下。第三是 SDK 路径,如果编辑器识别不到 Flutter SDK,需要手动在设置里指定 SDK 目录。

还有一个容易被忽略的点:终端集成。VS Code 内置的终端会继承系统的环境变量,但如果你在打开 VS Code 之后才改的环境变量,内置终端里可能还是旧的。这时候重启整个编辑器才能生效,只重开终端面板不够。这个细节坑过我好几次。

5.3 新建项目的几个初始化动作

环境配好之后,用flutter create 项目名建第一个项目。这个命令会生成一整套目录结构,包含各平台的工程文件。

建完之后有几件事建议立刻做。第一是检查pubspec.yaml里的 SDK 版本约束,确认跟当前装的 Flutter 版本匹配。第二是把项目目录下的构建产物目录加进版本控制的忽略文件,避免把几百 MB 的缓存提交上去。第三是跑一次flutter analyze,确认代码静态检查通过,这是一个很好的环境自检动作。

项目名有个限制要注意:只能用英文小写字母、数字和下划线,不能有连字符和大写字母。用中文或者带连字符的名字会直接报错。这个限制来自 Dart 包命名规范,别问为什么,照着做就行。

如果项目需要指定组织标识,可以在 create 的时候加--org参数,生成的应用包名会带上这个前缀。这个参数在建项目时忘了加,后面要改会比较麻烦,涉及多个平台配置文件的改动,所以最好一开始就定好。

6. 第一个 Demo 跑起来之后才会暴露的事

6.1 设备、模拟器和真机的选择

flutter devices会列出当前所有可用的目标设备,包括模拟器、连接的真机和浏览器。用flutter run -d 设备ID指定在哪个设备上跑,不指定的话它会自动选一个。

模拟器的好处是方便、可以随时重置、不占真机。缺点是性能差一些,尤其是图形密集的界面,模拟器上跑得卡不代表真机上卡。而且模拟器对某些硬件的模拟并不完整,比如摄像头、蓝牙、传感器这些,涉及这些功能的调试必须上真机。

Android 真机调试需要先在设备上开启开发者选项,再打开 USB 调试,连上电脑后设备会弹出一个授权对话框,点允许。如果flutter devices看不到设备,先确认授权有没有点,再看 USB 连接模式是不是选成了"仅充电",这个模式很多手机默认就是它,必须改成文件传输模式才能识别。

iOS 真机调试稍微复杂一点,需要在 Xcode 里配置开发者账号和签名。免费账号也能做真机调试,但应用的有效期只有七天,过期要重新签名。这个限制在长期测试阶段会比较烦,如果项目周期长,得考虑正式的开发者账号。

6.2 首次构建为什么那么慢

第一次构建一个 Flutter 项目,可能要等好几分钟,这跟机器性能关系不大,主要时间花在下载依赖上。Gradle 要下载对应版本的发行包、各种插件和依赖库,加起来可能几百 MB。这些下载完之后会缓存在本地,第二次构建就快很多,通常几十秒到一两分钟。

理解这一点很重要,因为很多人在第一次构建卡住的时候会误以为是环境坏了,然后中断重来,结果每次都从头开始下载,永远跑不完。正确做法是耐心等,或者去看构建日志确认它确实在下载而不是卡死。

如果确实下载特别慢,可以考虑给 Gradle 配置镜像源,这一步跟 Flutter 的镜像配置是分开的,需要在项目的 Gradle 配置文件里单独设置。配置方式各个版本略有差异,以对应版本的官方文档为准。

还有一个能显著加速的做法是给 Gradle 分配更多内存。在项目的 Gradle 属性文件里可以设置 JVM 参数,比如把堆内存上限调大一些。默认值对稍大的项目来说往往不够,构建过程中频繁触发垃圾回收会让整体速度变慢。

6.3 缓存清理的正确姿势

用一段时间之后,环境里会积累各种缓存,有时候缓存损坏会导致一些莫名其妙的构建失败。Flutter 提供了flutter clean命令清理项目级的构建产物,这个命令在日常开发中会用得非常多,尤其是在切换分支、改依赖版本之后。

但flutter clean只清项目目录,不清全局缓存。全局缓存包括 pub 下载的依赖包、引擎产物等等。清理全局缓存用flutter pub cache repair,这个命令会把所有依赖重新下载一遍。注意它比较慢,不要频繁执行,只在确实怀疑缓存损坏的时候用。

Gradle 的缓存是另一套,位置在用户目录下的隐藏文件夹里,清理方式是删除对应的缓存目录或者用 Gradle 自己的清理命令。一般不建议随便删,因为重新下载很费时间,只有在遇到依赖解析异常且其他办法都无效时才考虑。

我在实践中总结出一个排查顺序:先flutter clean加重新构建,不行再检查依赖版本是否冲突,还不行再考虑清全局缓存。这个顺序从代价小到大,能解决大部分构建问题。

6.4 版本管理:别把所有东西都提交

最后说一个跟环境有关但容易被忽略的事:版本控制里到底该提交什么。

Flutter 项目里,各平台的原生工程文件有一部分是自动生成的,比如 iOS 的 Pods 目录、Android 的构建产物目录、以及.dart_tool这种缓存目录,这些都不该提交。flutter create生成的忽略文件已经覆盖了大部分,但如果后续加了自定义的构建脚本或者本地配置文件,需要自己补上。

pubspec.lock这个文件要不要提交,是个有争议的点。对于应用类项目,建议提交,因为它锁定了依赖的确切版本,能保证团队里所有人、以及构建服务器上用的依赖完全一致。对于库类项目,一般不提交,让下游自己解析版本。

还有本地配置文件,比如集成某些服务时生成的配置,里面有密钥或者跟机器相关的路径,这类文件必须加到忽略列表里,同时提供一个示例文件说明需要填哪些字段。这个习惯能避免很多"在我机器上能跑"的问题。

环境搭建这件事,说到底就是把一条链路上的每个环节都验证一遍,然后把这些验证步骤记下来。我现在的习惯是在换机器的时候,一边配一边写一份清单,下次直接照着走,能省掉大量回忆和试错的时间。这份清单里最有用的一条其实是:每次只改一个变量,改完立刻验证,不要一次改五个地方然后猜是哪个生效了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询