Vikhrmodels/habr_qa_sbs huggingface dataset:
Вопрос: Как загрузить данные до отрисовки в React?

Лучший ответ:
`componentDidMount ` срабатывает после `render`, вы можете показать прелоадер пока данные грузятся, после загрузки покажете данныеclass example extends React.Component {
  state = {
    data: [],
    isLoading: true,
  }

  componentDidMount() {
    fetch('example/url')
      .then(response => response.json())
      .then(data => this.setState({ data }))
  }

  render() {
    const { isLoading } = this.state

    if (isLoading) {
      return <div>Загрузка</div>
    }

    return data.map(item => <div key={item.id}>{item.name}</div>)
  }
}

Худший ответ:
Очевидно, что если данных нет - отображать нечего. Так что придется или придумать чем занять страницу до того как они подгрузятся -  как вариант, добавить вэйтер. Или -  использовать server-side рендеринг. componentWillMount тут не поможет - потому что запрос к API в любом случае занимает какое-то время.
Вопрос: Можно ли на горячую изменять правила в NAT?

Лучший ответ:
Создайте свое правило ниже существующих, и отключайте по одному вышестоящие правила. Сразу проверяйте работоспособность той сети, правило для которой отключили.Не хотелось бы чтобы это отразилось на сотрудниках 
Если ошибетесь в правиле, все равно отразится.

Худший ответ:
В целом да. Если нигде не накосячите, никто не заметит.
Вопрос: Разработка приложений под Android без Android Studio?

Лучший ответ:
Как писать на андроид в notepad?

Худший ответ:
Да, можно писать и из eclipse. Раньше Google официально поддерживала плагин на eclipse, около лет пяти - четырех - трех назад точно. Но потом перестали. 
https://marketplace.eclipse.org/content/android-de...
По идее нужен еще плагин на Gradle, не знаю, включен ли он по умолчанию в сборку Eclipse for Java. На поддержку kotlin, по идее, тоже надо будет плагин ставить. Если kotlin нужен. 
Лично я перешел на android studio, она поудобнее на мой взгляд по подсказкам при наборе кода, не надо заморачиваться с установкой кучи плагинов и модулей. 
Еще в NetBeans был неплохой плагин на Android.
Но мой совет, пользуйтесь Android Studio. И проще (не надо возиться с кучей плагинов) и у Jet Brains хорошие IDE.
А по поводу Unresolved Reference - косяк в xml. Поставьте Gradle свежее, там ошибки в новых версиях более информативные.
Вопрос: Golang как сделать проект вне GOPATH?

Лучший ответ:
У вас неверное представление о модулях в Go.
Они как раз про гибкое управление зависимостями. Позволяют, например, использовать несколько версий (возможно несовместимых между собой) одного и того же модуля в рамках проекта. Ну и плюс не нужно ставить ничего дополнительного вроде glide/dep etc. - go build сам подтянет все необходимое.

Худший ответ:
Благодарю всех за ответы. Реально по модулям понял. Также скачал проект из библиотеки проектов что на сайте языка который был организован как модуль и он у меня нормально скачал зависимости и собрался вне гопаса.
Вопрос: Что такое Mock API Endpoint?

Лучший ответ:
Понимайте это как заглушку к реальному API, который гипотетически будет реализован в скором времени.
Mock API возвращает "фейковые" данные, нужные для того чтобы пока пилят бекэнд,
фронтэндеры могли писать клиентскую часть приложения.вот пример подобного сервиса
https://github.com/julien-lafont/Mocky

Худший ответ:
Очень удобные и функциональный сервис www.mockapi.ioScreenShot
Еще из толковых https://mockoon.com, можно работать полностью локально
Вопрос: Адаптивное меню?

Лучший ответ:
Вот готовое решение

Худший ответ:
Вот готовое решение
Вопрос: Как сделать такие косые линии?

Лучший ответ:
Также легко можно сделать с помощью псевдоэлементов https://codepen.io/chefranov/pen/VxGOgM

Худший ответ:
здратсвуй. решение с применением пару строк css
https://codepen.io/ljutaev/pen/jxQEga
Вопрос: Калькулятор скидки на js, как его заставить работать?

Лучший ответ:
year у вас и элемент и значение, вы умножаете на элемент, поэтому каменный цветок и застрял.

