Repository: ninelines-team/ninelines-docs
Branch: master
Commit: 2bcd745c733b
Files: 29
Total size: 151.1 KB
Directory structure:
gitextract_sqxq8fj5/
├── .gitignore
├── 01_technologies.md
├── 02_requirements.md
├── 03_installation.md
├── 04_tasks.md
├── 05_structure.md
├── 06_libraries.md
├── 07_images.md
├── 08_templates.md
├── 09_styles.md
├── 10_scripts.md
├── 11_resources.md
├── 13_pixel-perfect.md
├── 15_metatags.md
├── 16_codestyle-pug.md
├── 17_codestyle-scss.md
├── 18_codestyle-javascript.md
├── 19_video-js.md
├── 20_hls.md
├── 21_bem.md
├── 22_crossbrowser-adaptive.md
├── 23_perfomance.md
├── 24_git.md
├── 25_checklist.md
├── 26_short-checklist.md
├── 27_validation.md
├── 28_dynamic-share-for-spa.md
├── 29_helpers.md
└── README.md
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
.idea/
.DS_Store
================================================
FILE: 01_technologies.md
================================================
# Основные возможности и используемые технологии
* Система сборки [Gulp](https://gulpjs.com/)
* Оптимизация изображений.
* Генерация PNG- и SVG-спрайтов.
* Шаблонизация с помощью [Pug](https://pugjs.org/).
* CSS-препроцессор [SCSS](http://sass-lang.com/) и [Autoprefixer](https://autoprefixer.github.io/ru/).
* ES6 и [jQuery](https://jquery.com/).
* Встроенное определение устройства, браузера и операционной системы пользователя.
* Проверка кода линтерами ([pug-lint](https://www.npmjs.com/package/pug-lint), [stylelint](https://stylelint.io/), [ESLint](http://eslint.org/)).
* [Browsersync](https://www.browsersync.io/), автоматическое обновление страницы при разработке.
* Возможность быстро создать архив проекта.
* Множество дополнительных параметров сборки.
================================================
FILE: 02_requirements.md
================================================
# Минимальные требования
* node >= 9.5.0
* npm >= 5.6.0
* gulp >= 4.0.0
* gulp-cli >= 2.0.1
[Ссылка на инструкцию по переходу с gulp 3 на gulp 4](https://demisx.github.io/gulp4/2015/01/15/install-gulp4.html).
================================================
FILE: 03_installation.md
================================================
# Начало работы
Для установки рекомендуется использовать [Yeoman](http://yeoman.io/):
```bash
npm install -g yo
```
После yeoman, необходимо установить шаблон самой сборки:
```bash
npm install -g generator-ninelines-template
```
Теперь находясь в пустой папке с проектом выполняем команду:
```bash
yo ninelines-template
```
Генератор задаст несколько вопросов:
- Название проекта (по умолчанию — название папки проекта).
- Описание проекта.
- Запустить ли `npm install` (по умолчанию — да). Если пропустить установку npm-пакетов, то перед началом работы над проектом необходимо самостоятельно запустить `npm install`.
Теперь можно запустить `gulp` и приступить к работе.
================================================
FILE: 04_tasks.md
================================================
# Gulp-задачи
* `default` — основная задача, запускает `build`, `watch` и `serve`.
* `build` — сборка всех файлов, запускает задачи `copy`, `images`, `sprites:png`, `sprites:svg`, `pug`, `scss`, `js`.
* `watch` — запускает слежение за файлами, так что при изменении они автоматически пересобираются.
* `serve` — запускает сервер Browsersync.
* `pug` — запускает сборку Pug-шаблонов.
* `images` — запускает сборку изображений.
* `sprites:png` — запускает генерацию PNG-спрайтов.
* `sprites:svg` — запускает генерацию SVG-спрайтов.
* `scss` — запускает сборку стилей.
* `js` — запускает сборку скриптов.
* `copy` — запускает сборку дополнительных ресурсов.
* `lint` — последовательно запускает линтеры `lint:js`, `lint:pug`, `lint:scss`.
* `lint:js` — проверяет JavaScript-файлы линтером [ESLint](http://eslint.org/).
* `lint:pug` — проверяет Pug-файлы линтером [pug-lint](https://github.com/pugjs/pug-lint).
* `lint:scss` — проверяет SCSS-файлы линтером [stylelint](https://stylelint.io/).
* `optimize:svg` — оптимизирует и форматирует код SVG-файлов в папке `src/images`.
* `optimize:images` — оптимизирует изображения в папке `src/images`.
* `zip` — создает архив проекта.
## Дополнительные параметры:
* `--ci` — включает режим CI (`--no-cache --no-notify --no-open --throw-errors`).
* `--fix` — автоматически исправляет ошибки при проверке кода линтером (только для `lint:js`).
* `--minify` — включает минификацию файлов (только для `sprites:svg`, `pug`, `scss` и `js`).
* `--minify-html` — включает минификацию HTML-файлов (имеет приоритет перед `--minify`).
* `--minify-css` — включает минификацию CSS-файлов (имеет приоритет перед `--minify`).
* `--minify-js` — включает минификацию JS-файлов (имеет приоритет перед `--minify`).
* `--minify-svg` — включает минификацию SVG-файлов (имеет приоритет перед `--minify`).
* `--no-cache` — отключает кэширование (только для `copy`, `images` и `pug`).
* `--no-debug` — отключает отладочный вывод списка обрабатываемых файлов.
* `--no-notify` — отключает уведомления об ошибках.
* `--no-open` — отключает автоматический запуск браузера (только для `serve`).
* `--port` — задает порт сервера (только для `serve`).
* `--spa` — включает режим одностраничного приложения (только для `serve`).
* `--throw-errors` — прерывает сборку при возникновении ошибки.
================================================
FILE: 05_structure.md
================================================
# Структура папок и файлов
```text
ninelines-template
├── src
│ ├── images
│ │ └── sprites
│ │ ├── png
│ │ │ └── .keep
│ │ └── svg
│ │ └── .keep
│ ├── js
│ │ ├── vendor
│ │ │ └── .keep
│ │ ├── main.js
│ │ └── vendor.js
│ ├── pug
│ │ ├── mixins
│ │ │ └── svg.pug
│ │ ├── base.pug
│ │ └── mixins.pug
│ ├── resources
│ │ └── fonts
│ │ └── .keep
│ ├── scss
│ │ ├── functions
│ │ │ └── _sprites.scss
│ │ ├── mixins
│ │ │ ├── _clearfix.scss
│ │ │ ├── _retina.scss
│ │ │ ├── _sprites.scss
│ │ │ ├── _triangle.scss
│ │ │ └── _visually-hidden.scss
│ │ ├── vendor
│ │ │ └── .keep
│ │ ├── _base.scss
│ │ ├── _fonts.scss
│ │ ├── _functions.scss
│ │ ├── _mixins.scss
│ │ ├── _sprites.hbs
│ │ ├── _sprites.scss
│ │ ├── _variables.scss
│ │ ├── _vendor.scss
│ │ └── main.scss
│ └── index.pug
├── .babelrc
├── .editorconfig
├── .eslintignore
├── .eslintrc
├── .gitignore
├── .npmrc
├── .pug-lintrc.json
├── .stylelintignore
├── .stylelintrc
├── gulpfile.js
├── package.json
├── README.md
└── webpack.config.js
```
## `src`
В папке `src` хранятся исходные файлы проекта.
## `src/images`
Папка `images` предназначена для хранения изображений.
При сборке файлы из данной папки попадают в `build/images`.
## `src/images/sprites`
Папка `src/images/sprites` предназначена для хранения векторных (SVG) и растровых (PNG) иконок.
## `src/images/sprites/png`
Папка `src/images/sprites/png` предназначена для хранения растровых иконок.
При сборке файлы из данной папки объединяются в два спрайта: `build/images/sprites.png` и `build/images/sprites@2x.png`.
## `src/images/sprites/svg`
Папка `src/images/sprites/svg` предназначена для хранения векторных иконок.
При сборке файлы из данной папки объединяются в один спрайт: `build/images/sprites.svg`.
## `src/js`
Папка `src/js` предназначена для хранения скриптов.
## `src/js/vendor`
Папка `src/js/vendor` предназначена для хранения скриптов сторонних библиотек, которых нет в репозитории npm.
## `src/js/main.js`
Файл `src/js/main.js` предназначен для хранения основной логики сайта.
При сборке данный файл попадает в `build/js`.
## `src/js/vendor.js`
Файл `src/js/vendor.js` предназначен для подключения сторонних библиотек.
При сборке данный файл попадет в `build/js`.
## `src/pug`
Папка `src/pug` предназначена для хранения шаблонов.
## `src/pug/mixins`
Папка `src/pug/mixins` предназначена для хранения Pug-миксин.
## `src/pug/base.pug`
В файле `src/pug/base.pug` хранится базовый шаблон страниц сайта.
## `src/pug/mixins.pug`
Файл `src/pug/mixins.pug` предназначен для подключения Pug-миксин из папки `src/pug/mixins`.
## `src/resources`
Папка `src/resources` предназначена для хранения различных файлов проекта.
При сборке файлы из данной папки попадают в `build`.
## `src/resources/fonts`
Папка `src/resources/fonts` предназначена для хранения шрифтов.
При сборке файлы из данной папки попадают в `build/fonts`.
## `src/scss`
Папка `src/scss` предназначена для хранения стилей.
## `src/scss/functions`
Папка `src/scss/functions` предназначена для хранения SCSS-функций.
## `src/scss/mixins`
Папка `src/scss/mixins` предназначена для хранения SCSS-миксин.
## `src/scss/vendor`
Папка `src/scss/vendor` предназначена для хранения стилей сторонних библиотек, которых нет в репозитории npm.
## `src/scss/_base.scss`
Файл `src/scss/_base.scss` предназначен для хранения базовых стилей.
## `src/scss/_fonts.scss`
Файл `src/scss/_fonts.scss` предназначен для подключения шрифтов.
## `src/scss/_functions.scss`
Файл `src/scss/_functions.scss` предназначен для подключения функций из папки `src/scss/functions`.
## `src/scss/_mixins.scss`
Файл `src/scss/_mixins.scss` предназначен для подключения миксин из папки `src/scss/mixins`.
## `src/scss/_sprites.hbs`
`src/scss/_sprites.hbs` — шаблон, на основе которого генерируется содержимое файла `src/scss/_sprites.scss`.
## `src/scss/_sprites.scss`
Файл `src/scss/_sprites.scss` предназначен для работы с PNG-спрайтами.
Содержимое данного файла автоматически генерируется на основе шаблона `src/scss/_sprites.hbs` и иконок из папки `src/images/sprites/png`.
## `src/scss/_variables.scss`
Файл `src/scss/_variables.scss` предназначен для хранения SCSS-переменных.
## `src/scss/_vendor.scss`
Файл `src/scss/_vendor.scss` предназначен для подключения стилей сторонних библиотек.
## `src/scss/main.scss`
Файл `src/scss/main.scss` предназначен для хранения основных стилей сайта.
При сборке данный файл преобразуется в CSS и сохраняется в `build/css` вместе с файлом `main.css.map`.
## `src/index.pug`
`src/index.pug` — шаблон главной страницы.
При сборке все Pug-файлы из папки `src` преобразуются в HTML и сохраняются в `build`.
## `.babelrc`
`.babelrc` — файл настроек JavaScript-транспайлера Babel.
## `.editorconfig`
`.editorconfig` — файл настроек редактора.
## `.eslintignore`
`.eslintignore` — файл настроек ESLint для игнорирования файлов.
## `.eslintrc`
`.eslintrc` — файл настроек ESLint.
## `.gitignore`
`.gitignore` — файл настроек Git для игнорирования файлов.
## `.npmrc`
`.npmrc` — файл настроек npm.
## `.pug-lintrc.json`
`.pug-lintrc.json` — файл настроек pug-lint.
## `.stylelintignore`
`.stylelintignore` — файл настроек stylelint для игнорирования файлов.
## `.stylelintrc`
`.stylelintrc` — файл настроек stylelint.
## `gulpfile.js`
`gulpfile.js` — основной файл сборки, содержащий Gulp-задачи.
## `package.json`
`package.json` — файл, содержащий базовую информацию о проекте и список требуемых библиотек.
## `README.md`
`README.md` — описание проекта.
## `webpack.config.js`
`webpack.config.js` — файл настроек webpack.
================================================
FILE: 06_libraries.md
================================================
# Подключение сторонних библиотек
Библиотеки подключаются с помощью npm.
При установке следует указывать ключ `--save` или `--save-dev`.
Пример:
```bash
npm install --save jquery
npm install --save-dev gulp
```
`--save` указывается для библиотек, код которых попадает в итоговую сборку (папку `build`) и будет использоваться на сайте.
`--save-dev` указывается для библиотек, которые используются только для сборки.
После установки необходимо подключить нужные файлы библиотеки:
* скрипты — в `src/js/vendor.js` или `src/js/main.js`.
* стили — в `src/scss/_vendor.scss`.
* изображения — в `src/images`.
* любые другие файлы — в `src/resources`.
Полный пример, описывающий установку библиотеки fancybox:
1. Установка:
```bash
npm install --save fancybox
```
2. Подключение скриптов в файл `src/js/vendor.js`:
```js
import 'fancybox';
```
3. Подключение стилей в файл `src/scss/_vendor.scss`:
```scss
$fancybox-image-url: "../images";
@import "../../node_modules/fancybox/dist/scss/jquery.fancybox";
```
4. Копирование изображений в `src/images`:
```text
ninelines-template
└── src
├── images
│ ├── blank.gif
│ ├── fancybox_loading.gif
│ ├── fancybox_loading@2x.gif
│ ├── fancybox_overlay.png
│ ├── fancybox_sprite.png
│ ├── fancybox_sprite@2x.png
│ └── ...
└── ...
```
Если библиотека отсутствует в npm, либо её нужно модифицировать, то файлы следует скачать и закинуть в папки `src/js/vendor` и `src/scss/vendor`.
================================================
FILE: 07_images.md
================================================
# Работа с изображениями
Изображения следует хранить в папке `src/images`.
При запуске задачи `images` файлы из папки `src/images` копируются в `build/images`.
```text
ninelines-template
├── build
│ └── images
└── src
└── images
```
Для оптимизации изображений можно использовать задачу `optimize:images`.
> `optimize:images` оптимизирует только исходные файлы из папки `src/images`!
Предварительно оптимизированные изображения рекомендуется хранить в папке `src/resources/images`.
В таком случае при запуске задачи `optimize:images` данные файлы не будут затронуты.
```text
ninelines-template
└── src
└── resources
└── images
```
## Работа с PNG-спрайтами
Работа с PNG-спрайтами строится следующим образом:
1. Берем две версии иконки — обычную и retina (увеличенную в два раза).
Сохраняем в `src/images/sprites/png`:
```text
ninelines-template
└── src
└── images
└── sprites
└── png
├── phone.png
└── phone@2x.png
```
2. Запускаем задачу `sprites:png` (если уже запущен `gulp watch` или `gulp`, то данный шаг можно пропустить):
```bash
gulp sprites:png
```
3. Генератор оптимизирует и объединяет иконки в спрайты:
```text
ninelines-template
└── build
└── images
├── sprites.png
└── sprites@2x.png
```
На основе предзаданного шаблона `src/scss/_sprites.hbs` генерируется файл `src/scss/_sprites.scss`, содержащий вспомогательную информацию о получившихся спрайтах:
```text
ninelines-template
└── src
└── scss
├── _sprites.hbs
└── _sprites.scss
```
Для каждой иконки создается CSS-класс в формате `.sprite-[name]`.
В нашем случае получим класс `.sprite-phone`.
В сборке также содержится ряд SCSS-функций и миксин для работы со спрайтами.
`src/scss/functions/_sprites.scss`:
```scss
@function sprite($name, $size: normal) { /* ... */ }
@function sprite-width($name, $size: normal) { /* ... */ }
@function sprite-height($name, $size: normal) { /* ... */ }
@function sprite-image($name, $size: normal) { /* ... */ }
@function sprite-x($name, $size: normal) { /* ... */ }
@function sprite-y($name, $size: normal) { /* ... */ }
@function sprite-total-width($name, $size: normal) { /* ... */ }
@function sprite-total-height($name, $size: normal) { /* ... */ }
```
`src/scss/mixins/_srites.scss`:
```scss
@mixin sprite-width($name, $size: normal) { /* ... */ }
@mixin sprite-height($name, $size: normal) { /* ... */ }
@mixin sprite-background-image($name, $size: normal) { /* ... */ }
@mixin sprite-background-position($name, $size: normal) { /* ... */ }
@mixin sprite-background-size($name, $size: normal) { /* ... */ }
@mixin sprite-background($name, $size: normal) { /* ... */ }
@mixin sprite($name) { /* ... */ }
```
4. Полученные спрайты можно использовать в Pug (с помощью классов):
```jade
footer
a(href="tel:+71234567890")
span.sprite-phone
| +7 (123) 456-78-90
```
Или в SCSS (с помощью миксин):
```scss
footer {
a {
&::before {
@include sprite("phone");
content: "";
}
}
}
```
## Работа с SVG-спрайтами
Принцип работы с SVG-спрайтами:
1. Получаем векторные иконки в формате `.svg` (либо заранее подготовленные, либо экспортируем с помощью редактора).
Сохраняем в папку `src/images/sprites/svg`:
```text
ninelines-template
└── src
└── images
└── sprites
└── svg
└── phone.svg
```
2. Запускаем задачу `sprites:svg` (если уже запущен `gulp watch` или `gulp`, то данный шаг можно пропустить):
```bash
gulp sprites:svg
```
3. Генератор оптимизирует и объединяет иконки в один спрайт:
```text
ninelines-template
└── build
└── images
└── sprites.svg
```
В сборке содержится Pug-миксин для подключения SVG-спрайтов.
`src/pug/mixins/svg.pug`:
```jade
mixin svg(name)
svg&attributes(attributes)
use(xlink:href=`${baseDir}images/sprites.svg#${name}`)
```
4. Подключаем иконку в Pug:
```jade
footer
a(href="tel:+71234567890")
+svg("phone")
| +7 (123) 456-78-90
```
При необходимости иконку можно стилизовать:
```scss
footer {
a {
svg {
display: inline-block;
vertical-align: middle;
width: 30px;
height: 30px;
fill: $color-black;
}
}
}
```
Если цвет заливки или обводки не удается изменить с помощью CSS, то необходимо открыть SVG-файл иконки в редакторе и удалить соответствующие атрибуты (`fill`, `stroke`) из кода.
## Избавляемся от обрезанных краев SVG-иконок
1. Общий пример:
Шаг 1: исходная иконка без полей
```html
```
Шаг 2: добавляем поле размером {padding}
```html
```
Шаг 3: запускаем optimize:svg и получаем иконку без лишних трансформаций
```html
```
2. Конкретный пример:
Шаг 1: исходная иконка без полей
```html
```
Шаг 2: добавляем поле размером 1px
```html
```
Шаг 3: запускаем optimize:svg и получаем иконку без лишних трансформаций
```html
```
================================================
FILE: 08_templates.md
================================================
# Работа с шаблонизатором Pug
> При работе с шаблонизатором **важно** придерживаться установленных [правил по оформлению кода](16_codestyle-pug.md).
В сборке используется шаблонизатор [Pug](https://pugjs.org/) (ранее назывался Jade).
Pug предоставляет множество возможностей, упрощающих работу с шаблонами:
* Переменные.
* Циклы.
* Условия.
* Фильтры.
* Наследование шаблонов.
* Миксины.
Шаблоны страниц размещаются в `src`, а дополнительные файлы и миксины в `src/pug`:
```text
ninelines-template
└── src
├── pug
│ ├── mixins
│ │ └── svg.pug
│ ├── base.pug
│ └── mixins.pug
└── index.pug
```
За сборку и преобразование Pug в HTML отвечает задача `pug`:
```bash
gulp pug
```
После выполнения команды в папке `build` появятся HTML-файлы:
```text
ninelines-template
└── build
└── index.html
```
## Базовый шаблон и создание страниц
В качестве базового шаблона используется `src/pug/base.pug`.
Пример наследования и использования шаблона:
```jade
extends pug/base
block content
// Содержимое страницы
```
Базовый шаблон определяет блоки (участки кода или место в шаблоне), которые можно изменять и дополнять при наследовании.
### `vars`
Блок `vars` хранит основные настройки шаблона:
* `baseDir` — корневая директория сайта (по умолчанию `/`).
* `title` — заголовок страницы (используется в `