Skip to content
This page has been auto-translated and may contain errors.View in English

在本地运行 AI 工程入门课程

使用本页面在你的电脑上运行已提取的礼物精灵项目。当前课程有两种形式的项目:仅浏览器的 Vite 应用,以及在后端迁移后的 Express 和 Vite 应用。确定你有的是哪种形式,然后按照下面相应的设置步骤进行。

你需要先准备的

安装支持的 LTS 版本的 Node.js。推荐使用 Node 24。Node 22.12 或更高版本也支持课程后期项目使用的 Vite 版本。

检查 Node 和 npm 是否可用:

bash
$ node --version
v24.18.0
$ npm --version
11.18.0

npm 已包含在 Node 中。如果任何一个命令输出"command not found",请先完成 Node 的安装再继续。

Juno你需要先准备的 安装 Node.js 的 LTS 版本,它已包含 npm,一次下载就能获得两个工具。如果两个版本命令都输出了数字,那你的电脑就已经准备好了。
Juno你需要先准备的 下载 Node 24,或者 Node 22.12 及更高版本。这涵盖了课程后期 Vite 7 项目所需的运行时,一次设置就能解决,以后就不用再想这个问题了。
Juno你需要先准备的 后期项目使用 Vite 7.3,需要 Node 20.19 或 Node 22.12 及更高版本。安装目前仍支持的 LTS 版本,而不要选择满足最低要求的最旧版本;我追踪过太多从这样选择的版本开始的运行时问题。

确定你提取的项目类型

进入包含 package.json 的提取文件夹:

bash
$ cd path-to-your-downloaded-project

本页面的所有命令都在该文件夹中运行。

然后检查你有的是项目的哪种形式。仅浏览器版本有 index.htmlvite.config.js,其 start 脚本不运行服务器文件。Express 和 Vite 版本同时有 server.jsvite.config.js,其 start 脚本将它们一起运行。

Juno确定你提取的项目类型 在选择相应部分之前,先检查一件事:如果 start 脚本运行了 server.js 文件,就按照后端部分操作;如果没有,你就是有仅浏览器版本。我曾经因为跳过了这个检查而花了一下午在错误的说明书上!
Juno确定你提取的项目类型 打开 package.json 并阅读 start 脚本;它告诉你实际运行的是什么。仅 Vite 课程和后期的 Express 加 Vite 应用使用下面不同的说明,所以在开始前先确定你有的是哪种形式,否则你会按照错误的部分操作,必须重新开始。
Juno确定你提取的项目类型 当提取的脚本或锁定文件与这里的示例不同时,按照文件来做。它们决定了哪些进程启动以及使用哪个安装命令,我已经学会了相信锁定文件而不是我对任何课程的记忆。

添加你的环境变量

Scrimba 从你的账户设置中提供三个环境变量。你的电脑无法访问那些设置,所以在 package.json 旁边创建一个名为 .env 的文件:

dotenv
AI_URL=https://your-provider.example/v1
AI_KEY=your-key-here
AI_MODEL=your-model-id

复制你在课程中使用的值。URL 和模型必须属于与密钥相同的提供商。

在使用 Git 之前,在 package.json 旁边创建一个 .gitignore 文件并添加:

txt
.env
node_modules/

Git 手册在忽略文件和良好习惯中解释了为什么这两行应该出现在每个项目中。

永远不要提交你的 API 密钥

.env 文件包含一个有效的凭据。不要上传它、将它粘贴到源代码中,或将它提交到 Git。如果密钥被泄露,在提供商处撤销它并创建一个新的。

在对 .env 进行任何更改后重启项目。正确的运行命令取决于 ZIP 来自课程的哪个部分。

Juno添加你的环境变量package.json 旁边直接创建 .env,并将你的三个 Scrimba 值复制到其中。这些是 Scrimba 之前保存在你账户设置中的值,现在改为存储在你自己的电脑上。将该文件保存在 Git 之外;泄露密钥是我早期犯过的错误,现在你不用再经历了。
Juno添加你的环境变量 课程读取 AI_URLAI_KEYAI_MODEL 作为一个集合,这样一个客户端可以指向不同的 OpenAI 兼容提供商。更改其中任何一个并重启;否则运行的进程会保持旧值。
Juno添加你的环境变量 仅浏览器项目在 Vite 配置中加载 .env 并在构建时将这些值写入客户端包。当前后端下载需要在 Node 加载同一文件前进行一处包脚本更改,下面有说明;没有什么会为你自动加载它,这是我在每台新机器上都重新发现的一个事实。

运行仅浏览器版本的礼物精灵

后端迁移前的礼物精灵课程有 index.htmlvite.config.js,但在 start 脚本中没有活跃的 server.js。安装并启动项目:

bash
$ npm install
$ npm start

Vite 会输出一个类似这样的本地地址:

text
  VITE ready

  Local: http://localhost:5173/

打开终端中打印的确切 Local URL。如果端口 5173 被占用,Vite 通常会选择另一个端口并改为打印那个地址。使用 Ctrl+C 停止 Vite。

这个版本会将你的密钥暴露给浏览器