Худший ответ:
Вам это нужно?$(document).on('click', '.radio', function() {
	var itog = $('#itog'),
      mult = $('#mult'),
      $this = $(this),
      multiplier = $('#company').find(':selected').val() * $this.data('year');
      
  mult.val(multiplier);
  itog.val(multiplier * (1 - $this.data('mult')));
});<form id="year">
    <input class="radio" type="radio" id="radio-1" name="group" data-year="1" data-mult="0"/>
    <input class="radio" type="radio" id="radio-2" name="group" data-year="2" data-mult="0.15"/>
    <input class="radio" type="radio" id="radio-3" name="group" data-year="3" data-mult="0.2"/>

				<div class="company">
					<select name="company" id="company">
						<option value="1500">1</option>
						<option value="5300">до 5</option>
						<option value="10100">до 10</option>
						<option value="12000">до 25</option>
						<option value="17000">до 50</option>
						<option value="0">50+</option>
					</select>
</div><br>
<input type="label" id="mult" name="789" maxlength="300" readonly><br>
<input type="label" id="itog" name="789" maxlength="300" readonly>
</form>
Вопрос: Как получить выборку Mysql если в поле есть нужный ID?

Лучший ответ:
лучше не использовать для этого мускуль.
а если уж решили использовать его, то стоит изучить его возможности работать с json.

Худший ответ:
Не "сериализовать", а нормализовать

Сделать отдельную таблицу, в которой будет две колонки, id из исходной строки и id книги. 

Дальше делаем совершенно тупой запрос

SELECT a.* FROM actions a, actions_books ab WHERE a.id= ab.aid and ab.book_id=?

Это решит не только текущую проблему но и множество проблем в будущем. В частности с производительностью.
Вопрос: Как сделать такое на css?

Лучший ответ:
Если точек одинаковое количество для каждого пункта меню, можно вынести их в псевдоэлемент ::before или ::after:

<ul>
  <li><span class="number">1</span>Товар</li>
  <li><span class="number">2</span>Товар</li>
  <li><span class="number">3</span>Товар</li>
</ul>
.number::after {
  content: "........................";
}

Если количество точек зависит от количества символов в наименовании товара, то можно реализовать точки через border-bottom:

<ul class="menu">
  <li>1<span class="dots"></span>Товар</li>
  <li>2<span class="dots"></span>Товар</li>
  <li>3<span class="dots"></span>Товар</li>
</ul>
.menu > li {
  display: flex;
}

.dots {
  flex-grow: 1;
  border-bottom: 2px dotted black;
}

Худший ответ:
Приветствую!
Воспользуйтесь маркированным списком ul > li в котором кастомизируйте дефолтные маркеры (circle) - на свои, через псевдоэлемент ::before или фантомный span, к примеру.
Вопрос: Постепенно падает трафик с Google. Почему?

Лучший ответ:
ищи клонов - зеркальщиков

Худший ответ:
Ну самое тупое посмотрели что творится в вебмастере и выдаче по вашим запросам? Или вы ждёте пока вам тут нагадают на кофейной гуще?
Вопрос: Какая разница между интерфейсами IEnumerable и IEnumerator?

Лучший ответ:
Та сущность, по которой пробегают, должна реализовывать IEnumerable.
Та сущность, которая пробегает, должна реализовывать IEnumerator (обычно это вложенный, нередко приватно объявленный класс).
То что вы сказали я к сожалению не понял.

Худший ответ:
Enumerable - перечислимое, Enumerator - перечислитель (с англ.), когда вы спите, овцы это IEnumerable, а вы который их считает - IEnumerator.
Вопрос: Сколько проектов достаточно для портфолио?

Лучший ответ:
47 проектов это просто цифра, мы не знает что там и как.
Если вам все ваши работы очень нравятся по качеству, то скорее всего вы делайте что-то не так )
т.к. с каждой новой работой узнаешь что-то новое, находишь другой подход и тп, и уже понимаешь как можно переделать свои прошлые работы.

В какой сфере ваше портфолио ?

Худший ответ:
конечно много, надо 42. Пять штук уберите.
Вопрос: Как на php повторять одно и тоже действие?

Лучший ответ:
Обычно это делают через cron

Худший ответ:
Есть замечательная либа ReactPHP, с помощью который ваш сервис может выполнять что-либо по таймеру. И как доказывает Ratchet, проблем с утечкой памяти нет, если сами их не создадите.
Вопрос: Как подтвердить участие в проекте?

