Где-то подсмотрел, как программист делает резюме на на тех технологиях, по которым ищет работу. Идея показалась интересной - решил повторить. Собственно - вот: https://github.com/linklib/resume-v2 Озадачился вопросом поиска работы джуном по js. Для реализации резюме использую: React Typescript Next js Prisma SQLite Bootstrap React Можно было бы обойтись без next и prisma, но тогда совсем бы "бедно" вышло. Хорошо бы было и Graphql использовать, но я с ним ещё только в первом приближении разобрался, маловато будет. Остальное тоже не на высшем уровне, но и я вроде на джуна претендую, не выше. Описывать буду "крупными мазками", заостряя внимание на те моменты, которые вызвали заметные затыки в процессе. Если будут вопросы - пишите комменты. Итак, постановка задачи. Нужна страничка с текстовым описанием и перечень навыков с фозможностью фильтра по категориям. 1. Разворачиваем next.js с typescript. 2. Устанавливаем и инициируем prisma. Для БД выбрал SQLite: позволяет стянуть проект и запустить его без размышлений о подключении к любой другой системе. 3. Пишем схему и деплоим её в БД. 4. Посев данных: готовим файл с данными. Вот здесь сыграла злую шутку моя невнимательность. Проблема с shadows database решалась просто директивой в package.json 5. Получение данных. Призмой забираем данные из БД с использованием SSR Next js. Так как призма позволяет не только получить данные, но итфильтровать по нужному параметру, я ошибочно пошел по пути фильтрайии на этапе получения. Пока искал решение задачи - понял её абсурдность: зачем делать запросы с условиями, если все данные на руках и можно фильровать их на месте. В итоге получился фильтр на React Hook с фильтром на этапе вывода данных. 6. Оформляем, добавляем для сео NextSeo. Про картинки: в бд пишется путь к картинке. Сначала разместил картинки в папке images в корне, но отобразаться они категорически не хотели. Выяснилось, что единственное правилое для них место - папка public, дальше вложенность не имеет значения. Вопросы и предложения принимаются с благодарностью.
Дима, привет! Вижу, что уже знаешь больше и можешь что-то сделать. Это хорошо. Но есть моменты, конечно. >> Пока искал решение задачи - понял её абсурдность: зачем делать запросы с условиями, если все данные на руках и можно фильровать их на месте. 1. Представь себе вытянуть многие сотни тысяч записей на клиент сразу. 2. Фильтрацию и сортировку сразу по нескольким полям (особенно при выборке сразу из нескольких таблиц) ты замахаешься делать на клиенте. Доволно простые для SQL задачи окажутся практически невозможными в реализации. >> Выяснилось, что единственное правилое для них место - папка public, дальше вложенность не имеет значения. Все верно. По соображениям безопасности JS не отдает просто так любой файл как статику. Вдруг у тебя там когфиг с паролями? Поэтому в next-js настроена отдача статики из public. Но можно и свои кастомные папки сервить. К примеру, вот здесь у меня мидлвара ресайза картинок, а так же сервинг из папок shared/ и uploads/ https://github.com/prisma-cms/nextjs-nexus/blob/43e101b9804245bd551aefbf8e067cfd808c1d0d/server/index.ts#L26-L42
Николай, привет! >>> >> Пока искал решение задачи - понял её абсурдность: зачем делать запросы с условиями, если все данные на руках и можно фильровать их на месте. 1. Представь себе вытянуть многие сотни тысяч записей на клиент сразу. 2. Фильтрацию и сортировку сразу по нескольким полям (особенно при выборке сразу из нескольких таблиц) ты замахаешься делать на клиенте. Доволно простые для SQL задачи окажутся практически невозможными в реализации. --- Это понятно, но для конкретного проекта - подходящее решение. Вопрос: Я сначала хотел запихать условие в Через свойство where. И как динамически это сделать на одной странице не разобрался. Была идея сделать пять страниц со своими параметрами. Хотел вынести в компонент и пропсами пробрасывать состояние выбранной категории. Но не свел все вместе с getServerSideProps(). Можешь подсказать, как было бы сделать правильно?
Хотел вынести в компонент и пропсами пробрасывать состояние выбранной категории. Но не свел все вместе с getServerSideProps(). Так а ты документацию официальную читал? https://nextjs.org/docs/basic-features/data-fetching#getserversideprops-server-side-rendering getServerSideProps имеет аргумент - context. А из этого контексты ты можешь получить множество полезных данных, включая GET-параметры и т.п. Разве это тебе не помогает в твоем вопросе?
Николай, привет! Спасибо, проштудирую. Я сейчас Apollo Server настроил и через Apollo Client получаю данные (ветка plusapollo), как раз стоит вопрос о переписке фильтра. Осталось Nexus ввести и можно углубляться в детали каждой технологии.
Осталось Nexus ввести и можно углубляться в детали каждой технологии. Будь готов к тому, что вот в этот момент у тебя весь твой маленький мир и порушится :) Маленький мир здесь - это твой проект. Я пока не буду тебе детали раскрывать, сначала поломай голову сам. Интересно, во что именно ты упрешься.
Загадочно...)
Николай, вопрос: правильно понимаю, что обновить переменную, который пихаю getServerSideProps(), можно только перегрузим страницу, добавив переменную в урлу. И тогда уже через context её получить и использовать?
Все верно. На то эта функция и называется getServerSideProps(), что она срабатывает на стороне сервера. Но обрати внимание на то, что у меня везде используется другая функция: getInitialProps(). Я не буду сейчас утверждать о различиях наверняка (так как давно уже не делал подобный ресерч), но скорее всего разница в кешировании данных. То есть getInitialProps() не кешируется. То есть при каждом заходе на страницу, данные в ней запрашиваются. А вот getServerSideProps() может работать иначе (хотя это предположение и требуется перепроверить): как вариант, он может кешировать данные в билд, или не совсем динамически подгружать в режиме SPA. В общем, поизучай эти моменты более внимательно.
Спасибо! Изучаю.