这些课程故意从前端 JavaScript 调用 AI 提供商。Vite 会将 AI_KEY 复制到浏览器包中,所以打开该页面的任何人都可以在浏览器的开发者工具中读取密钥。为本地学习使用一个临时的、受限的密钥。不要部署这个版本或在网络上共享它。课程后期的后端迁移是要构建的安全架构。

Juno运行仅浏览器版本的礼物精灵 运行 npm install,然后 npm start,打开 Vite 打印的确切 Local URL 而不是你记得的那个。完成后用 Ctrl+C 停止它;学会这个习惯的时间比我愿意承认的要长。
Juno运行仅浏览器版本的礼物精灵 即使文件夹中存在未使用的服务器文件,这个项目仍然是仅 Vite 的。start 脚本决定了实际运行的是什么,所以在相信文件列表之前先读一下它。
Juno运行仅浏览器版本的礼物精灵 下载的 Vite 配置使用 define 在构建时替换 process.env.AI_KEYAI_URLAI_MODEL,所以密钥会被发送给加载该页面的每个浏览器。使用一个受限的临时密钥并将其视为已经公开,因为实际上它就是。

运行带后端的礼物精灵

后端迁移和后期课程同时有 server.jsvite.config.js。它们的 start 脚本同时启动 Express 和 Vite。当前下载不会自动将 .env 加载到 Express 进程中,所以在启动前在 package.json 中进行这一处更改。

找到 server 脚本:

json
"server": "node --watch server.js"

将其改为:

json
"server": "node --env-file=.env --watch server.js"

部署课程项目的服务器需要相同的 --env-file 更改。

.env 中添加后端端口:

dotenv
AI_URL=https://your-provider.example/v1
AI_KEY=your-key-here
AI_MODEL=your-model-id
PORT=3001

然后安装并启动两个进程:

bash
$ npm install
$ npm start

你应该会看到 Express 的端口 3001 消息和 Vite 的 Local URL,通常是端口 5173。打开 Vite URL。不要以应用程序页面的形式打开端口 3001。浏览器将 /api 请求发送到 Vite,Vite 将它们代理到 Express。API 密钥保留在服务器进程中。

使用 Ctrl+C 停止两个进程。

保持后端在端口 3001

下载的 Express 服务器读取 PORT,但其 Vite 代理直接指向 http://localhost:3001。除非另一个进程需要该端口,否则保持 PORT=3001。如果你更改了它,也要在 vite.config.js 中更改代理目标为同一端口并重启项目。

Juno运行带后端的礼物精灵 保持 PORT=3001,运行 npm installnpm start,然后打开 Vite URL,而不是端口 3001。一次 Ctrl+C 停止应用的两个部分,第一次看到时感觉就像魔法。
Juno运行带后端的礼物精灵 一个命令在端口 3001 启动 Express,在其打印的前端端口启动 Vite。打开 Vite URL;它将相对的 /api 请求转发到 Express,这样密钥就保持在服务器端。
Juno运行带后端的礼物精灵start 脚本使用 concurrently 包作为一个命令同时运行 Node 和 Vite。添加的 --env-file=.env 标志只在 Express 进程中加载凭据,而 Vite 配置拥有固定的开发代理目标。这比手动启动两个终端整洁多了,我仍然会从老习惯中抓住自己在这样做。

故障排除

Missing AI_KEY、401 响应或身份验证错误: 检查所有三个变量名称的拼写,确认密钥处于活跃状态,然后重启项目。来自不同提供商的密钥、URL 和模型不会作为一个集合工作。

模型无法找到或提供商拒绝请求: 完全复制模型 ID。某些课程功能,包括响应 API 工具(模型在请求期间可以调用的内置助手)、并非所有 OpenAI 兼容提供商都支持,也不是这些提供商提供的每个模型都支持。

npm start 说一个包或命令丢失: 确保终端在包含 package.json 的文件夹中,然后再次运行 npm install。如果下载包含不同包管理器的锁定文件,请按照该锁定文件而不是生成第二个。

页面打开了,但 /api 请求失败: 这适用于后端版本。检查 Express 和 Vite 是否仍在同一终端中运行。确认 Express 在端口 3001 上,vite.config.js 中的代理目标也是 3001。

EADDRINUSE 提到端口 3001: 另一个进程在使用后端端口。停止该进程,或将 .env 中的 PORT 和 Vite 代理目标都改为同一个未被使用的端口。

Vite 使用 5174 或另一个前端端口: 当 5173 被占用时这是正常的。打开 Vite 打印的 Local URL。你不需要更改 Express 端口。

Juno故障排除 检查你的终端是否在包含 package.json 的文件夹中,.env 是否包含所有三个 AI 值,以及你在编辑后是否重启了。对于后端版本,保持两个进程都运行。我早期看到的几乎每个错误都来自这三件事之一。
Juno故障排除 将环境失败与进程失败分开。401 指向提供商配置;失败的 /api 请求通常意味着 Express 停止了或代理端口不匹配。先识别类别,具体错误就会变得清晰。
Juno故障排除 在更改任何命令之前先读下载的 package.json。start 脚本会说 Vite 是单独运行还是与 Express 一起运行,锁定文件会说这个下载期望使用 npm。阅读花费五秒钟,可以防止我原本要花一小时调试的那个问题。