LINUX.ORG.RU

отговорите: (nodejs) vue.js + express + pg-promise + postgresql + docker

 ,


0

2

Хочу сделать небольшое и легконагруженное приложение - редактор словарей терминов. Есть список слов, можно искать слово. У слова есть карточка, которая своя для каждого пользователя, но можно смотреть чужие карточки. Карточка в формате markdown или что-то около того.

Клиента буду делать на vue.js, а сервер хочу на node.js . Да, меня уже отговаривали использовать node.js на стороне сервера. Но вдруг для такого простого проекта прокатит? В принципе, я готов всю тяжесть написать на pl/pgSQL, а на нодке - только тончайший интерфейс и собственно веб сервер. Соответственно, вопрос - как там с утечками памяти и прочими такими вот ужасами?

Т.е. вопрос состоит не в удобстве и не в производительности, а в качестве с т.з. надёжности.

Перемещено tailgunner из development

★★★★★

Последнее исправление: den73 (всего исправлений: 1)

Ответ на: комментарий от Int0l

В CL почему-то eval есть, и макросы тоже есть, и это - разные вещи, несводимые друг к другу. Обе нужны (если принять гипотезу, что CL нужен :) )

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от den73

Ну если тебе нужны макросы в JS, тебе не проблема их самому их написать, благодаря тому что есть eval и т.п. А вот в некоторых других языках с этим проблемы будут.

Int0l ★★
()
Ответ на: комментарий от deep-purple

Да ты мою ссылку видел сверху? Там и про eval и про Function. Хотя за твою ссылку спасибо. Тоже интересно почитать. )))

Int0l ★★
()
Ответ на: комментарий от Int0l

Да то же самое. Строка жи один хрен. Просто больше контроля.

deep-purple ★★★★★
()
Последнее исправление: deep-purple (всего исправлений: 1)
Ответ на: комментарий от deep-purple

Ну, я примерно так и понимаю на сегодня. Но загвоздка вот в чём. Вот есть у меня «список всех слов» и страница /FIXME про аббревиатуру «FIXME». Данные для неё берутся из БД. Я безусловно хочу, чтобы она была в поисковиках. При этом, содержимое страницы FIXME берётся из БД и может меняться часто.

Поэтому статическая генерация сайта (nuxt generate) не подходит. Вооружаемся vue ssr и читаем мануал.

Первое, что видим:

обратите внимание, что решения в этом руководстве не являются окончательными

Далее

Чаще всего нам требуется расположить шаблон в отдельном файле, например index.template.html:

Это уже третий язык шаблонов html в экосистеме vue: есть язык для компонентов, язык для app.html и теперь вот этот. Похоже, что авторы не осилили сделать достаточно универсальный язык шаблонов (мало примеров было перед глазами?) и пришлось делать три. Это я говорю про общий уровень инжиниринга. Три сорта говна, и пользователь будет кушать их все. Но ладно, я не про то, а всего лишь про то, что если react и ангуляр - это ужас, а vue - это облегчение, то даже страшно подумать, каковы тогда реакт и ангуляр. И соответственно, возникают закономерные сомнения в том, что нужно вообще касаться всего этого.

Самое главное - дальше.

ак как динамических обновлений нет, из всех хуков жизненного цикла будут вызваны только beforeCreate и created во время серверного рендеринга (SSR). Это означает, что код внутри любых других хуков жизненного цикла, таких как beforeMount или mounted, будет выполняться только на клиенте.

Стоит ещё отметить, что вам следует избегать кода, который производит глобальные побочные эффекты (side effects) в хуках beforeCreate и created, например устанавливая таймеры с помощью setInterval. В коде на стороне клиента мы можем установить таймер, а затем остановить его в beforeDestroy или destroyed. Но, поскольку хуки уничтожения не будут вызываться во время SSR, таймеры останутся навсегда. Чтобы избежать этого, переместите такой код в beforeMount или mounted.

Вот на этом я сломался и понял, что больше не могу. Т.е. я сидел-сидел, писал приложение, потом захотел подключить SSR и выяснилось, что всю логику придётся переделывать.

Собственно, поскольку я ещё не начал, я могу сразу начать делать код под SSR. За дни, прошедшие с этого открытия, я почти с этим смирился. Но ведь впереди ещё явно что-то подобное встретится.

den73 ★★★★★
() автор топика
Ответ на: комментарий от Int0l