Лучший ответ:
Оставить контакты руководителя.
Иметь правки в репозитории, сделанные с вашего аккаунта.
Быть в списке разработчиков ПО, которое обычно не скрывается.
Просто быть в курсе того, что это за ПО и как оно работает, балаболы раскусываются на раз незнанием самых простых, но особых для конкретного проекта вещей.

Худший ответ:
Вам  либо верят на слово либо нет. Впрочем достаточно написать сферу деятельности и специфику проекта. Обычно  NDA не запрещает разглашать детали проекта после его запуска. Но уточните у бывших работодателей, вдруг это не так.
Вопрос: Как заменить некоторые значения массива?

Лучший ответ:
Timebird 
такое не подойдет?for i, e in enumerate(a2):
    if isinstance(e, int):
        a1[i] = e
(я код не запускал если чо)

Худший ответ:
в чем моя ошибка?1. Усталость, скорее всего. Именно этим объясняю использование вами оператора сравнения ==, вместо оператора присваивания.2. Но и в этом случае:
а) Цикл. Python не даст изменить один из элементов кортежа.
б) Генератор списка. Python в принципе не позволит использовать операцию присваивания.
Вопрос: Flex по вертикали — Проценты и пиксели. Как выровнять?

Лучший ответ:
Есть flex:1, есть calc 
https://jsfiddle.net/j4wpxLgp/

Худший ответ:
<div class="flex row">
	<span class="t2 flex column">
		<em class="t1"></em>
		<em class="t2"></em>
	</span>
</div>.flex {
	display:flex;
}
.row {
	flex-direction:row;
}
.column {
	flex-direction:column;
}
.t1 {
	flex:1 1 100%;
}
.t2 {
	flex:1 1 200px;
}
div {
	width:100%;
	height:100vh;
	background:blue;
}
.flex.column {
	background:red;
}
.column .t1 {
	background:green;
}
Как то так
Вопрос: Как реализовать месячную подписку?

Лучший ответ:
Оплатил: к текущей дате прибавили 29 (28+сегодня, т.е. полных - всегда 28 даём) и установили timestamp.
При действиях пользователя - проверяем: текущая дата меньше или равна timestamp, если "ДА" - то привилегия работает, "НЕТ" - период привилегии закончился и ставим флаг "EXPIRED" в БД.
PS: А почему месячная подписка - это 28 дней, а не больше?

Худший ответ:
Делаем таблицу подписок, в ней дата начала, дата окончания, пользователь.
Никаких расписаний не надо. Тем более можно напороться на случай, когда вы будете менять привелегии у пользователя с подписан на не подписан по расписанию, и в этот момент пользователь будет продлевать подписку. Проверку что пользователь подписан нужно делать каждый раз при запросе привилегий пользователя, путём запроса к таблице описанной выше. Условие = пользователь, плюс текущее время находится между двумя датами. Если запись найдена - есть привилегии.
Вопрос: Загрузка файлов на сайт, если интернет прерывается и продолжать загрузку при восстановлении интернета?

Лучший ответ:
Ну так идите на фриланс-биржу, там сделают.
Тут обычно помогают с трудностями при реализации, а не пишут бесплатно с нуля.

Худший ответ:
наиболее популярное решение
www.resumablejs.com
https://www.npmjs.com/package/react-resumable-js
Вопрос: Какой размер виртуального жесткого диска необходим для установки Linux в VirtualBox?

Лучший ответ:
Linux устанавливать на VirtualBoxСделайте динамический диск. Его физический размер увеличивается по требованию. Логический — 128 ГБ или больше если будете ставить много программ.

Худший ответ:
Сейчас по-моему у всех такие винты, что лишние плюс минус 100G вообще рояля не играют. Поставьте диск, который занимает только реально занятое место, а размер ему хоть какой можно прописать.
Вопрос: Apache очень долго грузит страницы, как исправить?

Лучший ответ:
Надеваю фуражку КО
1 Найти причину.
2 Исправить ее.
Теперь по сути. Такое поведение может быть вызвано разными проблемами, нехватка ресурсов на впс, тормоза mysql, неправильная настройка apache+php, и много чего еще. Каждую версию надо проверять. Предоставленной вами информации хватает только на догадки.

Худший ответ:
А почему сразу apache, что на других серверах, например nginx было не так? То есть я о том, как формулируется вопрос? И ты предполагаешь сразу что виноват апач? Тогда поставь nginx + php-fpm А так проблема может быть в чем угодно. Вот так на вскидку и не скажешь...
Вопрос: Пользуетесь ли вы шпаргалками?

