Vue Amsterdam Conference 2022 — Часть IX — Полная разработка стека с Nuxt 3 и Nitro

Vue Amsterdam Conference 2022 — Часть IX — Полная разработка стека с Nuxt 3 и Nitro

10 февраля 2023 г.

Добро пожаловать! Прошло много времени с момента моей последней статьи, но я рад вернуться с девятой частью моей серии о конференции Vuejs Amsterdam 2022. В этой части мы погрузимся в захватывающий мир разработки полного стека с использованием Nuxt 3 и Нитро.

Вы также можете посмотреть выступление на канале JSWorld на YouTube. .

Введение

<цитата>

Я помню, когда в прошлый раз [два года назад] я выступал здесь, у нас была действительно большая мечта о Nuxt, о расширении от приложения SSR до чего-то, что мы можем использовать везде и за его пределами — Пуйя Парса, руководитель отдела инфраструктуры Nuxt.js

Чтобы это произошло, Nuxt.js пришлось все переписать, на что ушло более 2 лет. Но прежде чем говорить о Nuxt 3, Пуя рассказывает о Nuxt 2, его сильных и слабых сторонах, а также о причине начала проекта под названием Nitro, который является частью Nuxt 3.

Промежуточное ПО для сервера Nuxt 2

Nuxt 2 — это фреймворк, в основном ориентированный на рендеринг на стороне сервера из-за его преимуществ. Теперь, когда у нас уже есть сервер, почему бы не воспользоваться этой возможностью, чтобы расширить его и добавить наши API? Вот как мы это делаем в Nuxt 2 с помощью Server Middleware:

// server-middleware/test.ts
export default function (req, res) {
    res.end(JSON.stringify({ hello: 'world' }))
}

Чтобы зарегистрировать это промежуточное ПО:

// nuxt.config
export default {
    serverMiddleware: {
        '/api/test': './server-middleware/test'
    }
}

Теперь, если мы вызовем http://localhost:3000/api/test, мы получим ответ:

{
    "hello": "world"
}

Как видите, это простое промежуточное ПО node.js, поддерживающее машинописный текст и имеющее базовую систему маршрутизатора с использованием префиксов. Но у него есть некоторые ограничения. Например, отсутствие поддержки динамического пути в маршруте, отсутствие поддержки псевдонимов и преобразований, файлы не связаны и загружаются во время выполнения, и нам нужно развернуть весь исходный код в рабочей среде, чтобы заставить его работать.

HMR ПО промежуточного слоя сервера в Nuxt 2

Nuxt 2 использует более старую версию express.js, называемую connect, которая легче. Кроме того, у него есть изоляция для SSR, поэтому каждый код, который вы пишете, например плагины и компоненты, объединяется через webpack или vite и загружается в эту изолированную среду с поддержкой HMR.

Он поддерживает TypeScript с unjs/jiti и быстро аннулирует кеш, но сервер и node_modules не были изолированы, и пришлось развернуть всю папку node_modules. Время выполнения также различалось между производством и разработкой.

Nuxt 2 с Express

Мы могли бы использовать nuxt 2 не только как автономную платформу, но и как промежуточное ПО для существующего приложения. Это дает нам большую гибкость, но имеет свои недостатки.

  • Для развертывания в рабочей среде требуется полностью node_modules, что ограничивает нас в некоторых средах, таких как бессерверные, или делает невозможным в некоторых других средах, таких как рендеринг краев, которые являются рабочими. Поскольку мы не можем развернуть приложение узла с помощью node_modules до края.
  • У него плохой опыт разработки без HMR сервера, и вам приходится перезагружать сервер каждый раз, когда вы что-то меняете в коде.
  • У него непредсказуемое поведение, потому что он был разработан для использования особым образом.

Вызовы API в Nuxt 2

Когда вы пытаетесь получить что-то со стороны сервера в приложении nuxt 2, происходят странные вещи.

В этом примере мы загружаем страницу продукта в интернет-магазине. Чтобы на стороне сервера отобразить эту конечную точку, мы должны получить данные продукта из того же API, который находится на том же сервере. Возможно, единственным преимуществом является то, что у нас есть общий сервер и нет необходимости настраивать другой сервер для API.

Но минусов больше:

* Базовый URL должен быть настроен вручную, и это кошмар. * API SSR вызывает двусторонние вызовы в реальных приложениях, что приводит к огромной задержке, что делает приложения nuxt 2 медленнее, чем ожидалось. * Нет встроенного HTTP-клиента.

Статическая генерация в nuxt 2

Nuxt 2 позволяет создавать статические приложения, не зависящие от файлов сервера, поэтому их можно развертывать где угодно.

Когда вы запускаете команду nuxt generate для создания статического приложения, nuxt будет:

* Создайте и свяжите все приложение. * Загрузите пакет с помощью программного API для эмуляции сервера. * Используя этот сервер и внутренний API, nuxt пытается отобразить каждую страницу и записать их в файловую систему. * dist/ готов к использованию!