Угу, но я стерплю пока без них. А так я выше уже приводил названия sweet.js и cheat-js.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Ага, встретиься ))

Для начала не сцы. Ты слишком заморачиваешься. Это похвально. Но, повторю, если ты ужЕ ищешь пути обхода возможностей, занчит инструмент тебе не подходит, либо, если ты принципиально желаешь его поюзать, то тебе придется «сморкаться» чтобы добыть клеющее вещество. Ничто не идеально, тем более сдлеанное фриками веба. По себе знаю ))

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

Ну нет, я не ищу пути обхода. Я пытаюсь понять, где я что-то упустил. Вроде как SSR - это то, что надо. Но в процитированном я вижу обман. SSR - это возврат к PHP, а вовсе не «рендеринг как на клиенте, но сделанный на сервере». Они просто облажались с подходом «всё на клиенте» и пытаются это скрыть. Если я напишу на этом свой словарь, моё положение будет шатким.

Но ясно, что AJAX нужен, и то, что сделано в vue, как идея, имеет смысл. Им нужно было только сразу различать события ЖЦ на «те, которые могут исполняться на сервере и на клиенте», «те, которые будут исполняться только на клиенте» и «те, которые можно вынести на этап сборки». Это разделение должно проходить красной нитью через всё. Вот, например, в Oracle есть несколько диалектов SQL. И там в доке для каждой команды указано, в каких диалектах она работает. Я думаю, что автор vue даже ещё не нащупал все грабли, которые тут есть, т.е. он просто даже пока не знает, как составить такое указание.

В общем, я теперь попробую ангуляр 2. Если и он не подойдёт, нужно будет отказаться от идеи искать работу во фронтенде. Заказы - может быть, найм - вряд ли.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Там же специально для SSR отключили ненужное. Ну и дураку понятно если ты при SSR запустишь левые скрипты с страницы(майнер например), у тебя SSR там начнет крипту майнить и повесит весь сервер. Или там начнет рекламу подгружать. У тебя так страница одна будет рендериться вечность. Зачем нужен такой SSR?

Int0l ★★
()
Последнее исправление: Int0l (всего исправлений: 2)
Ответ на: комментарий от Int0l

Они сделали это правильно, но очень невежливо.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Во первых, я тебя умоляю не пробовать ангуляр, он 146% хуже вуя и реакта.

Во вторых — я же написал как обойти основные проблемы. Ты действительно понял что я имел ввиду?

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

Ладно, побарахтаюсь ещё с вуем, в конце концов я уже в него неделю вложил, кажется, ещё дня 3 и получится. Первый раз прочитал то, что ты написал - вроде понял. Теперь второй раз прочитал и не понял.

den73 ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

Они, как обычно заведено, используя хистори апи браузера, будут аяксом или жсонпи или вебсокет делать запросы к апи, получать нужные данные и рендерить их без перезагрузки страницы.

Как это совместимо с «индексированием ботами»?

Именно в этом у меня и камень преткновения с vue: мне нужно куда-то запихнуть асинхронный запрос к БД. Я не вижу куда, кроме как в роутер (для express я это могу сделать с помощью node-async-router).

Т.е. сначала читаем данные асинхронно, а потом полученными данными забиваем конструктор. Т.е. кишки из vue сразу же вывалились. Наверное, я что-то не так понимаю...

Кстати, зря я наклепал: в доке указано про каждый хук жизненного цикла, вызывается ли он при SSR.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Как это совместимо с «индексированием ботами»?

Никак. Именно поэтому тебе и надо реалтзовать дублирование шаблонов. Но я показал как сделать это малой кровью. Хотя и это спорный вопрос. Но! Я такое делал лично и это было проще чем...

не вижу куда, кроме как в роутер

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

сначала читаем данные асинхронно

Таки нет.Сначала синхронно, как будто это обычное старинное веб (и это легко видят кравлеры). А уже потом, после инита скрипов в браузере, отправляешь аяксы на другие (жсон) роуты (экшны контроллеров), которые ответят жсоном и вуй отрисует нужный кусок страницы, или на один запрос, если ты думаешь за оптимизацию, прилетит сразу всё, и вуй отрисует все нужные куски страницы.

deep-purple ★★★★★
()
Ответ на: комментарий от anonymous

А ты погоди, и до кода на китайском дойдёт. Может быть, уже дошло, но у этого кода пока нет шансов быть увиденным нами. А потом внезапно окажется, что всё китайское лучше англоязычного и тебе придётся учить китайский. Если нация претендует на лидерство, то она продвигает свой язык. А если нация или её конкретные представители - ЧМО, то они кончают от возможности использовать иностранный.