Лучший ответ:
Не отвечу за опытных программистов, т.к к ним не отношусь, но сильно сомневаюсь, что среди них есть хоть один, полностью знающий стандартную библиотеку своего языка, не говоря о сторонних.

Худший ответ:
дофига фулстек кодеров, которые делают все, от настроки nginx, бакэнда и до сборки js билда. 
я например, не юзаю гугл, кода пишу на php, да и IDE же юзаю.. а вот css, html(да, да, не ржите), js фреймворки, сборщики, бабели, препроцессоры, иногда смотрю бестпрактики по sql, redis
..а что в этом такого?
Вопрос: Можно ли ставить сессию при запросе AJAX?

Лучший ответ:
С точки зрения сервера никакой разницы между вбиванием адреса руками пользователя в строку браузера и ajax-запросом нет.

Худший ответ:
можно
Вопрос: Как реализовать ожидание ответа пользователя python?

Лучший ответ:
Вот тут разбирался похожий вопрос:
Telegram Bot Api, как вести сессию с пользователем? Как писать многопользовательских ботов?
Вот тут можно посмотреть реализацию на python
https://habr.com/ru/post/316666/

Худший ответ:
Нужно реализовать состояния для пользователей.
Примерно так:
пользователь запросил вики. обработали, сделали пометку в структуре данных на пользователя, что он желает странного.
пользователь написал что-то. Проверяем пометки на странности, находим пометку о вики. Выполняем команду с учетом этого.
Придумываем сброс состояния, например только один запрос, потом снова нужно запрашивать вики, ну или по ключевому слову какому -> сбрасываем флаг на странности
Вопрос: Сайт без перезагрузки?

Лучший ответ:
Почитайте про Single-page application (Одностраничное приложение)

Худший ответ:
Использовать фреймворки и либы типа: react, vue.js
ну или pure js с запросами к серверу
Вопрос: Как сделать вот такие скругления?

Лучший ответ:
В иллюстраторе можно применить эффект wrap inflate к прямоугольнику со скругленными углами. В фотошоп перенести из иллюстратора простым ctrl+c ctrl+v.

snippet

Худший ответ:
border radius: 15процентов;
overflow: hidden;
Вопрос: Смесь страниц html и php на одном сайте — это нормально?

Лучший ответ:
нормально.
сайт может быть полностью статическим - это ок. но, например, обратную связь на html уже не сделать (варианты есть, но часто проще сделать на том же php).

Худший ответ:
Нормально.
Единственное - это сложность поддержки всех статических страниц при изменении какого-то одного блока в боковых панелях (редактирование меню и т.д.). Если Вы каждый раз собираете всё компилятором статического сайта - то проблема отпадает.
Для сборки страницы "налету" из HTML-блоков (при загрузке в браузер) есть includeHTML (поддерживается рекурсивная подгрузка). Т.е., каждый блок в разметке можно хранить в своём отдельном файле и легко менять его код при необходимости лишь в одном месте. А собирать в страницу - уже через основную сетку: через тэги <include>, например.
Вопрос: Как с помощью php вывести из массива данные в таблицу?

Лучший ответ:
$data = [
    ["яблоко", "1-01-2019", "1"],
    ["апельсин", "2-01-2019", "2"],
    ["мандарин", "2-01-2019", "3"]
];

function buildTable($data) {
    $html = "<table>";
    
    /* Build header */
    $html .=    "<tr>
                    <td>Название</td>";
    foreach ($data as $element) {
        list($fruit, $date, $number) = $element;
        $html .=    "<td>{$date}</td>";
    }
    $html .=    "</tr>";
    
    /* Build body */
    foreach ($data as $element) {
        list($fruit, $date, $number) = $element;
        $html .= "<tr>";
        $html .=    "<td>{$fruit}</td>";
        foreach ($data as $index=>$el) {
           $html .= "<td>";
           $html .= ($index+1) == $number ? $number : null;
           $html .= "</td>";
        }
        $html .= "</tr>";
    }
    
    $html .= "</table>";
    return $html;
}

Худший ответ:
foreach по массиву
вывести td с элементом 1
foreach по массиву
вывести td с элементом 0
вывести N пустых td с помощью str_repeat()
вывести td с элементом 2
вывести N пустых td с помощью str_repeat()
Вопрос: Какие профессии есть в it?

