ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Nitro 部署到 Deno 运行时:deno_server 预设完整指南

2026/9/15 12:35:06 拓冰建站 浏览量
Nitro 部署到 Deno 运行时:deno_server 预设完整指南 Nitro 部署到 Deno 运行时deno_server 预设完整指南【免费下载链接】nitroNext Generation Server Toolkit. Create web servers with everything you need and deploy them wherever you prefer.项目地址: https://gitcode.com/GitHub_Trending/ni/nitro本文基于 Nitro 仓库Next Generation Server Toolkit的 Deno 运行时部署文档 展开系统讲解如何将 Nitro 应用构建为可在 Deno 运行时上运行的自定义服务器。读完本文你将掌握deno_server预设的构建与启动命令、端口/主机/TLS 等运行环境变量、Node 内置模块兼容策略、WebSocket 与定时任务支持以及向 Deno Deploy 平台发布应用的两条完整路径。一、deno_server预设是什么Nitro 支持通过「预设Preset」将同一份应用代码构建成面向不同运行时与平台的产物。文档明确给出面向 Deno 运行时使用的预设名称Presetdeno_server该预设位于 src/presets/deno/preset.ts其别名列表中包含denoaliases: [deno]因此你可以用deno_server或deno两种写法指定它。从源码结构看deno_server预设的核心配置包括配置项取值说明entry./deno/runtime/deno-server指定 Deno 服务器运行时入口serveStatictrue启用静态资源服务exportConditions[deno]打包时优先解析带deno导出条件的依赖preview命令deno -A ./server/index.mjs预览生产构建结果output.formatESM产物为 ES Module 格式二、构建与启动 Deno 生产服务器文档给出了完整的构建与启动流程# 使用 Deno 预设构建 NITRO_PRESETdeno_server npm run build # 启动生产服务器 deno run --allow-net --allow-read --allow-env .output/server/index.mjs2.1 构建阶段发生了什么执行NITRO_PRESETdeno_server npm run build后Nitro 会将应用输出到.output目录其中.output/server/index.mjs为最终服务器入口.output/deno.json会被自动生成见下文。在 Rollup 打包层面deno_server 预设 会将三类模块声明为外部依赖不参与打包以https://开头的远程模块Deno 原生支持从 URL 直接导入以node:开头的 Node 内置模块Deno 提供原生node:兼容层Node 的builtinModules无前缀的内置模块名。同时开启hoistTransitiveImports: false避免把间接依赖的导入提升到入口顶部从而保证生成的 ESM 文件能被 Deno 直接执行。2.2 自动生成的 deno.json预设通过compiled钩子在构建完成后自动向.output目录写入一个deno.json配置文件内容如下{ tasks: { start: deno run -A ./server/index.mjs } }这意味着构建完成后你可以直接在.output目录下用 Deno 的任务系统启动服务器cd .output deno task startdeno-server 测试用例 正是使用deno task start启动被测服务器并通过NITRO_PORT、NITRO_HOST环境变量将其绑定到随机端口与127.0.0.1上进行验证说明这一启动方式是官方测试认可的推荐路径。2.3 关于--allow-*权限参数文档中的启动命令使用了三个权限标志--allow-net允许网络访问监听端口、发起 HTTP 请求--allow-read允许读取文件系统静态资源、配置文件--allow-env允许读取环境变量端口、主机、密钥等配置。你也可以使用-A--allow-all一次性授予全部权限例如预设内置的预览与start任务都采用了deno run -A的写法。生产环境建议按最小权限原则显式声明所需权限。三、运行时入口与运行环境变量从 运行时入口实现 可以看到Deno 服务器入口通过srvx的serve函数启动并支持以下环境变量配置环境变量作用默认值NITRO_PORT或PORT监听端口3000NITRO_HOST或HOST监听主机名不设置由运行时决定NITRO_SSL_CERTTLS 证书路径无不启用 TLSNITRO_SSL_KEYTLS 私钥路径无不启用 TLS源码中的解析逻辑为const _parsedPort Number.parseInt(process.env.NITRO_PORT ?? process.env.PORT ?? ); const port Number.isNaN(_parsedPort) ? 3000 : _parsedPort; const host process.env.NITRO_HOST || process.env.HOST; const cert process.env.NITRO_SSL_CERT; const key process.env.NITRO_SSL_KEY;使用示例NITRO_PORT8080 NITRO_HOST0.0.0.0 deno run --allow-net --allow-read --allow-env .output/server/index.mjs当同时设置了NITRO_SSL_CERT与NITRO_SSL_KEY时服务器会自动以 HTTPS 模式启动tls: cert key ? { cert, key } : undefined。四、Node 兼容性与 unenv 处理Nitro 生态中有大量依赖 Node 内置模块的库而 Deno 提供了原生node:兼容层。为此Deno 预设的 unenv 配置 做了三件事外部化内置模块将node-compat.ts中列出的全部 Node 内置模块标记为external交给 Deno 运行时处理别名映射对node:fs/fs这类带前缀与不带前缀的写法建立别名统一指向 Deno 的node:模块全局注入注入process、setImmediate、clearImmediate、Buffer等 Node 全局对象分别来自node:process、node:timers、node:buffer。其中内置模块清单由 node-compat.ts 自动生成来源为 Deno 官方平台兼容性数据覆盖node:fs、node:http、node:crypto、node:stream等常见模块同时标注了各模块缺失的导出如node:fs缺少glob、fchmod等并单独列出少数完全不受支持的模块如node:_http_client、node:sea。在选用 Deno 运行时之前可对照此清单评估依赖的兼容性。五、WebSocket、定时任务、追踪与优雅关闭从 deno-server 入口 的代码路径可以看出Deno 预设不止能跑普通 HTTP 服务还完整接入了 Nitro 的以下运行时能力WebSocket通过crossws/adapters/deno适配器处理Upgrade: websocket请求仅在应用启用了 WebSocket 路由时激活定时任务通过startScheduleRunner启动任务调度器对应#nitro/runtime/task支持waitUntil语义Tracing注入tracingSrvxPlugins插件将追踪中间件接入请求生命周期详见 docs/1.docs/50.tracing.md优雅关闭通过setupCloseHooks注册关闭钩子未处理错误兜底trapUnhandledErrors统一捕获未处理异常。这意味着路由、中间件、插件、缓存、任务调度等 Nitro 功能在 Deno 运行时下均可正常使用而不只是「能启动」。六、部署到 Deno Deploy文档将 Deno Deploy 的完整部署流程指向 Deno Deploy 平台指南这里做核心要点提炼。6.1 预设deno_deployDeno Deploy 使用独立的deno_deploy预设同样定义在 src/presets/deno/preset.ts与本地服务器预设的区别在于入口为./deno/runtime/deno-deploy基于Deno.serve编写见 运行时实现产物入口文件名为index.ts将DENO_DEPLOYMENT_ID环境变量注入部署清单manifest用于标记部署版本内置部署命令deno run -A jsr:deno/deployctl deploy server/index.ts。6.2 使用 deployctl 部署# 使用 deno_deploy 预设构建 NITRO_PRESETdeno_deploy npm run build # 在输出目录中执行部署 cd .output deployctl deploy --projectmy-project server/index.ts部署前需要登录 Deno Deploy 获取DENO_DEPLOY_TOKEN访问令牌并设置为环境变量。6.3 通过 GitHub Actions 持续部署无需在 CI 中配置密钥只需在 Deno Deploy 项目设置中选择「GitHub Actions」部署模式并在仓库.github/workflows目录创建如下工作流name: deno-deploy on: push: branches: - main pull_request: branches: - main jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkoutv5 - run: corepack enable - uses: actions/setup-nodev6 with: node-version: 20 cache: pnpm - run: pnpm install - run: pnpm build env: NITRO_PRESET: deno_deploy - name: Deploy to Deno Deploy uses: denoland/deployctlv1 with: project: my-project entrypoint: server/index.ts root: .output七、运行时自动检测除了手动指定预设外Nitro 还会根据运行环境自动选择预设。预设解析逻辑 中维护了{ deno: deno, bun: bun }的运行时映射当你在 Deno 运行时下启动 Nitro例如在开发或预览阶段且未显式指定预设时Nitro 会通过std-env检测到deno运行时并自动解析到deno别名对应的deno_server预设。小结Nitro 对 Deno 的支持分为两个层次deno_server预设用于在自托管 Deno 环境中运行生产服务器deno_deploy预设用于发布到 Deno 云平台。两者共享同一套基于srvx的运行时基础完整支持静态资源、WebSocket、定时任务、追踪与优雅关闭并通过 unenv 与 Deno 原生node:兼容层平滑处理 Node 依赖。相关源码与测试可直接在仓库中继续深入研读预设定义src/presets/deno/preset.ts服务器运行时入口src/presets/deno/runtime/deno-server.tsDeno Deploy 入口src/presets/deno/runtime/deno-deploy.tsNode 兼容配置src/presets/deno/unenv/preset.ts兼容性测试test/presets/deno-server.test.ts平台部署文档docs/2.deploy/20.providers/deno-deploy.md【免费下载链接】nitroNext Generation Server Toolkit. Create web servers with everything you need and deploy them wherever you prefer.项目地址: https://gitcode.com/GitHub_Trending/ni/nitro创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考