Серийное производство лонгридов
← В Песочницу Бонус · Шаблон лонгрида

Серийное производство лонгридов

Что на выходе: папка-шаблон. Каркас, стили и движок собираешь один раз и больше не трогаешь. Новый урок = новый content.js.

01 Идея: движок отдельно, контент отдельно

Три файла не зависят от урока: каркас index.html, стили styles.css и движок engine.js. Движок рисует те виды блоков, которые в нём прописаны: сколько опишешь, столько и будет. В шаблоне их пять: текст, картинка, карточка-перевёртыш, сворачиваемый блок, вопрос с вариантами. Понадобится ещё один вид, например таймлайн или галерея, дописываешь его в движок один раз, и дальше он доступен во всех уроках.

Сам урок лежит в отдельном файле content.js: заголовки, абзацы, вопросы, подписи к картинкам. Движок читает этот файл и рисует по нему страницу. Под новый урок меняешь content.js, остальные файлы остаются.

твой-лонгрид/ ├── index.html каркас — не трогаешь ├── styles.css стили блоков — не трогаешь ├── engine.js движок — не трогаешь ├── content.js ← только это меняешь под новый урок └── images/ картинки урока

Кто к кому обращается и что кому отдаёт

Вот вся цепочка:

index.html
подключает
styles.css · content.js · engine.js
content.js
отдаёт весь текст урока
engine.js
engine.js
рисует блоки, берёт оформление из стилей
styles.css → страница

02 Три файла, которые собираешь один раз

index.html — пустой каркас: один контейнер и подключение остальных файлов. styles.css — оформление блоков. engine.js — вся логика. Все три пишет ИИ по одному промпту.

Промпт — движок
Хочу собрать движок для интерактивных уроков: один раз сделать каркас, а дальше для каждого нового урока менять только текст. Сделай три файла — страницу урока, оформление и логику. Логика берёт весь текст урока из отдельного файла и сама рисует по нему страницу. Текст урока держи в этом отдельном файле, чтобы дальше менять только его. Для начала нужны такие блоки: — обычный текст с заголовками и абзацами; — картинка с подписью; — карточка, которая переворачивается по клику: спереди вопрос или термин, сзади ответ; — сворачиваемый блок: виден только заголовок, а по клику раскрывается текст; — вопрос с вариантами ответа: по клику показывает, верно или нет, и короткое пояснение. Сделай так, чтобы потом можно было добавлять свои виды блоков, и покажи в комментариях, куда именно их дописывать. Никаких сторонних библиотек, обычный сайт. Пиши понятные комментарии на русском.
Почему .js, а не .json. В этом шаблоне контент вынесен в файл content.js: он подключается как обычный скрипт, поэтому урок открывается двойным кликом по index.html. Держать контент в content.json тоже можно, но тогда страницу нужно открывать через локальный сервер: в VS Code это расширение Live Server, кнопка Go Live. Двойным кликом JSON-вариант не заработает — браузер не даст странице прочитать файл с диска.
Посмотреть index.html целиком — он весь вот такой
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Лонгрид</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<!-- здесь пусто: блоки урока сюда положит engine.js, когда страница откроется -->
<div id="root" class="wrap"></div>
<!-- порядок важен: сначала контент, потом движок -->
<script src="content.js"></script>
<script src="engine.js"></script>
</body>
</html>
Почему в index.html пусто. Заголовков и абзацев урока здесь нет и не будет. Текст лежит в content.js. Когда страница открывается, engine.js собирает из него блоки и кладёт их внутрь пустого <div id="root"></div>. Поэтому один и тот же index.html подходит любому уроку — менять в нём нечего.

03 Контент: весь урок в одном файле content.js

content.js — список блоков урока. Весь текст лежит в переменной window.LESSON: content.js её заполняет, engine.js читает и рисует по ней страницу. Вот вся схема файла, по ней и правишь:

window.LESSON = {
  title: "Название урока",
  blocks: [
    { type: "text",      html: "<h1>Заголовок</h1><p>Абзац текста</p>" },
    { type: "image",     src: "images/1.png", caption: "Подпись под картинкой" },
    { type: "flashcard", front: "Термин или вопрос", back: "Ответ или объяснение" },
    { type: "accordion", summary: "Заголовок", content: "Текст, раскрывается по клику" },
    { type: "quiz",      question: "Вопрос?", options: ["Вариант A", "Вариант B"], answer: 1, feedback: "Пояснение к ответу" }
  ]
};
Как читать схему. Каждая строка внутри blocks — один блок урока. type говорит движку, что нарисовать. Дальше в той же строке идёт содержимое блока: у каждой части своё название, и текст пишется сразу после него, в кавычках.
  • text — обычный текст: после html: пишешь заголовки <h1> и абзацы <p>
  • image — картинка: после src: путь к файлу, после caption: подпись
  • flashcard — карточка-перевёртыш: после front: лицо, после back: оборот
  • accordion — сворачиваемый блок: после summary: заголовок, после content: скрытый текст
  • quiz — вопрос: после question: вопрос, после options: варианты, после answer: номер правильного, после feedback: пояснение

Названия видов служебные, их не переводишь. Варианты в quiz считаются с нуля: answer: 0 — первый вариант, answer: 1 — второй. Список видов открытый: добавишь в движок свой type — сможешь ставить его и здесь.

Как эти блоки выглядят живьём

Карточка-перевёртыш — нажми, чтобы перевернутьлицо
На обороте — ответ или объяснение.оборот
Сворачиваемый блок — заголовок, раскрывается по клику
Здесь скрытый текст: длинное объяснение, пример, код — всё, что не нужно показывать сразу.
Вопрос с вариантами — по чему движок понимает, как рисовать блок?

Наполнить урок тоже можно через ИИ. Приложи к запросу файл-пример из шаблона (content.js) и свой текст:

Промпт — наполнить урок своим текстом
Вот пример файла с уроком из шаблона (прикладываю content.js) и текст моего урока: [вставь свой текст]. Перепиши этот файл под мой урок: структуру и оформление оставь такими же, просто подставь мой текст вместо примера. Разложи его по блокам: заголовки и абзацы — обычным текстом; где есть пара «термин → объяснение» — сделай карточку-перевёртыш; длинные пояснения спрячь в сворачиваемый блок; где уместно проверить себя — добавь вопрос с вариантами ответа. Ничего не придумывай, бери только мой текст.

04 Один движок — много уроков

Для следующего урока копируешь всю папку. В копии меняешь content.js и картинки. Каркас, стили и движок остаются как есть.

  • Собираешь один раз: index.html, styles.css, engine.js.
  • Меняешь каждый раз: content.js и картинки в images/.
  • Новый урок: замена контента → зип файлов внутри папки → загрузка в ЛМС.
Чтобы пакет заработал в ЛМС, к шаблону надо добавить ещё две вещи: отметку «пройдено» в конце урока (попроси ИИ дописать её в движок) и файл imsmanifest.xml в папку. Как это делается, разбирали в основном блоке уроков.
Готовый шаблон — скачать и адаптировать под себя

Собирать вручную не обязательно. Нажми на кнопку и скачаешь шаблон ZIP прямо в браузере. Внутри index.html, styles.css, engine.js, пример content.js, imsmanifest.xml, README и папка images/. Отметка «пройдено» в движке тоже уже стоит.

Дальше правишь под себя: меняешь оформление в styles.css, добавляешь свои виды блоков в engine.js — и получаешь свой шаблон, из которого лонгриды делаются серийно.

Файлы в архиве лежат в корне, поэтому ЛМС примет его без пересборки.

05 Как пользоваться скачанным шаблоном

Пять шагов от скачанного архива до урока в ЛМС.

  1. Распакуй ZIP.
  2. Открой content.js в текстовом редакторе, например в бесплатном VS Code.
  3. Замени пример своим текстом. В файле есть образец каждого блока. Пишешь по образцу, сохраняешь.
  4. Проверь. Открой index.html двойным кликом. Урок откроется в браузере в том же виде, в каком его увидит ученик. Пустая страница почти всегда означает ошибку в content.js: лишняя запятая, незакрытая скобка или «ёлочки» вместо прямых кавычек.
  5. Упакуй обратно. Выдели все файлы внутри папки (не саму папку!) → «Добавить в архив» → загрузи ZIP в ЛМС.
Что уже есть в шаблоне. Пять видов блоков: текст, картинка, карточка-перевёртыш, сворачиваемый блок, вопрос с вариантами. Для смены текста хватает content.js. Новый вид блока или другое оформление — это правка engine.js или styles.css: открываешь нужный файл, отдаёшь ИИ и просишь добавить.