Лучший ответ:
DevOps, DataScentist, QA, программист, бизнес писатель, бизнес аналитик, менеджер, тимлид, HR, преподаватель (ака евангелист). 
Какие языки и какие навыки требуются набирайте на HH, а языки в общем то вторичны. Выучите если нужен будет под конкретную задачу

Худший ответ:
Хедхантер умеешь открывать?
Вопрос: Попробовала нарисовать макет под Bootstrap, верстальщик говорит что не подойдет. Скажите в чем проблема?

Лучший ответ:
Верстальщик не прав. 
С 12-ю колонками удобнее работать, но это не критично.
А чем он аргументирует?

Худший ответ:
Сверстать-то - возможно.
Вопрос: Можно ли установить Хакинтош со 2 раздела жёсткого диска?

Лучший ответ:
что бы определиться с тем что стоит ли покупать макбук,
В корне неверный посыл. Прелесть Макпука в самом Макпуке, MacOS без макпучного железа, без огромного макпучного тачпада и Retina-дисплея совсем не то.
По теме: нет, нельзя.

Худший ответ:
Рональд Макдональд  Народ требует подробностей.  ПС мне он допустим не впился, кроме сборки приложений для мобильных, однако стоит виртуалка с vmware esxi и на ней крутится хакинтош и дистриб линукса для машинного обучения. 
На сайте хакинтошников говорят обратное. 
https://www.tonymacx86.com/threads/guide-how-to-ke...
Вопрос: Что за обозначения у R? Зачем резисторы на выход соединителя?

Лучший ответ:
1. Это резисторная сборка. Пачка резисторов 10 килоом в одном корпусе.
2. Резисторы выбираются исходя из расчета. Обычно для ТТЛ схем берут подтягивающие резисторы 10к, для КМОП - 100к. Мощность резистора выбирают опять же исходя из расчета - берут 2х - 3х кратный запас мощности, которая будет на этом резисторе выделяться. P=U^2/R
3. Нужно смотреть всю схему, а не огрызок.

Худший ответ:
Это резисторы так называемой гальванической развязки. Применяются для снижения влияния выходных цепей друг на друга.
Вопрос: Имеет ли право такой код на жизнь?

Лучший ответ:
если живёт и делает что нужно - однозначно имеет. 
если нет: на нет и суда нет.

Худший ответ:
Много бреда написано. Например проверка на корректность телефона, явно не все случаи проверены и плюс пересечение условия 1 и 3. Замените на функцию
def IsCorrect(number):
    if number.isdigit() and (len(number) >= 9 and len(number) <= 12):
        if number[:2] != '00' and number[0] == '0':
            rNumber = '421' + number[1:]
        elif number[0] == '9':
            rNumber = '0' + number
        else:
            rNumber = number[2:]
        return rNumber
    else:
        return False
зачем делать так 
massage_string = True
          while massage_string is True
если можно просто While True, а потом уж где надо break для выхода.
Вопрос: Как получать актуальные данные с сервера в одном компоненте, если они меняются в другом?

Лучший ответ:
Да, vuex будет вполне уместен, для вас он будет источником истины, откуда все компоненты будут забирать данные. Сделайте два vuex модуля - cities и stations - в них реализуйте соответствующие crud операции. Компоненты будут из них забирать/передавать необходимые данные.

Худший ответ:
Перейти на сокеты? Сделать плагин для Vuex. Можно и без сокетов, если у вас есть есть другой механизм подписки на изменения. На сокетах+Vuex это выглядит примерно так:socket.on("update_something", data => store.commit("something/update", data));
Вопрос: Оцените сборку ПК. Для игр, чтения и жизни?

Лучший ответ:
Лучше поищите видеокарту с 3мя вентиляторами. Турбина очень шумная.

Худший ответ:
Странно, что видюха - Nvidia, а проц - AMD.
Я бы взял проц Intel (меньше тепловыделения, меньше оборотов кулера - меньше шума, дольше служба).
Вопрос: Кинула веб-студия, агентский договор?

Лучший ответ:

Что можно сделать в такой ситуации?
Принять во внимание, не допускать подобное в дальнейшем. Выпить пивка, пожарить мяса, посмотреть на закат, поднять руку вверх, махнуть и сказать "да ну и ... с ним".

Худший ответ:
Можно еще братков нанять :/
Вопрос: Как в реальном времени валидировать вводимые данные в чекбокс и сравнивать с реальными?

