Vite 与 Rust 的 Monorepo 前后端联合开发

@2024年12月29日 1.0k字 §技术 #Rust #Vite #JavaScript
目录
  • 什么是 Monorepo
  • 模板构建步骤
  • 什么是 Monorepo

    Monorepo 从字面上来看就是 Mono(单)和 Repository(仓库),即在一个 Git 仓库中管理多个 Project 或者 Package。

    你最常见的 Monorepo 可能是 NPM 上的那些以 @xxxx/yyyy 为名字的库了,如 @types/xxxxx,它们都是用 Monorepo 来进行管理的。

    Monorepo 在开发前后端时也是一种不错的管理方式,特别是涉及到前后端分离开发,你可以直接在 Monorepo 中配置构建系统来分别将前端和后端编译后组合打包成服务端。

    模板构建步骤

    我们主要的目的是将 Vite 项目文件夹和 Rust 项目文件夹合并在一起作为 Monorepo 进行开发,大致可以经过以下几个步骤:

    1. 创建 Rust 项目

    我们 必须 先创建 Rust 项目文件夹,因为 Cargo 不允许在非空文件夹中创建 Rust 项目。

    cargo new example-monorepo --vcs none

    此处我们还使用 --vcs none 选项禁止 Cargo 创建 Git 仓库,因为我们需要在整个 Monorepo 模板建立完成之后再使用 Git 仓库来维护。

    此时我们的仓库结构如下:

    - example-monorepo
      +- Cargo.toml
      +- src
         +- main.rs

    2. 移动 Rust 源代码文件夹

    Cargo 默认情况下将 src 作为源代码文件夹,而 Vite 同样将 src 作为源代码文件夹,两者会造成冲突。

    由于我们此处希望使用 Rust 作为后端开发语言,所以我们希望将 Rust 的源代码文件夹重命名为 src-backend。我们需要修改 Cargo.toml 文件,在其中添加如下段:

    [[bin]]
    name = "example"
    path = "src-backend/main.rs"

    需要注意的是,这两个参数是 必须 的,name 指定了编译出来的二进制文件名,path 指定了 Rust 项目的根文件路径。

    在重命名 src 文件夹和修改 Cargo.toml 后,我们可以运行 cargo run 来检查修改是否生效,Cargo 应该不会报错。

    3. 融合建立 Vite 项目

    在配置好我们的 Rust 项目后,接下来我们运行如下命令来建立我们的 Vite 项目:

    pnpm create vite

    此处我使用的是 PNPM 作为 Node 包管理器,你可以寻找如上命令的其他替代。

    我们在当前文件夹中建立 Vite 项目,当然它会弹出警告:

    ? Current directory is not empty. Please choose how to proceed: › - Use arrow-keys. Return to submit.
    ❯   Cancel operation
        Remove existing files and continue
        Ignore files and continue

    因为当前文件夹中我们已经有配置好的 Rust 项目文件了,所以我们需要选择第 3 个选项来忽略这些存在的文件。接下来就跟正常的建立 Vite 项目一样了。

    这时,你的项目文件夹的大致结构应该是这样(我建立的是 Vue 模板):

    - example-monorepo
      +- Cargo.toml
      +- README.md
      +- index.html
      +- package.json
      +- tsconfig.json
      +- tsconfig.app.json
      +- tsconfig.node.json
      +- vite.config.ts
      +- public
      |  +- vite.svg
      +- src
      |  +- App.vue
      |  +- main.ts
      |  +- style.css
      |  +- vite-env.d.ts
      |  +- assets
      |  |  +- vue.svg
      |  +- components
      |     +- HelloWorld.vue
      +- src-backend
         +- main.rs

    到这一步其实就已经够了,在 src 中的就是 Vite 代码,当然如果你希望能够把它的名字改成 src-frontend 来与前端相对也可以,只需要修改:

    index.html

    把:

    <script type="module" src="/src/main.ts"></script>

    改成:

    <script type="module" src="/src-frontend/main.ts"></script>

    tsconfig.app.json

    把:

      "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"]

    改成:

      "include": ["src-frontend/**/*.ts", "src-frontend/**/*.tsx", "src-frontend/**/*.vue"]

    然后运行如下命令来检查 Vite 是否能正常编译(你得先安装完所有的依赖):

    pnpm build

    4. 建立 Git 仓库

    首先来编写我们需要的 .gitignore 文件:

    # Build outputs
    dist
    target
    
    # Node modules
    node_modules

    主要就是以上几个需要排除的文件夹,其他的你可以自己添加,之后直接初始化仓库并提交一个根即可:

    git init
    git add .
    git commit

    5. 完成

    你现在可以分别使用 cargopnpm 来在同一个文件夹中操作前后端项目的依赖和编译了,你还可以添加更多脚本,如自动打包前后端,Docker 镜像编译等。

    正在加载索引……