Нужно ли использовать Nuxt Server в качестве посредника между моим внешним Django API и фронтендом Nuxt 3 в режиме SSR?

Я разрабатываю SaaS-приложение, использующее архитектуру бэкенда с Django REST API и базой данных PostgreSQL, а фронтенд использует Nuxt 3 с TypeScript, Tailwind и TanStack Query для управления API-запросами. Я включил Server-Side Rendering (SSR), установив ssr: true в файле nuxt.config.ts :

export default defineNuxtConfig({
    ssr: true,
})

В моей текущей архитектуре у меня есть каталог server/api/ внутри приложения Nuxt 3, содержащий несколько файлов, которые представляют конечные точки для взаимодействия с Django API. Например, у меня есть файл server/api/projects/index.ts, который указывает на конечную точку Django /api/projects/ для получения всех проектов.

Интеграция с новым сервером:

Структура каталога следующего сервера:

server/api/projects/index.ts : Указывает на конечную точку Django /api/projects/ для получения всех проектов. server/api/projects/[id].get.ts : Выбирает проект по его ID из /api/projects/detail/${projectId}/.

Логика взаимодействия с интерфейсом:

Эти конечные точки используются в обработчике сервиса (api/projects.api.ts), который предоставляет такие функции, как getAllProjects, getProjectById и deleteProjectById.

Составляющие (useProjects.ts):

Композитный useProjects.ts использует функции в api/projects.api.ts для управления данными проекта и взаимодействия с конечными точками Nuxt Server в server/api/projects/. Он использует useQuery из TanStack Query для эффективного управления состоянием.

Вопрос:

Нужно ли иметь промежуточный сервер Nuxt между фронтендом Nuxt 3 и внешним Django API? Дает ли это какие-то особые преимущества для Server-Side Rendering (SSR), или фронтенд Nuxt 3 может напрямую взаимодействовать с Django API, сохраняя при этом возможности SSR?

Спасибо за помощь!

Структура приложения :

frontend/
├─ api/                         # Functions to call the API server Nuxt 3 (server/api/)
│  └─ projects.api.ts
├─ app.vue
├─ assets/
│  └─ css/
│     └─ tailwind.css
├─ composables/                 # Composables to call functions in api/projects.api.ts
│  └─ useProjects.ts            # and share data between components
├─ nuxt.config.ts
├─ pages
│  ├─ ecowall/
│  │  ├─ conception
│  │  │  └─ [projectId]
│  │  │     └─ paroi
│  │  │        ├─ [paroiId].vue
│  │  │        └─ new-paroi.vue
│  │  ├─ index.vue
│  │  └─ projects
│  │     ├─ [projectId].vue
│  │     └─ index.vue           # I use my composables useProjects.ts here to get all projects
│  └─ index.vue
├─ plugins
│  └─ vue-query.ts
├─ server/                     # Intermediary server to call the Django API endpoints
│  ├─ api/
│  │  ├─ projects/
│  │  │  ├─ [id].delete.ts
│  │  │  ├─ [id].get.ts
│  │  │  ├─ create.post.ts
│  │  │  └─ index.ts
│  └─ tsconfig.json
└─ tsconfig.json

Я реализовал промежуточный сервер Nuxt, который будет служить мостом между фронтендом Nuxt 3 и внешним API Django. Я ожидал, что этот промежуточный слой повысит производительность, обеспечит безопасность и улучшит Server-Side Rendering (SSR). Однако я не уверен, что такой подход необходим.

Что я пробовал:

  • Я создал несколько конечных точек API в каталоге server/api моего приложения Nuxt 3, которые напрямую указывают на конечные точки API Django:

server/api/projects/index.ts указывает на /api/projects/. server/api/projects/[id].get.ts указывает на /api/projects/detail/${projectId}/.

  • Я создал обработчик службы (api/projects.api.ts), который предоставляет функции для взаимодействия с этими конечными точками сервера Nuxt.

  • Я использовал композитный (useProjects.ts) для управления данными проекта и взаимодействия с конечными точками сервера Nuxt через TanStack Query.

То, что я ожидал:

Повышение производительности за счет лучшего кэширования и преимуществ SSR. Повышенная безопасность, поскольку сервер Nuxt выступает в качестве посредника между фронтендом и Django API.

Что произошло на самом деле:

Эта настройка работает хорошо, но она добавляет сложности в архитектуру. Я не уверен, нужен ли этот промежуточный сервер Nuxt или фронтенд Nuxt 3 может напрямую взаимодействовать с внешним Django API, сохраняя при этом возможности SSR. Поэтому я хотел бы узнать, дает ли этот подход какие-либо преимущества для SSR или достаточно прямого соединения между фронтендом и Django API.

Вы могли бы получить некоторые преимущества в производительности, если бы получали данные на сервере и передавали их на сторону клиента, а не получали их там (устраняются накладные расходы на JSON), и еще несколько подобных вещей, так что это вроде как улучшит производительность.
Кроме того, если вы используете full-static mode в Nuxt (также доступный в Nuxt3), то вы можете пропустить любые внешние вызовы и установить его во время сборки.

Так что, в зависимости от того, что вы делаете в своем приложении, SSR вроде как помогает.
Может принести некоторую пользу или не принести вовсе.

Усилить безопасность? Совсем наоборот. Между процессом гидратации и тем фактом, что вы работаете с изоморфным приложением в Nuxt, это может привести к большему количеству утечек, чем если бы вы держали Django и Nuxt отдельно.

В целом, вы можете использовать каталог Nuxt server для нескольких конечных точек, если польза от этого очевидна, но в остальном, кроме сложности отладки, как вы правильно догадались, никакой реальной пользы нет.

Если вы выполняете тяжелый набор текста на стороне сервера Nuxt, возможно, вы увидите в этом смысл. Кроме того, вы можете получить более быстрый ответ, обратившись к конечной точке Nuxt, а не к своей, потому что вы пропустите реальное сетевое путешествие (просто сделайте это локально), но вам также нужно, чтобы данные были доступны в вашем приложении Nuxt, так что это тоже не так просто.


TLDR: держите их отдельно и используйте каталог Nuxt server в особых случаях с очевидными преимуществами.

Вернуться на верх