Как я ускоряю работу

Николай Громов

Как я ускоряю свою работу

Сеанс автоматической магии, делающей работу более быстрой, приятной и слегка опасной.
Николай Громов. Внутренняя Монголия. Вечность, лето.

Задачи

О какой работе речь?

Вёрстка и модификация страниц.

Результат: HTML, CSS, JS, изображения, шрифты.

Как вообще ускорить работу?

Стартовый репозиторий NTH-start-project

      NTH-start-project/
        build/ # результат сборки (редактировать файлы бессмысленно)
        src/   # исходные файлы
    

Стартовый репозиторий NTH-start-project

      src/
        blocks/  # БЭМ блоки (каждый блок в своей подпапке)
        favicon/ # иконки сайта (на вкладке браузера, для мобильных...)
        fonts/   # шрифты
        img/     # общие картинки (не завязанные на к-л БЭМ-блок)
        js/      # общий javascript, не завязанный на к-л БЭМ-блок
        pages/   # все страницы сайта
        pug/     # доп. pug-файлы: раскладки, диспетчер примесей
        scss/    # доп. стилевые файлы: переменные, диспетчер подключений
    

Мой стек

Git — система контроля версий

БЭМ

БЭМ как универсальная методология

Разделение интерфейса на блоки, блоков на элементы.

      <header class="page-header">
        <div class="page-header__inner">
          <a href="/" class="logo">
            <svg class="logo__img">...</svg>
          </a>
        </div>
      </header>
       
      <div class="promo">
        <div class="promo__inner  slider">
          <section class="slider__item">...</section>
          <section class="slider__item">...</section>
          <section class="slider__item">...</section>
        </div>
      </div>
    
      <div class="catalog">
        <div class="catalog__item">...<div>
        <div class="catalog__item">
          <article class="card">
            <a class="card__wrap" href="...">
              <img class="card__img" src="..." alt="Путеводитель по лжи">
              <h2 class="card__title">Путеводитель по лжи</h2>
            </a>
            <p class="card__descr">Критическое мышление в эпоху постправды.</p>
            <p class="card__price">630 ₽</p>
          </article>
        </div>
        <div class="catalog__item">...<div>
        ...
      </div>
    

Ближе к делу

Рутина

  1. Добавил БЭМ-блок в разметку — нужно добавить его стили, JS.

Как я работаю

  1. Перехожу в директорию проекта: cd /d/projects/SomeName.
  2. Стартую сервер разработки: npm start (алиас s).
  3. Редактирую файлы, вижу изменения в браузере.

Пока сервер работает, проект можно просматривать с любого устройства в рамках локальной сети.

Как это работает: npm start

  1. Очищается папка build/

Один конфиг, чтобы править всеми

      let config = {
        'notGetBlocks': [],    // Список файлов разметки, из которых не собирать блоки
        'ignoredBlocks': [],   // Список Блоков, которые никогда не брать в сборку
        'alwaysAddBlocks': [], // Список блоков, которые всегда брать в сборку
        'addStyleBefore': [],  // Доп. стилевые файлы (брать в сборку до файлов блоков)
        'addStyleAfter': [],   // Доп. стилевые файлы (брать в сборку после файлов блоков)
        'addJsBefore': [],     // Доп. js-файлы (брать в сборку до файлов блоков)
        'addJsAfter': [],      // Доп. js-файлы (брать в сборку до файлов блоков)
        'addAssets': {},       // Любые файлы и куда их копировать
        'dir': {},             // Имена папок
      };
    

Один конфиг, чтобы править всеми

      let config = {
        ...
        'addStyleBefore': [
          'src/scss/variables.scss',
          'src/scss/mixins.scss',
          'somePackage/somePackage.css', // для 'node_modules/somePackage/somePackage.css'
        ],
        ...
      };
    

Блоки

Все технологии блока — в папке блока

      src/
        blocks/
          btn/            # Папка блока
            btn.pug
            btn.scss
            readme.md
          burger/         # Папка блока
            burger.js
            burger.pug
            burger.scss
            readme.md
          ...
    

Создавать это вручную? Нет

        node createBlock.js new-block          # создать папки, .scss, .md
        node createBlock.js new-block pug      # тоже, но ещё .pug
        node createBlock.js new-block pug js   # тоже, но ещё .pug и .js
      

Разметка

Pug для разметки

      // Файл src/blocks/card/card.pug
      
      article.card
        a.card__wrap(href='...')
          img.card__img(src='...', alt='...')
          h2.card__title Название книги
        p.card__descr Описание книги
        p.card__price 630 ₽
    

См. реальный пример

      article.card(class=allMods)&attributes(attributes)
        != newLabel
        if (data.url !== 'undefined' && data.url)
          .card__inner
            a.card__img-wrap(href=data.url)
              img.card__img(src=data.img, alt=data.name)
            h3.card__title
              a(href=data.url)!= data.name
            if (data.descr !== 'undefined' && data.descr)
              p.card__descr!= data.descr
            p.card__price!= price
        else
          .card__inner
            span.card__img-wrap
              img.card__img(src=data.img, alt=data.name)
            h3.card__title!= data.name
            if (data.descr !== 'undefined' && data.descr)
              p.card__descr!= data.descr
            p.card__price!= price
        +btn('Купить', '')(class='card__buy')
    

Стили

Sass и PostCSS для обработки стилей

Sass и PostCSS для обработки стилей

      // Файл src/blocks/promo/promo.scss
       
      .promo {
        padding: 0 1rem;
        background-color: $gray-lighter;
      
        &__inner {
          max-width: $content-max-width;
          margin: auto;
        }
      }
    

Sass и PostCSS для обработки стилей

      // Файл src/scss/style.scss
      
      @import "src/scss/variables.scss";
      @import "src/scss/mixins.scss";
       
      @import "src/blocks/burger/burger.scss";
      @import "src/blocks/logo/logo.scss";
      @import "src/blocks/main-nav/main-nav.scss";
      @import "src/blocks/page/page.scss";
      @import "src/blocks/page-footer/page-footer.scss";
      @import "src/blocks/page-header/page-header.scss";
    

Javascript

Обработка javascript

Linting

Единообразие кода = быстрое чтение


Проверка eslint и stylelint по командам и по прекоммит-хуку.

Вопросы?

© Николай Громов.

Бонус
скидка 10% на любой курс в EpicSkills по промо-коду GROMOV10