VSCode调试Fresh项目需启用Deno扩展并初始化工作区,否则.tsx文件被误作普通TS处理,导致类型检查、定义跳转及@preact/signals失效;须创建空deno.json、运行Deno: Initialize Workspace Configuration、勾选读取和环境权限、重启VSCode,并用deno task start --inspect配合launch.json Attach调试islands组件。

VSCode 调试 Fresh 项目必须启用 Deno 扩展并初始化工作区
不手动初始化,Deno: Initialize Workspace Configuration 就不会触发,VSCode 会把 .tsx 文件当成普通 TypeScript 处理,类型检查、跳转定义、@preact/signals 提示全部失效。
常见错误现象包括:Cannot find module '@preact/signals'、useSignal is not defined、断点打在 islands/Counter.tsx 里完全不命中。
- 确保项目根目录存在空的
deno.json(哪怕只写{}) - 右键编辑器空白处 → 选择
Deno: Initialize Workspace Configuration - 弹窗中至少勾选
Allow read access(读取routes/和islands/)和Allow env access(调试时需读取DENO_ENV) - 重启 VSCode 窗口,观察状态栏右下角是否出现
Deno v1.42+标识
调试 Islands 组件要改用 deno task start --inspect 启动
Fresh 的 islands 是运行在客户端的 Preact 组件,但 JS 文件由服务端按需生成并注入。直接用浏览器 DevTools 断点几乎无效——因为源码映射(source map)路径不匹配,且 hydration 过程发生在 DOM 挂载后。
真正有效的调试方式是:让 Deno 运行时暴露 inspector 协议,再通过 VSCode Attach 连接。
- 在终端执行:
deno task start --inspect=0.0.0.0:9229(注意不是--inspect-brk,后者会卡在入口,错过 islands 加载时机) - VSCode 中创建
.vscode/launch.json,内容为:
{
"version": "0.2.0",
"configurations": [
{
"name": "Attach to Fresh",
"type": "node",
"request": "attach",
"port": 9229,
"address": "localhost",
"sourceMaps": true,
"outFiles": ["${workspaceFolder}/.fresh/**/*"]
}
]
}
启动调试后,断点可落在 islands/Counter.tsx 的 useSignal() 调用或 onClick 回调内,且变量作用域完整可见。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
文件系统路由调试:别信 routes/[id].tsx 的路径直觉
Fresh 的路由解析不是字符串匹配,而是基于文件系统扫描 + 模式转换。你看到的 [id] 并非 Express 风格的参数占位符,它会被编译成正则路径规则,且优先级严格依赖文件名和位置。
典型陷阱:routes/blog/[slug].tsx 和 routes/blog/[slug]/index.tsx 是两个不同路由;routes/[name].tsx 会覆盖 routes/index.tsx,因为动态段优先级高于静态索引。
- 修改路由文件后,必须重启
deno task start——fresh.gen.ts不会热更新 - 想确认当前生效的路由表?打开
fresh.gen.ts,搜索export const routes = [,里面是实际注册的路由数组 - 调试 404 时,先检查
routes/_error.tsx是否存在;它不会自动 fallback,必须显式定义
deno.json 里没配 tasks,deno task start 就会失败
Fresh 官方脚手架生成的 deno.json 默认含 tasks 字段,但手动创建项目或从旧模板迁移时极易遗漏。此时执行 deno task start 会报错:No tasks found in deno.json,而不是你预想的 “找不到入口文件”。
最小可用配置只需两行:
"tasks": {
"start": "deno run -A --watch=static/,routes/,islands/ dev.ts"
}
-
-A是必须的:Fresh 启动需读取routes/、写入.fresh/、监听文件变更 -
--watch参数必须显式列出目录:只写--watch不生效;漏掉islands/就无法热更交互组件 - 不要加
--unstable:Fresh v1.4+ 已移除所有不稳定 API 依赖
最常被忽略的是 watch 路径粒度——islands/ 目录改动不会触发 fresh.gen.ts 重生成,但会强制刷新对应 island 的客户端 JS,这个行为边界得心里有数。


















