logo
  • 指南
  • 配置
  • 插件
  • API
  • 示例
  • 社区
  • Modern.js 2.x 文档
  • 简体中文
    • 简体中文
    • English
    • 开始
      介绍
      快速上手
      版本升级
      名词解释
      技术栈
      核心概念
      页面入口
      构建工具
      Web 服务器
      基础功能
      路由
      路由基础
      配置式路由
      数据管理
      数据获取
      数据写入
      数据缓存
      渲染
      渲染模式总览
      服务端渲染(SSR)
      服务端流式渲染(Streaming SSR)
      渲染缓存
      静态站点生成(SSG)
      React Server Components (RSC)
      渲染预处理
      样式开发
      引入 CSS
      使用 CSS Modules
      使用 CSS-in-JS
      使用 Tailwind CSS
      HTML 模板
      引用静态资源
      引用 JSON 文件
      引用 SVG 资源
      引用 Wasm 资源
      调试
      数据模拟(Mock)
      网络代理
      使用 Rsdoctor
      使用 Storybook
      测试
      Playwright
      Vitest
      Jest
      Cypress
      路径别名
      环境变量
      构建产物目录
      部署应用
      部署自托管应用
      第三方平台
      进阶功能
      使用 BFF
      基础用法
      运行时框架
      创建可扩展的 BFF 函数
      扩展 BFF Server
      扩展一体化调用 SDK
      文件上传
      跨项目调用
      优化页面性能
      代码分割
      静态资源内联
      产物体积优化
      React Compiler
      提升构建性能
      浏览器兼容性
      配置底层工具
      源码构建模式
      服务端监控
      Monitors
      日志事件
      指标事件
      国际化
      基础概念
      快速开始
      配置说明
      语言检测
      资源加载
      路由集成
      API 参考
      高级用法
      最佳实践
      自定义 Web Server
      专题详解
      模块联邦
      简介
      开始使用
      应用级别模块
      服务端渲染
      部署
      集成国际化能力
      常见问题
      依赖安装问题
      命令行问题
      构建相关问题
      热更新问题
      从 Modern.js 2.0 升级
      概述
      配置变更
      入口变更
      自定义 Web Server 变化
      Tailwind 插件变更
      其他重要变更
      📝 编辑此页面
      上一页构建产物目录下一页第三方平台

      #部署应用

      你可以将应用自行托管在包含 Node.js 环境的容器中,这为应用提供了部署的灵活性。

      #构建部署产物

      执行 modern deploy 命令将自动输出部署产物。此过程包括优化 Bundler 构建产物及产物依赖,检测当前部署平台,并自动生成可以在该平台运行的产物。 如果你希望在本地生成并测试特定部署平台的产物,可以通过设置环境变量来指定平台:

      MODERNJS_DEPLOY=netlify npx modern deploy

      #ModernJS 内置 Node.js 服务器

      #单仓库项目

      默认情况下,如果未检测到 Modern.js 支持的部署平台,Modern.js 将生成可以在 Node.js 环境下运行的部署产物。

      你可以使用以下命令构建项目:

      npx modern deploy

      当执行 modern deploy 命令时,Modern.js 将生成可执行的部署产物,并在控制台输出以下内容:

      Static directory: `.output/static`
      You can preview this build by `node .output/index`

      现在,你可以通过执行 node .output/index 命令来运行服务器。在 .output/static 目录中,存放了页面运行所需的静态资源,你可以选择将这些资源上传到 CDN 以提高访问速度。

      Info

      默认情况下,运行 Modern.js 服务器时会监听 8080 端口,如果你想修改监听的端口,可以指定 PORT 环境变量:

      PORT=3000 node .output/index

      #Monorepo

      对于 Monorepo 项目,除了需要构建当前的项目外,还需要构建当前项目依赖的仓库中其他子项目。

      假设当前项目的 package.json 中的 name 为 app,以 pnpm 作为 Monorepo 管理工具为例,你可以在项目 package.json 中添加以下命令用于构建:

      app/package.json
      {
        "scripts": {
          "build:packages": "pnpm --filter 'app^...' run build",
          "deploy": "pnpm run build:packages && modern deploy"
        }
      }

      如果你使用 rush 作为 Monorepo 管理工具,可以在 package.json 中添加以下命令:

      {
        "scripts": {
          "build:packages": "rush rebuild --to-except app",
          "deploy": "rushx build:packages && modern deploy"
        }
      }

      构建完成后,框架会将项目中所有的依赖生成在 .output/node_modules 目录下。你同样可以使用 node .output/index 运行 Modern.js 服务器。

      #自建 Node.js 服务器

      通常情况下,我们推荐使用 Modern.js 内置的 Node.js 服务器来部署应用,它支持托管纯前端项目或者全栈项目,并且保证在开发和生产环境下的表现一致。

      如果你的项目是纯前端项目,也可以通过自建 Node.js 服务器来部署应用,以下用一个 Koa 服务器的示例来演示如何托管一个纯前端项目的产物。

      例如你有一个 Node.js 服务器的仓库,你可以将项目的产物复制到该仓库下,现在结构如下:

      .
      ├── .output
      │   ├── html
      │   └── static
      └── server.js

      在 server.js 中,假定有如下代码:

      server.js
      import Koa from 'koa';
      
      const app = new Koa();
      app.use(async (ctx, next) => {
        ctx.body = 'Hello Modern.js';
      });
      app.listen(3000);

      现在,你可以新增部分代码,将静态资源和 HTML 文件的访问逻辑添加到 server.js 中。这里需要通过 mime-types 包来获取静态资源的 MIME 类型,因此我们先安装依赖:

      npm
      yarn
      pnpm
      bun
      deno
      npm add mime-types
      yarn add mime-types
      pnpm add mime-types
      bun add mime-types
      deno add npm:mime-types
      server.js
      const Koa = require('koa');
      const fs = require('fs');
      const path = require('path');
      const mime = require('mime-types');
      
      const app = new Koa();
      app.use(async (ctx, next) => {
        if (ctx.path.startsWith('/static')) {
          ctx.type = mime.lookup(ctx.path);
          ctx.body = fs.createReadStream(
            path.resolve(__dirname, `.output${ctx.path}`),
          );
        } else if (ctx.path === '/') {
          ctx.type = 'html';
          ctx.body = fs.createReadStream(
            path.resolve(__dirname, '.output/html/main/index.html'),
          );
        }
      });
      app.listen(3000);
      Note

      以上代码是最基础的例子,你的应用可能是多入口的,需要根据不同的路径访问不同的 HTML 文件,自建 Node.js 服务器也会存在更多的逻辑。

      需要注意的是,如果你的项目中使用 Modern.js 约定式路由,或是使用 React Router 自行搭建了浏览器端路由,你必须通过正确的 baseURL 来访问 HTML 文件。

      在 Modern.js 中,默认的 baseURL 是 '/',你可以通过在 modern.config.ts 中修改 server.baseUrl 来配置。

      Danger

      存在浏览器路由的项目,永远无法通过 /index.html 路径来访问到 HTML 文件。

      #Nginx

      Nginx 是一个高性能的 HTTP 和反向代理服务器,它可以处理静态文件、反向代理、负载均衡等功能。在 Nginx 上部署,通常需要配置 nginx.conf 文件。

      如果你的项目是纯前端项目,也可以通过 Nginx 来部署应用,以下提供一个 Nginx 配置的示例来演示如何托管一个纯前端项目的产物。

      nginx.conf
      # user [user] [group];
      worker_processes 1;
      
      events {
          worker_connections 1024;
      }
      
      http {
          include       mime.types;
          default_type  application/octet-stream;
      
          server {
              listen 8080;
              server_name localhost;
      
              location / {
                  # root [projectPath]/.output/html/main;
                  index index.html;
                  try_files $uri $uri/ =404;
              }
      
              location /static {
                # alias [projectPath]/.output/static;
              }
          }
      }

      在上述配置中,你需要将 [projectPath] 替换为你的项目路径,将 [user] 和 [group] 替换为你当前的用户和用户组。

      你可以将上述配置复制到 Nginx 安装目录的 nginx.conf 文件中,然后启动 Nginx 服务。你也可以通过 nginx -c 启动指定路径下的配置文件,此时你需要额外保证 include 指令配置的路径正确。