Лучший ответ:
frontend<div>
    <label for="nickname">Ник:</label>
    <input type="text" placeholder="Введите ник..." id="nickname" name="nickname">
    <div id="msg"></div>
</div>
<script type=""text/JavaScript">
    var nickname = document.querySelector('#nickname');
    var msg = document.querySelector('#msg');

    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
      if (this.readyState == 4 && this.status == 200) {
        var result = JSON.parse(this.responseText);
        //status == false  ник занят
        //status == true   ник свободен
        if(result['status'] === false){
          msg.innerHTML = '&#10060; Этот ник занят!';
        } else {
          msg.innerHTML = '&#9989; Ник свободен';
        }
      }
    };

    nickname.addEventListener("blur", function(){
        msg.innerHTML = '';
        let data = new FormData();
        data.append('nick', nickname.value);
        xhttp.open("POST", "ajax.php", true);
        xhttp.send(data);
    });
</script>backend<?php
    // Получаем $_POST['nick']
    // СОздаем запрос в бд типа 
    // SELECT id FROM users WHERE nick LIKE 's'
    // читаем про подготовленные запросы
    // Далее если id есть status = false иначе true
    //status == false  ник занят
    //status == true   ник свободен
    // заворачиваем в JSON
    

    // ТЕСТ без бд
    
    //массив занятых ников
    $nicks = ['admin', 'moderator', 'pushkin', 'tester', 'susanin', 'lev_tolstoi', 'administrator'];
    
    //если $_POST['nick'] есть в массиве занятых, то статус false, если нет, то true
    if (in_array(strtolower($_POST['nick']), $nicks)){
        $status = false;
    } else {
        $status = true;
    }
    //заворачиваем в JSON и выводим
    echo json_encode(['status' => $status]);

Худший ответ:
Используй AJAX. На поле Input вешай, к примеру, обработчик blur, который будет срабатывать каждый раз когда input теряет фокус и отправляй запрос к базе на проверку.
Вопрос: Откуда продавцы на plati.ru берут ключи для steam игр?

Лучший ответ:
1) Краденные кредитки
2) Акции от продавцов
3) Баги в клиенте 
4) Вывод денег от продажи всяких карточек / шмота.

Худший ответ:
Игры в виде гифтов (steam gift) получают через автоматизированный фарм карточек (см. ArchiSteamFarm и т.д.) или предметов и последующую их продажу на торговой площадке Valve. Чтобы вывести деньги с продажи карточек/предметов используют покупку игры и перепродажу её в виде гифта.
Вопрос: Так умеют ли поисковики индексировать SPA?

Лучший ответ:
А что такое "SPA"? Разве это набор стандартов? Что бы говорить о том, что есть общие проблемы? Вариантов реализации куча, в каждой будут свои проблемы.На своем vuejs сайте я сделал генерацию мета тегов на php (добавил в index.html скрипт, который генерирует мета информацию (title, description, og: и тп), чтобы ссылки можно было постить в соц сетях и на других сайтах.
Это зачем нам знать? Как это к индексации относится?Все ли будет работать в моем случае?
Вы о чем? Все это что? Холодильник и акваланг будут работать.Умеют ли боты индексировать такие сайты?
Какие такие? Механизм загрузки контента Вы не описали. Есть ли смена url? Вы привели кучу не нужной информации, а по делу 0. Что мешает просто проверить? Если сайт уже есть. Что Вас останавливает?Если отключить генерацию title и description, сможет ли поисковый бот корректно их получать, если они меняются из js?
Тут вообще или Вы не все написали или слабо понимаете, как оно у Вас там все работает. ХЗ. Что значит "отключить генерацию title и description". Плохо ли если в странице не будет "title и description"? Плохо. Но сразу же пишите, что они меняются из js. Так меняются или нет?
Мне кажется, что основная ошибка в том, что многие считают SPA чем-то современным, что заменит традиционный подход. Нет. Есть проекты, которые есть смысл делать в виде SPA и им обычно не важно как они будут индексироваться и ранжироваться в поисковиках. Есть сайты, которые имеют часть функционала в виде spa, так другая история. И есть сайты, где spa не нужно вовсе. И самое главное SPA и сайт с асинхронной загрузкой или динамический сайт не одно и то же.

Худший ответ:
Смотрите реализацию у крупных проектов на SPA. Поправьте если ошибаюсь, meduza.io, это SPA?
Вопрос: Как достать файл из сайта?

Лучший ответ:
если получится - обязательно сообщите нам!

Худший ответ:
Никак