У англосаксов есть одна системная проблема. Они изобретают всякое говно и активно навязывают его всему миру. И сами страдают, естественно. Эта модель поведения далеко не единственная. Например, можно быть культурным и не изобретать говно. Если китайцы системно будут делать не говно, они победят. Например, у них уже давно есть какая-то своя ОС, про которую я слышал пару раз.

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от deep-purple

Не путай роутер бекенда (а я рассказывал только о нем) и роутер фронта.

Для такого чайника как я, следовало бы различать :) Я только смутно догадываюсь о существовании роутера на фронте. Где выполняются функции роутера при режиме SSR, генерации статики и настоящем SPA - то мне неведемо.

Сначала синхронно, как будто это обычное старинное веб (и это легко видят кравлеры).

Хм. Об этом я не подумал. Но не факт, что это можно запихнуть в вуй - мы не имеем контроля над тем, синхронно или асинхронно он выполняет свой прикладной код. Думаю, что асинхронно. Чтобы гарантировать синхронность, нам нужно строить рядом с вуем какое-то отдельное строение из костылей.

Я так понял, выход состоит в умении вуя рендерить асинхронные компоненты на сервере в режиме SSR. Это появилось не сразу, но теперь это есть. Без этого SSR не имеет большого смысла - нода ведь не может на сервере синхронно лазить в БД - весь сервер будет тормозить, или зависнет, если зависнет бекенд.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

А, кстати, я начинаю догадываться, что router-link в vue использует клиентский роутер, а простой href отправляет запрос на сервер и загружает страницу заново. Хотя может существовать препроцессор, к-рый распознаёт href и превращает его в router-link.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

У меня не было проблем с SSR, данные c помощью axios загружал в скрипте на странице. https://ru.nuxtjs.org/guide/plugins/

<template>
  <h1>{{ title }}</h1>
</template>

<script>
import axios from 'axios'

export default {
  async data ({ params }) {
    let { data } = await axios.get(`https://my-api/posts/${params.id}`)
    return { title: data.title }
  }
}
</script>
Вот типа такого.

Int0l ★★
()
Последнее исправление: Int0l (всего исправлений: 1)
Ответ на: комментарий от den73

Они просто облажались с подходом «всё на клиенте» и пытаются это скрыть.

Не, почему обложались? Это ты просто не хочешь в дивный новый мир тооолстых клиентов. Выбери уже наконец сторону силы, на двух табуретках тут не усидишь. Сколько уже раз тебе написали: жс это клиент-сайд! Вакансии, которые смотришь, там вообще что-то про сервер и БД есть?

anonymous
()
Ответ на: комментарий от den73

Теперь второй раз прочитал и не понял.

Готовишь html на сервере любым PHP, скриптоту и стили инлайнишь прямо в страницу. И потом клиент сам решит нужны ли ему перделки (нажимая на кнопочки) или может посмотрит и тут же закроет (обычный юзкейс). А бэкенду пофиг что отдавать: целую страницу, фрагмент, данные. HTTP-запросы все для него одинаковые, нужно только клиенту обозначить что он хочет.

anonymous
()
Ответ на: комментарий от den73

чувак я делаю все по руководству и у меня все работает. Асинхронные компоненты нужны для редких случаев, зачем мне это?

Int0l ★★
()
Последнее исправление: Int0l (всего исправлений: 2)
Ответ на: комментарий от den73

13 вакансий, из них, правда, как минимум 10 не относятся к бекенду на ноде.

Заметил волшебное слово PHP повсюду? Закащчики не такие уж дуракихипсторы.

anonymous
()
Ответ на: комментарий от anonymous

Такие же «дураки». Только хайп вокруг vue изначально начался у PHP шников(я так думаю).

Int0l ★★
()
Ответ на: комментарий от den73

Я тебе советую фулстек, но с упором на бэкенд, особенно БД, и немножко могу мол в жаваскрипт. Поверь, школьников с вуями наперевес овердохрена, а вот опытных шарящих в РСУБД чуваков не так и много на рынке. Но, придется учить PHP, других вариантов нет.

anonymous
()
Ответ на: комментарий от den73

Если китайцы системно будут делать не говно, они победят.

Жесть какая. Больших говноедов в мире еще поискать. Молитесь лучше, чтобы они или другие азиаты не победили.