Он прост и быстр в реализации, имеет полную статическую поддержку, а также есть функция кэша общей генерации между страницами. Но есть и некоторые проблемы с этим.

* Вы можете выбрать целевой сервер или статический. Есть много случаев, когда вы можете выбирать между одним из них, но есть некоторые варианты использования, которые должны иметь лучшее из обоих миров. * Генерация по запросу невозможна, и мы должны предварительно генерировать все страницы каждый раз при развертывании. * Метод прямого рендеринга, используемый в nuxt 2, также усложняет внутренний код, что усложняет некоторые улучшения.

Развертывание сервера Nuxt 2

Развертывание приложения nuxt 2 SSR в рабочей среде кажется простым, но неэффективным.

* Все репо должно быть развернуто. * Поддерживается только хостинг Node.js. * Дополнительные неиспользуемые модули node_modules.

Нитро

Во время внутреннего собрания команды, посвященного облачным факелам, в то время, когда команда активно работала над nuxt 2, Пуя понял, что nuxt ограничен в некоторых важных аспектах.

Проект Nitro начинался как эксперимент поверх nuxt 2 благодаря модульности и возможностям, которые он предоставляет. Им удалось разработать концепцию развертывания приложений nuxt 2 на периферии и снять большинство этих ограничений.

Цель Nitro, по словам Пуйи, — развернуть любой сервер JavaScript в любом месте, включая Edge, и он даже утверждает, что мы даже можем запустить пакет, такой как express, в сервис-воркере браузера с помощью nitro.

Серверные маршруты в Nuxt 3

Чтобы создать маршрут сервера в Nuxt 3:

// server/api/hello.ts
export default () => ({ nuxt: "is easy!" })

// http://localhost:3000/api/hello
{
    "nuxt": "is easy!"
}

Кроме того, он имеет первоклассную интеграцию с исполняемым приложением и работает сразу после установки:

// app.vue
<template>
    <div> {{ data }} </div>
<template>

<script setup>
    const { data } = await useFetch('/api/hello')
</script>

Некоторые из преимуществ:

  • Минималистский API с использованием unjs/h3, созданного ими самими, который является одной из самых быстрых библиотек.
  • Создано с использованием TypeScript
  • Быстрый маршрутизатор с использованием unjs/radix3
  • Встроенный HTTP-клиент (fetch и $fetch)
  • Он не зависит от платформы, то есть вы можете написать код и ожидать, что он будет работать на любой платформе.
  • Множество новых встроенных помощников

Вызовы API в Nuxt 3

В отличие от Nuxt 2, где нам приходилось делать круговой обход, здесь у нас есть прямые вызовы API с нулевой задержкой, baseURL обрабатывается автоматически, а выборка улучшена с помощью unjs/ohmyfetch.

Сервер HMR в Nuxt 3

В Nuxt 3 Server Entry также интегрирован в тот же пакет, что и в nuxt 2. Кроме того, весь сервер изолирован, и в HMR он намного быстрее. Новая проблема заключается в том, что изоляция во время выполнения более сложна.

Подключаемое хранилище KV

Nitro поставляется с подключаемым хранилищем ключей и значений, которое работает на основе unjs/unstorage, созданного командой nuxt.

Решение unstorage представляет собой унифицированный и мощный интерфейс "ключ-значение" (KV), который позволяет комбинировать встроенные или подключаемые драйверы. реализуется с помощью сверхпростого интерфейса и добавления обычных функций, таких как монтирование, просмотр и работа с метаданными.

Он работает во всех средах (браузер, NodeJS и Workers) и предлагает несколько встроенных драйверов (память, FS, LocalStorage, HTTP, Redis).

Здесь вы можете увидеть фрагмент примера простого приложения для создания заметок:

// server/api/notes/index.post.ts
export default defineEventHandler (async (event) => {
    const id = (await useStorage().getKeys( 'data: notes')) . Iength + 1
    const body = await useBody(event)
    const note = { ...body, id }
    await storage.setItem(`data:notes:${id}`, note)
    return { id }
])

// server/api/notes/[id].ts
export default defineEventHandler (async (event) = {
    const { id ] = event. context. params
    const note = await useStorage().getItem(`data:notes:$(id)`)
    if (!note) {
        throw createError ({
            statusCode: 404,
            statusMessage: "Note not found!"
        })
    return note
})

Развертывание сервера Nuxt 3

Развертывание в Nuxt 3 проще. Вы запустите nuxt build, и результатом будет переносимый каталог .output с необходимыми общедоступными файлами и обновленной версией node_modules.

Статическая генерация в Nuxt 3

Вот шаги от запуска команды до получения результата:

В отличие от nuxt 2, здесь у нас есть гибридное решение, объединяющее лучшее из обоих миров (серверное и статическое), а также теперь возможна генерация по запросу.


Конец девятой беседы

Надеюсь, вам понравилась эта часть и что она была так же ценна для вас, как и для меня.

В течение следующих нескольких дней я поделюсь с вами остальными докладами. Оставайтесь с нами…

:::информация Также опубликовано здесь.

:::


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE