Giter VIP home page Giter VIP logo

nth-start-project's Introduction

Стартовый проект с gulp Test Status devDependencies Status dependencies Status

Парадигма

  • Именование классов по БЭМ, разметка в pug, стилизация Sass. См. как работать с CSS-препроцессорами и БЭМ.
  • Каждый БЭМ-блок в своей папке внутри src/blocks/. Имена файлов в такой папке должны совпадать с именем блока. См. ниже про Блоки.
  • Есть файл конфигурации, определяющий попадание в сборку дополнительных файлов и неиспользованных в разметке блоков. Смотри config.js.
  • Можно использовать глобальные файлы:
    • src/js/script.js — общий js, берётся в сборку по умолчанию,
    • src/scss/print.scss — стили печати, не берутся в сборку по умолчанию (см. config.js).
  • Список pug-примесей src/pug/mixins.pug генерируется автоматически и содержит include существующих pug-файлов всех блоков.
  • Диспетчер подключения стилей src/scss/style.scss генерируется автоматически и содержит импорты стилевых файлов использованных в разметке блоков и импорты доп. файлов, указанных в config.js.
  • Входная точка обработки js (src/js/entry.js) генерируется автоматически и содержит require js-файлов использованных в разметке блоков и доп. файлов, указанных в config.js.
  • Используется кодгайд (относительно жёсткий), его проверка делается перед коммитом или вручную (npm run test), ошибки выводятся в терминал.
  • Есть механизм быстрого создания нового блока: node createBlock.js new-block (создаёт папки и scss-файл). После имени нового блока можно дописать нужные расширения.

Установка

Требуются установленный git и Node.js (LTS).

  1. Открыть терминал, попасть в папку проектов, клонировать этот репозиторий: git clone https://github.com/nicothin/NTH-start-project.git my-new-project (где my-new-project — папка для нового проекта).
  2. Перейти в папку нового проекта (в этом примере — cd my-new-project).
  3. Удалить историю разработки: rm -rf .git
  4. Установить зависимости проекта: npm i (может быть долго, особенно на Windows).

Команды

npm start          # запуск сервера разработки (сборка БЕЗ библиотеки блоков)
npm start deploy   # отправка содержимого папки сборки на gh-pages (нужен репозиторий на github.com)
npm run build      # сборка БЕЗ библиотеки блоков и без запуска сервера разработки
npm run wlib       # запуск сервера разработки (сборка проекта с библиотекой блоков)
npm run test       # проверка всех pug-, scss- и js-файлов на соответствие правилам (см. .pug-lintrc, .stylelintrc и eslintrc соответственно)
npm run test:pug   # проверить только pug-файлы
npm run test:style # проверить только scss-файлы
npm run test:js    # проверить только js-файлы

Структура

build/       # Папка сборки (результат работы над проектом)
src/         # Исходники
  blocks/    # Блоки (подпапки с блоками)
  favicon/   # Фавиконки (копирование прописать в config.js)
  fonts/     # Шрифты (копирование прописать в config.js, подключение в src/blocks/page/page.scss)
  img/       # Общие для всех блоков изображения (копирование прописать в config.js)
  js/        # Общие js-файлы, в т.ч. точка сборки для webpack и общие модули
  pages/     # Страницы проекта (при компиляции: src/pages/index.pug → build/index.html)
  pug/       # Служебные pug-файлы (шаблоны страниц, примеси)
  scss/      # Служебные стилевые файлы (диспетчер подключений, переменные, примеси)

Как это работает

При npm start запускается дефолтная задача gulp:

  1. Очищается папка сборки (build/).
  2. Записывается файл src/pug/mixins.pug с includ-ами pug-файлов всех блоков.
  3. Компилируются файлы страниц (из src/pages/**/*.pug в build/*.html).
  4. Из скомпилированных html-файлов извлекаются все классы уровня БЭМ-блока. На основании этого списка будут построены диспетчер подключения стилей и список всех js-файлов проекта.
  5. Генерируются спрайты (если блоки спрайтов используются), в папку сборки копируются картинки блоков и доп. файлы из секции addAssets файла config.js.
  6. Записывается диспетчер подключения стилей src/scss/style.scss, в котором:
    • Импорты файлов из секции addStyleBefore файла config.js. По умолчанию — SCSS-переменные и примеси.
    • Импорты файлов БЭМ-блоков, упомянутых в секции alwaysAddBlocks файла config.js. Таким образом, можно взять в сборку любой блок, даже если его css-класс не упоминается в разметке страниц.
    • Импорты файлов БЭМ-блоков, использующихся в разметке.
    • Импорты файлов из секции addStyleAfter файла config.js.
  7. Записывается входная точка обработки скриптов src/js/entry.js, в которой:
    • require файлов из секции addJsBefore файла config.js.
    • require файлов БЭМ-блоков, использующихся в разметке.
    • require файлов БЭМ-блоков, упомянутых в секции alwaysAddBlocks файла config.js.
    • require файлов из секции addJsAfter файла config.js.
  8. Компилируется диспетчер подключения стилей (src/scss/style.scss). Результат обрабатываются плагинами PostCSS.
  9. Обрабатывается входная точка Javascript (src/js/entry.js). Используется Webpack.
  10. Запускается локальный сервер и слежение за файлами для пересборки.

Блоки

Каждый блок лежит в src/blocks/ в своей папке.

Возможное содержимое блока:

demo-block/        # Папка блока.
  img/             # Изображения, используемые этим блоком (копируются в папку сборки).
  demo-block.pug   # Разметка (pug-примесь, отдающая разметку этого блока, описание API примеси).
  demo-block.scss  # Стилевой файл этого блока (без стилей других блоков).
  demo-block.js    # js-файл блока (без скриптов других блоков).
  readme.md        # Описание для документации, подсказки.

Особенный блок page

На теге <html> по умолчанию прописан класс page, что делает одноимённый блок «глобальным». В стилях этого блока прописываются:

  • подключение сторонних шрифтов,
  • смена боксовой модели,
  • cтили шаблона (см. src/pug/layout.pug),
  • стилизация тегов по умолчанию (аналог Normalize.CSS).

Удобное создание нового блока

# формат: node createBlock.js ИМЯБЛОКА [доп. расширения через пробел]
node createBlock.js demo-block        # создаст папку блока, demo-block.scss, подпапку img/ для этого блока
node createBlock.js demo-block pug js # создаст папку блока, demo-block.scss, demo-block.pug, demo-block.js, подпапку img/ для этого блока

Если блок уже существует, файлы не будут затёрты, но создадутся те файлы, которые ещё не существуют.

Сторонние npm-модули

Если нужно взять в сборку сторонний модуль, то после его установки (к примеру — npm i package-name) нужно:

  1. Прописать require в js-файле проектного блока (там же писать всё, что касается работы с этим модулем). Если сторонний модуль нужен без привязки к какому-либо проектому блоку, прописать require в src/js/script.js (см. пример в файле).
  2. Если нужно брать в сборку стилевые файлы модуля, прописать их в секции addStyleBefore файла config.js (пример в файле).
  3. Если нужно брать в сборку дополнительные файлы модуля, прописать их в addAssets файла config.js с указанием в какую папку их копировать (пример в файле).

Разметка

Используется pug.

Все страницы (см. src/pages/index.pug) являются расширениями шаблонов из src/pug (см. наследование шаблонов), в страницах описывается только содержимое «шапки», «подвала» и контентной области (см. блоки).

Каждый блок (в src/blocks/) может (не обязан) содержать одноимённый pug-файл с одноименной примесью, который при старте сервера разработки будет взят includ-ом в файл src/pug/mixins.pug.

Стили

Диспетчер подключений (src/scss/style.scss) формируется автоматически при старте сервера разработки.

Каждый блок (в src/blocks/) может содержать одноимённый scss-файл со стилями этого блока. Если блок используется в разметке (или упомянут в config.js#alwaysAddBlocks), его scss-файл будет взят в сборку стилей.

Используемый постпроцессинг:

  1. autoprefixer
  2. css-mqpacker
  3. postcss-import
  4. postcss-inline-svg

Стилевой код-гайд

Автопроверка с stylelint и плагинами. См. .stylelintrc.

  1. БЭМ-именование: __ — разделитель элемента, -- — разделитель модификатора.
  2. Один Блок = один стилевой файл.
  3. Очередность селекторов:
    • Инклуды примесей
    • Стилевые правила сущности
    • Медиаусловия
    • Псевдоселекторы и псевдоэлементы
    • Сторонние вложенные селекторы
    • Элементы блока
    • Модификаторы блока

Скрипты

Точка входа (src/js/entry.js) формируется автоматически при старте сервера разработки. Точка входа обрабатывается webpack-ом (с babel-loader).

Для глобальных действий предусмотрен src/js/script.js (см. config.js#addJsAfter и config.js#addJsBefore).

Каждый блок (в src/blocks/) может (не обязан) содержать одноимённый js-файл. Если блок используется в разметке (или упомянут в config.js#alwaysAddBlocks), его js-файл будет взят в сборку стилей.

Инлайн-скрипт

По умолчанию в шаблоне (src/pug/layout.pug) прописана вставка в <head> скрипта src/js/head-script.js, в котором для узла <html> указано:

  • Убрать класс no-js и добавить класс js.
  • Добавить класс с указанием названия браузера и ОС.
  • Добавить класс touch или no-touch, в зависимости от типа интерфейса.
  • Добавить кастомное свойство --vh со значением в 1% высоты вьюпорта (значение пересчитывается при изменении размеров).

Нравится проект?

Ставьте звезду репозиторию и/или угостите меня кофе, переведя сколь угодно символическую сумму.

nth-start-project's People

Contributors

adm1t avatar antig86 avatar dependabot[bot] avatar dojdev avatar inerv avatar nicothin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

nth-start-project's Issues

Время сборки стилей

Windows 10 64x.
node 9.5.0
npm 5.6.0

Сборка стилей идёт ~15-30с.
Если добавить ещё с десяток блоков = стилей, может затянуться на пару минут.

Это в чистом виде, т.е. скачиваю проект, делаю npm i и пробую.
После обновления packages тоже самое.

Пробовал ещё в Виндовом bash, тоже самое.
sdd\ hdd тоже ситуации не меняло.

Вопрос скорее к тем кто пользуется/ сталкивался)
Виндовая проблема или может дело в чём-то другом?

field-text block

<label class="field-text">
  <div class="field-text__name">Любое поле, выглядящее как текстовое</div>
  <div class="field-text__input-wrap">
    <input class="field-text__input" type="text" placeholder="input[type=text]">
    <div class="field-text__help-text">Обёртка — <code>label</code>. Можно сделать обёртку <code>div</code>, но тогда, возможно, захочется элемент <code>.field-text__name</code> делать <code>label</code> и связывать его с полем по <code>id</code> поля.</div>
  </div>
</label>

Ругается валидатор. Блочный элемент внутри строчного.

Разобраться с модальными окнами (паддинг на body)

Прототипом модальных окос служит 3й БС, там при открытии на body вешается инлайн стиль с внутр. отступом, идентичным ширине скролла.
Чтобы он был, нужны стили

.modal-scrollbar-measure {
  position: absolute;
  top: -9999px;
  width: 50px;
  height: 50px;
  overflow: scroll;
}

Did you forget to signal async completion?

[15:49:33] Размер style.min.css 395 kB
[15:49:33] Finished 'style' after 7.02 s
[15:49:33] The following tasks did not complete: build, <parallel>, style:single
[15:49:33] Did you forget to signal async completion?
npm ERR! code ELIFECYCLE

Windows 10.
Gulp 4.0,
node 9.5.0

Бывала ли такая ошибка?
Обрывается после сборки стилей я так понимаю.

Кеш npm чистил, сам gulp удалял/ устанавливал.

Обработка изображений

При попытке обработки изображений выдает ошибку:
folder=/src/blocks/logo/img npm start img:opt
"folder" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
Операционная система - Windows 10
Запускаю из корня проекта.
Что нужно покрутить?

Добавить валидацию форм

Вдохновлено: https://www.youtube.com/watch?v=9G8CSNgCxE8&index=9&list=WL

  • Добавить отображение ошибочного заполнения на основании:
input:invalid:not(:focus):not(:placeholder-shown) {...}
  • Убрать отдельные файлы со стилизацией ошибочного состояния.
  • Добавить в разметке образцы pattern

Увы, это без поддержки IE и Edge. Найти и внедрить нативный JS для проверки.

TODO: Баги, исправления, улучшения

  • В листинг кода текстовых полей вынести самый частый вариант для копипасты
  • Перенести примесь фокуса формы в файл миксинов формы
  • Убрать модификаторы размера
  • Выпадающие элементы: решить проблему клика в выпадающем блоке (происходит закрытие блока)
  • Перетащить стилизацию таблиц в БЭМ-блок таблиц (как можно сильне отвязаться от глобальных стилей)
  • Перетащить стилизацию элементов форм в соответствующие БЭМ-блоки (как можно сильне отвязаться от глобальных стилей)
  • Разнести стилизацию блоков и модификаторов в разные стилевые файлы.

Вложения в стилевых файлах

Добавить для всех имеющихся блоков и в файл создания блока:

.blockName {

  $block-name:                &;
  // #{$block-name}__element {} для вложений

}

Тестировать с gulp 4-й версии

Ранее был странный глюк на винде: по ходу работы прогрессивно увеличивалось время, затрачиваемое на компиляцию стилей. Если при старте была пара секунд, то минут через 10 работы становилось уже в районе 6 и далее время увеличивалось при несущественном усложнении кодовой базы.

Требования к системе

Пожелания и требования к системе для комфортной работы

БЭМ-блоки

  • Каждый блок в своей папке
  • Папка для картинок блока
  • Отдельные файлы (необязательные) для Элементов и Модификаторов
  • Файлы с описанием зависимостей блоков (?)
  • В сборку попадут только те Блоки, Элементы и Модификаторы, которые используются на странице (если Э и М прописаны в файле стилизации Б, то они попадут безусловно)

Разметка

  • обрабатывать html и bem-xjst
  • html обрабатывать file-include-ом

Стили

Прочее

  • SCSS и переменные блока в стилизационном файле блока c !default
  • Глобальные переменные
  • Отсутствие глобальных стилей (для общих стилей — блок page)
  • Легкое внедрение фреймворков
  • Легкое добавление сторонних JS- и CSS-файлов, шрифтов
  • Оптимизация картинок только вручную (сообщения в консоль при сборке)

Как можно скомпилировать для работы отдельно блоки ?

Николай, спасибо за отличный темплейт, всё доступно описано и удобно в использовании. Подскажите пожалуйста технически, как можно дополнительно организовать команду для сборки не привычным способом (img, js, css, страницы), а, скажем, чтобы скомпилировать перечень блоков в какую-нибудь отдельную папку buildBlocks (компонентно для программиста). Чтобы переносились блоки со всем содержимым, скомпилированным css и, возможно, подключенным js ? Наверное, всё можно сделать обычным способом, но может вы что-то подскажете

ES6 и ошибка сборки/ минификации JS

Может быть добавить что-то вроде:

.pipe(gulpIf(!isDev, uglify().on('error', function(e){console.log(e);})))

В сборку попал JS файл с ES6, и не понятно было поначалу из-за чего рушится сборка и минификация JS.

Как добавлять плагины jQuery

Здравствуйте!

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

Допустим нужно внедрить lightbox-плагин для картинок. В роли js-хука используется элемент “section__image-link”. У плагина помимо js-файла есть свои стили и иконки. Первое что приходит в голову при использовании файловой структуры БЭМ (насколько я ее пока понимаю) — сделать все ресурсы плагина частью блока и разместить их в его папке, при этом «грязно» смешав стили блока со стилями плагина.

Так делать можно или у Вас какой-то более удобный вариант? Читал по этой теме много материала, но не нашел хороших примеров...

Придумать какой-то механизм быстрого добавления JS-инструментов

Есть много хороших инструментов на чистом JS. Хочется иметь возможность быстро добавлять их в проект.

https://github.com/nosir/cleave.js — форматирование текста в инпуте
http://leaverou.github.io/stretchy/ — авторесайз полей ввода
https://github.com/jackmoore/autosize — авторесайз текстареи
https://github.com/bevacqua/dragula — драг-н-дроп
https://github.com/bevacqua/horsey — автокомплит
https://github.com/maxwellito/vivus — поочередная отрисовка SVG path
https://github.com/dimsemenov/photoswipe — фотовьювер
https://github.com/oncode/handorgel — аккордеон
https://github.com/Prinzhorn/skrollr — параллакс, реакция на скролл

подсветка синтаксиса
https://github.com/isagalaev/highlight.js
https://github.com/PrismJS/prism
https://github.com/syntaxhighlighter/syntaxhighlighter

Как правильно организовать сборку целой страницы?

Добрый день, Николай.
Недавно начал использовать Вашу прекрасную работу - NTH-start-project. В процессе работы возникли несколько вопросов по правильной организации кода, не могли бы Вы прояснить некоторые моменты?

Как организованы блоки с компонентами вопросов не вызывает. Но как дела обстоят с цельной страницей пока не понятно.

К примеру создан в корне src файл landing.html. Заинклудил хедер, футер, нужные компоненты. А вот что делать с секциями не понятно (к примеру about-us, tema и тд):

  • просто писать в landing.html разметку, вставляя где нужно инклудами компоненты можно. Тогда не ясно, где писать стили к этим секциями и добавлять графику + js.
  • либо делать под каждую секцию в blocks/about-us и там писать стили + img + js, но тогда blocks превратится в полную кашу.
  • либо в blocks создать папку landing и в нем уже делать разбиение на отдельные html составляющие + img + css + js. Но последующие страницы хоть и будут одной папке (blocks) но будут отсортированы по алфавиту, что тоже не предает структуры, плюс внутри landing будет очень много файлов, что тоже не круто.

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

Зависает экран при вызове модального окна

Здравствуйте Николай!
Спасибо большое за данный шаблон, во многом он мне облегчил мою работу.
Я нашел "баг", при вызове модального окна, экран зависает и пропадает вертикальный скролл. Подскажите пожалуйста, как можно исправить данный "баг"?

Динамический alert

Добрый день.
Как сделать, чтобы работала кнопка закрытия в alert, который формируется таким способом:
$("#msg").html('<div class="alert alert--danger"><button class="alert__close" aria-label="Close">×</button><p>сообщение</p></div>'); ?

Max width

Хорошо бы писать через min width
https://cl.ly/1r1H1r0R0b33
@media (max-width: ($menu-desktop-width - 1))

А еще можно использовать миксины
типа таких

@mixin for-phone-only {
    @media (max-width: $phone-to) {
        @content;
    }
}
@mixin for-phone-up {
    @media (min-width: $phone-from) {
        @content;
    }
}
@mixin for-tablet-portrait-up {
    @media (min-width: $tablet-portrait) {
        @content;
    }
}
@mixin for-tablet-landscape-up {
    @media (min-width: $tablet-landscape) {
        @content;
    }
}
@mixin for-desktop-up {
    @media (min-width: $desktop) {
        @content;
    }
}

Их вызов https://cl.ly/1P0E2Y361y0c. Улучшает восприятие кода.

Как подключить css-фреймворк (Bootstrap/Foundation)

А можно ли добавить целый фреймворк?)
Например, foundation, bootstrap тот же.

Интересно именно добавление scss.
Пробовал добавить
"../../node_modules/foundation-sites/scss/foundation.scss"
но безрезультатно, но и другие вариации пробовал.

Или не всё так просто?)

Т.е. чтобы именно все veriables (настройки) были от foundation.

Добавить Pug

  • Добавить компиляцию и слежение
  • Добавить шаблон и файл для импортов примесей
  • Добавить в парсинг блоков генератор для src/pug/mixins.pug
  • Добавить в генератор файлов блоков создание .pug файла
  • Добавить для всех блоков pug-примеси с подходящими API и собрать библиотеку компонентов с pug
  • Добавить на прекоммит-хук pug linter
  • Переписать README репозитория

Компиляция css в произвольном порядке.

Добрый день. Есть проблема, что файл стилей компилирует медиа запросы в разном порядке. Запрос на 768px может находится ниже чем запрос на 480px, приходится перебивать стили каскадом. Не подскажете как решить данную проблему.

01
02
03

Gulp version

Приветствую Николай.

Если мне память не изменяет, Ваш шаблон "вертелся" на 4 Gulp, из каких соображение откатились на 3.9.1

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.