anonymous
()
Ответ на: комментарий от den73

Кстати, немаловажный для тебя факт: php-сообщество наверно самое russian-friendly. Документации, статей, форумов по-русски завались. Вот гуголь по запросу laravel дает первой ссылкой «Laravel по-русски». Все как ты любишь. А жс - это сообщество американских наркоманов на 86%. Вот и думай.

anonymous
()
Ответ на: комментарий от Int0l

Это я про то что зачем майнер совать в синхронщину и вообще прикручивать его куда-то в «стандартные» места крепежа.

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

%>зачем майнер совать Да тут срыв покровов в прямом эфире. Вот зачем весь этот жс-хайп оказывается, ггг.

anonymous
()
Ответ на: комментарий от Int0l

А где в рук-ве написанно, что в дате можно async и что при SSR оно будет рендериться на сервере? Это я не в порядке спора, а просто ввиду невежества.

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от Shadow

Но та статья выгдядела здраво. Особенно в сравнении с JavaScript.

Охренеть. В своё время nginx был запилен дабы стать простой и быстрой reverse proxy, ибо апач жрал ресурсы немерянно. А теперь его реально начинают превращать превратили в сервер приложений. Спасибо за информацию - я не знал, что можно SQL запросы прямо в nginx.conf прописывать. Скоро к нам придет новая волна уязвимостей с SQL-инъекциями.

Qasta
()
Ответ на: комментарий от Int0l

А, зашёл по твоей ссылке и увидел, где этот пример. Но всё же мне пока неясно, почему это должно работать, в т.ч. рендериться на сервере при SSR.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Нашёл про асинхронные данные здесь - это работает только в nuxt.

https://ru.nuxtjs.org/guide/async-data/

Насчёт SSR я вижу лишь такую надпись:

Метод data вызывается каждый раз перед загрузкой компонента (только для компонентов страниц). Он может быть вызван на стороне сервера или перед переходом к соответствующему маршруту.

Вроде должно иметься в виду SSR, но, поскольку nuxt генерирует и статические сайты, мне непонятно.

den73 ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Мне кажется, вуй более технологически продвинут - он умеет это организовывать сам. С одним недостатком: для этого нужен вуй :)

den73 ★★★★★
() автор топика
Ответ на: комментарий от Int0l

Это вообще-то не работает, т.к. неправильная документация. См.

https://github.com/nuxt/nuxt.js/issues/690

У меня заработало по рецепту из этого issue. Ну или может у меня руки слишком кривые, но никаких ошибок, кроме ругани в консоли, не выдавалось. Код был получен копипастом из документации :)

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

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

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Я и забыл у меня тоже там чет сразу не завелось. И я думал может у меня че-та нетак транслируется в js. И зделал через калбеки. А там видимо чет не дописали в руководстве.

Int0l ★★
()
Ответ на: комментарий от den73

Я использую Next.js (насколько я понимаю, Nuxt создан по его образу и подобию заменой React на Vue). Там SSR и code splitting работают «из коробки». Для того, чтобы подружить Redux и code-splitting и загружать только store reducers, используемые на странице, я сделал свою небольшую библиотеку: https://github.com/dogada/fast-redux

dogada
()
Ответ на: комментарий от Int0l

Вопрос к тебе, как к знатоку. Что ты используешь для авторизации? Есть auth-module из nuxt-community, но я туда смотрю и вижу такой список зависимостей:

    "babel-plugin-transform-class-properties": "^6.24.1",
    "babel-plugin-transform-decorators-legacy": "^1.3.4",
    "body-parser": "^1.18.2",
    "bootstrap-vue": "^2.0.0-rc.1",
    "codecov": "latest",
    "cookie-parser": "^1.4.3",
    "eslint": "^4.18.1",
    "eslint-config-standard": "^11.0.0",
    "eslint-plugin-import": "^2.9.0",
    "eslint-plugin-jest": "^21.12.2",
    "eslint-plugin-node": "^6.0.0",
    "eslint-plugin-promise": "latest",
    "eslint-plugin-standard": "latest",
    "eslint-plugin-vue": "latest",
    "express": "latest",
    "express-jwt": "^5.3.0",
    "jest": "^22.4.2",
    "jsdom": "latest",
    "nuxt": "latest",
    "nuxt-class-component": "^1.2.0",
    "puppeteer": "^1.0.0",
    "standard-version": "latest"

Доверия не вызывает - слишком уж много всего.

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.