Π”ΠΆΠ΅Π½Ρ‚Π»ΡŒΠΌΠ΅Π½ΡΠΊΠΈΠΉ Π½Π°Π±ΠΎΡ€ Front-end Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°. ΠŸΡ€ΠΈΡΡ‚Π½Π°Ρ сборка frontend ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠŸΠ»Π°Π³ΠΈΠ½Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ JavaScript

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Gulp окруТСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΊΠΎΠΌΡ„ΠΎΡ€Ρ‚Π½ΠΎΠΉ Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π²Π΅Π±-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Π”Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ сконфигурирован для создания сайтов ΠΈ Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π² основу ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ Bootstrap 4.

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚, рассматриваСмый Π² Ρ€Π°ΠΌΠΊΠ°Ρ… этой ΡΡ‚Π°Ρ‚ΡŒΠΈ располоТСн Π½Π° Github ΠΏΠΎ адрСсу: https://github.com/itchief/gulp-project-bootstrap-4

Π’ΠΈΠ΄Π΅ΠΎ ΠΊ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅:

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ ΠΏΠΎ установкС Gulp окруТСния

Для создания окруТСния Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ установлСнныС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:

  • "Node.js" (Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ установщик "Node.js" для своСй ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы ΠΌΠΎΠΆΠ½ΠΎ c этой страницы ; для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° трСбуСтся вСрсия ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π΅ Π½ΠΈΠΆΠ΅ 10 );
  • "Gulp" (ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Gulp ΠΌΠΎΠΆΠ½ΠΎ посрСдством выполнСния Π² консоли ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹: npm install -g gulp-cli).

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ этап – это установка npm ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΈ ΠΈΡ… зависимостСй. Для этого Π² консоли (Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°) Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

Npm install

Данная ΠΊΠΎΠΌΠ°Π½Π΄Π° установит всС ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½Ρ‹ ΠΊΠ°ΠΊ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ самого окруТСния, Ρ‚Π°ΠΊ ΠΈ для Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄Π°. ВыполняСт npm эти дСйствия Π² соотвСтствии с инструкциями, написанными Π² Ρ„Π°ΠΉΠ»Π΅ "package.json".

ΠŸΡ€ΠΈ использовании ΠΏΠ΅Ρ€Π²ΠΎΠΉ вСрсии ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° (1.0.0), Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Bower, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π΅Ρ‰Ρ‘ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

Bower install

Данная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° установит Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π² Ρ„Π°ΠΉΠ»Π΅ "bower.json".

Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Gulp ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅?

ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡƒΡŽ строку (ΠΏΡƒΡ‚ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° ΠΊΠΎΡ€Π½Π΅Π²ΡƒΡŽ ΠΏΠ°ΠΏΠΊΡƒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°) ΠΈ ввСсти gulp (ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ):

ПослС Π²Π²ΠΎΠ΄Π° этой ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ запустится Π·Π°Π΄Π°Ρ‡Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ‚.Π΅. "default". Π­Ρ‚Π° Π·Π°Π΄Π°Ρ‡Π° Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ запустит ΡΠ΅Ρ€ΠΈΡŽ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π·Π°Π΄Π°Ρ‡: "build", "webserver" ΠΈ "watch".

Π—Π°Π΄Π°Ρ‡Π° "build" Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ сборку ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° для ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π° (Ρ‚.Π΅. ΠΎΠ½Π° запустит "clean:build", "html:build", "css:build", "js:build", "fonts:build" ΠΈ "image:build"). Π­Ρ‚ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ помСстят Π² ΠΏΠ°ΠΏΠΊΡƒ "assets/build" Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

Π—Π°Π΄Π°Ρ‡Π° "webserver" ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для запуска локального Π²Π΅Π±-сСрвСра с Β«ΠΆΠΈΠ²ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉΒ» страниц Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ просто ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ тСстированиС.

Π—Π°Π΄Π°Ρ‡Π° "watch" ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для отслСТивания измСнСния исходных Ρ„Π°ΠΉΠ»ΠΎΠ² Π² ΠΏΠ°ΠΏΠΊΠ΅ "assets/src" ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ссли это ΠΏΡ€ΠΈΠ·ΠΎΡˆΠ»ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΎΠ½Π° позволяСт автоматичСски Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ (содСрТимоС ΠΏΠ°ΠΏΠΊΠΈ "assets/build") Π² Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΌ состоянии.


ΠšΡ€ΠΎΠΌΠ΅ этого ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€ΠΎΡ‡Π½ΡƒΡŽ (ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ) сборку Ρ‚ΠΎΠΉ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ части ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

НапримСр, для сборки Ρ‚ΠΎΠ»ΡŒΠΊΠΎ CSS части сайта достаточно ввСсти ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

Gulp css:build

Бписок Π΄Ρ€ΡƒΠ³ΠΈΡ… Π·Π°Π΄Π°Ρ‡:

Gulp clean:build // для очистки ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° "assets/build" gulp html:build // для сборки HTML Ρ„Π°ΠΉΠ»ΠΎΠ² gulp js:build // для сборки JS Ρ„Π°ΠΉΠ»ΠΎΠ² gulp fonts:build // для сборки ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠ² gulp image:build // для сборки изобраТСния

ОписаниС Gulp окруТСния

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ Ρ€Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ:

  • основныС инструмСнты ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²ΡƒΡŽ структуру Gulp окруТСния;
  • ΠΊΠ°ΠΊ осущСствляСтся ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ исходников Bootstrap ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ ΠΈ ΠΈΡ… настройка;
  • ΠΊΠ°ΠΊ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ (с нуля) Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Gulp ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ установку зависимостСй (Π±Π΅Π· использования Π³ΠΎΡ‚ΠΎΠ²ΠΎΠ³ΠΎ package.json)
  • ΠΊΠ°ΠΊ с нуля Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Bower ΠΈ установку Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² (Π±Π΅Π· использования Π³ΠΎΡ‚ΠΎΠ²ΠΎΠ³ΠΎ "bower.json")*;
  • содСрТимоС Ρ„Π°ΠΉΠ»Π° сборщика ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Gulp (gulpfile.js)

* ΠœΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Bower Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅, начиная с вСрсии 2.0.0.

Бписок инструмСнтов

ΠžΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° (сайта), построСно Π½Π° Π±Π°Π·Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… инструмСнтов:

  • Node.js (срСды, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅);
  • npm (ΠΏΠ°ΠΊΠ΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π°, входящСго Π² Node.js; Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Gulp, ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² ΠΈ Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²);
  • jQuery, Popover, Bootstrap (ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для сборки css ΠΈ js частСй сайта);
  • Gulp ΠΈ Π΅Π³ΠΎ ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ (Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для сборки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ выполнСния Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²Π΅Π± Π·Π°Π΄Π°Ρ‡).

Π’ ΠΏΠ΅Ρ€Π²Ρ‹Ρ… вСрсиях ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΅Ρ‰Ρ‘ использовался ΠΏΠ°ΠΊΠ΅Ρ‚Π½Ρ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ Bower. Он примСнялся Π·Π° Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ jQuery, Popover ΠΈ Bootstrap. Π’ вСрсиях ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, начиная с 2.0.0, Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ выполняСтся посрСдством npm.

Ѐайловая структура Gulp ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

Π€Π°ΠΉΠ»ΠΎΠ²ΡƒΡŽ структуру ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΎΡ‚ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΠΉ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°, Ρ‚Π°ΠΊ ΠΈ ΠΎΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½Π° создаётся.

Π’ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ структуры:

Π’ ΠΊΠΎΡ€Π½Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° располоТСна ΠΏΠ°ΠΏΠΊΠ° "assets" ΠΈ Ρ„Π°ΠΉΠ»Ρ‹ "gulpfile.js", "package.json". Π€Π°ΠΉΠ» "gulpfile.js" Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π·Π°Π΄Π°Ρ‡ΠΈ для сборщика ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Gulp.

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΉ вСрсии ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Ρ‚Π°ΠΊΠΆΠ΅ использовались Ρ„Π°ΠΉΠ»Ρ‹ ".bowerrc" ΠΈ "bower.json". Π€Π°ΠΉΠ» "bower.json" - это ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° Bower, Π½Π° основании ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΠ»ΠΈΡΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹. Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΎΠ½ использовался для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Bootstrap, jQuery ΠΈ Popper.

Π’ ΠΏΠ°ΠΏΠΊΠ΅ "assets" находятся Π΄Π²Π΅ ΠΏΠ°ΠΏΠΊΠΈ: "src" (для исходных Ρ„Π°ΠΉΠ»ΠΎΠ²) ΠΈ "build" (для Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²; Π² эту ΠΏΠ°ΠΏΠΊΡƒ ΠΈΡ… Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ сборщик Gulp). Π’ ΠΏΠ°ΠΏΠΊΠ΅ "src" располоТСны ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ "fonts" (для ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠ²), "img" (для исходных ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ), "js" (для js-Ρ„Π°ΠΉΠ»ΠΎΠ²), "style" (для стилСй) ΠΈ "template" (для HTML Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ²) ΠΈ Ρ„Π°ΠΉΠ» "index.html".

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΉ вСрсии ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π² ΠΏΠ°ΠΏΠΊΠ΅ "src" Π΅Ρ‰Ρ‘ Π½Π°Ρ…ΠΎΠ΄ΠΈΠ»Π°ΡΡŒ дирСктория "bower_components". Она ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π°Π»Π°ΡΡŒ для ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ»Π°ΡΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Bower. Π’ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ вСрсии Π΅Ρ‘ Π½Π΅Ρ‚.

Π’ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ "js" Ρ€Π°ΡΠΏΠΎΠ»ΠΎΠ³Π°ΡŽΡ‚ΡΡ Π΄Π²Π° Ρ„Π°ΠΉΠ»Π°: "main.js" ΠΈ "my.js". Π€Π°ΠΉΠ» "my.js" ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для написания своих скриптов, Π° "main.js" – для опрСдСлСния списка Ρ„Π°ΠΉΠ»ΠΎΠ², содСрТимоС ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ js-Ρ„Π°ΠΉΠ». Под ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΌ понимаСтся Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ (Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ "build").

ДирСктория "style" ΠΎΡ‚Π²Π΅Π΄Π΅Π½Π° ΠΏΠΎΠ΄ стили. Π’ Π΄Π°Π½Π½ΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ находятся Ρ‚Ρ€ΠΈ Ρ„Π°ΠΉΠ»Π°: "main.scss" (содСрТит список Ρ„Π°ΠΉΠ»ΠΎΠ², содСрТимоС ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ» стилСй), "my.scss" (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для написания своих стилСй) ΠΈ "variables.scss" (содСрТит SCSS ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΡƒΠ΄Π΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ стили Bootstrap 4, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ для создания своих ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…).

Π€Π°ΠΉΠ» "index.html" - это главная страница создаваСмого ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. ΠšΡ€ΠΎΠΌΠ΅ "index.html" Π² Π΄Π°Π½Π½ΡƒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ html страницы.

ДирСктория "template" ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для помСщСния Π² Π½Π΅Ρ‘ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² HTML страниц. НапримСр, Π² Π΄Π°Π½Π½ΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ "head.html" ΠΈ "footer.html", ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… содСрТимоС (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ синтаксис //= ΠΏΡƒΡ‚ΡŒ_ΠΊ_Ρ„Π°ΠΉΠ»Ρƒ) сразу Π² нСсколько страниц. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π±ΠΎΠ»Π΅Π΅ просто ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ html страницы, Ρ‚.ΠΊ. ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ части страниц ΡƒΠΆΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ….

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ исходников Bootstrap 4 ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ ΠΈ ΠΈΡ… настройка

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹Π΅ способы ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° Bootstrap 4 ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½ΠΈΠΌ.

НаиболСС Π³ΠΈΠ±ΠΊΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² использовании исходных ΠΊΠΎΠ΄ΠΎΠ². Π’ этом случаС ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‡Π΅Π½ΡŒ просто ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½Ρ‹Π΅ стили Bootstrap , Π½ΠΎ ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ классы ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² Π½Ρ‘ΠΌ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ .

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΊΠΎΠ΄Ρ‹ CSS стилСй Bootstrap 4 написаны Π½Π° языкС SCSS ΠΈ прСдставлСны посрСдством большого количСства Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ².

Бписок SCSS Ρ„Π°ΠΉΠ»ΠΎΠ² (располоТСны Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ "node_modules/bootstrap/scss/"): "functions.scss", "variables.scss", "mixins.scss", "variables.scss", "print.scss", "reboot.scss", "type.scss", "images.scss", "code.scss", "grid.scss", "tables.scss", "forms.scss", "buttons.scss", "transitions.scss", "dropdown.scss" ΠΈ Π΄Ρ€.

КаТдой Ρ‚Π°ΠΊΠΎΠΉ Ρ„Π°ΠΉΠ» выполняСт Π»ΠΈΠ±ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΡƒΡŽ ΡΠ»ΡƒΠΆΠ΅Π±Π½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ, Π»ΠΈΠ±ΠΎ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° ΡΡ‚ΠΈΠ»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°. Π€Π°ΠΉΠ»Ρ‹ SCSS ΠΈΠΌΠ΅ΡŽΡ‚ ΠΊΡ€Π°Ρ‚ΠΊΠΈΠ΅ ΠΈ понятныС ΠΈΠΌΠ΅Π½Π°. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ достаточно Ρ‚ΠΎΡ‡Π½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ….

Настройка ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½Ρ‹Ρ… стилСй Bootstrap 4 осущСствляСтся посрСдством пСрСопрСдСлСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… SCSS . ВсС SCSS ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ для удобства собраны Π² ΠΎΠ΄Π½ΠΎΠΌ мСстС (Π² Ρ„Π°ΠΉΠ»Π΅ "variables.scss"). Но, ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΈΡ… значСния ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, Π½Π΅ Π² этом Ρ„Π°ΠΉΠ»Π΅, Π° Π² своём (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΌ Ρ‚Π°ΠΊΠΎΠ΅ ΠΆΠ΅ имя "variables.scss", Π½ΠΎ находящСмся Π² "assets/style/variables.scss").

НапримСр, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ†Π²Π΅Ρ‚Π° Ρ‚Π΅ΠΌ success ΠΈ danger , осущСствляСтся посрСдством измСнСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… $green ΠΈ $red:

// ΠŸΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Bootstrap 4 $red: #cc2eaa; $green: #2ecc71;

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ , Ρ‡Ρ‚ΠΎ послС копирования ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Bootstrap 4 Π² свой Ρ„Π°ΠΉΠ» CSS ("assets/style/variables.scss"), Ρƒ Π½ΠΈΡ… Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΊΡƒ!default .

ΠœΠ΅Ρ‚ΠΊΠ°!default ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для установлСния SCSS ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Если ΠΆΠ΅ Ρƒ SCSS ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‚ΠΎ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ссли ΠΎΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Π½ΠΎ с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ!default , установлСно Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚.

Π£ΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅ исходныС SCSS Ρ„Π°ΠΉΠ»Ρ‹ Bootstrap 4 Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΡ‡Π°ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ компиляции Π² CSS, Π° ΠΊΠ°ΠΊΠΈΠ΅ Π½Π΅Ρ‚, выполняСтся посрСдством SCSS Ρ„Π°ΠΉΠ»Π° "assets/style/main.scss". Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами ΠΈΠΌΠ΅Π½Π½ΠΎ содСрТимоС этого Ρ„Π°ΠΉΠ»Π° ΠΈ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Ρ‚ΠΎΡ‚ Π½Π°Π±ΠΎΡ€ стилСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ послС компиляции Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ ΠΊ Π²Π΅Π±-страницС.

ΠšΡ€ΠΎΠΌΠ΅ этого, ΠΊ этому Ρ„Π°ΠΉΠ»Ρƒ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Ρ‘Π½Ρ‹ Ρ„Π°ΠΉΠ»Ρ‹ "assets/style/variables.scss" (для пСрСопрСдСлСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Bootstrap) ΠΈ "assets/style/my.scss" (для создания своих стилСй).

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ Ρ„Π°ΠΉΠ»Π° "main.scss" (ΠΏΡ€ΠΈΠΌΠ΅Ρ€):

// ΠŸΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Bootstrap 4 ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ своих @import "variables"; // ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½ΡƒΠΆΠ½Ρ‹Ρ… SCSS исходников Bootstrap 4 @import "../../../node_modules/bootstrap/scss/_functions"; @import "../../../node_modules/bootstrap/scss/_variables"; @import "../../../node_modules/bootstrap/scss/_mixins"; @import "../../../node_modules/bootstrap/scss/_root"; @import "../../../node_modules/bootstrap/scss/_reboot"; @import "../../../node_modules/bootstrap/scss/_type"; @import "../../../node_modules/bootstrap/scss/_images"; @import "../../../node_modules/bootstrap/scss/_code"; @import "../../../node_modules/bootstrap/scss/_grid"; @import "../../../node_modules/bootstrap/scss/_tables"; @import "../../../node_modules/bootstrap/scss/_forms"; @import "../../../node_modules/bootstrap/scss/_buttons"; @import "../../../node_modules/bootstrap/scss/_transitions"; @import "../../../node_modules/bootstrap/scss/_dropdown"; @import "../../../node_modules/bootstrap/scss/_button-group"; @import "../../../node_modules/bootstrap/scss/_input-group"; @import "../../../node_modules/bootstrap/scss/_custom-forms"; @import "../../../node_modules/bootstrap/scss/_nav"; @import "../../../node_modules/bootstrap/scss/_navbar"; @import "../../../node_modules/bootstrap/scss/_card"; @import "../../../node_modules/bootstrap/scss/_breadcrumb"; @import "../../../node_modules/bootstrap/scss/_pagination"; @import "../../../node_modules/bootstrap/scss/_badge"; @import "../../../node_modules/bootstrap/scss/_jumbotron"; @import "../../../node_modules/bootstrap/scss/_alert"; @import "../../../node_modules/bootstrap/scss/_progress"; @import "../../../node_modules/bootstrap/scss/_media"; @import "../../../node_modules/bootstrap/scss/_list-group"; @import "../../../node_modules/bootstrap/scss/_close"; @import "../../../node_modules/bootstrap/scss/_toasts"; @import "../../../node_modules/bootstrap/scss/_modal"; @import "../../../node_modules/bootstrap/scss/_tooltip"; @import "../../../node_modules/bootstrap/scss/_popover"; @import "../../../node_modules/bootstrap/scss/_carousel"; @import "../../../node_modules/bootstrap/scss/_spinners"; @import "../../../node_modules/bootstrap/scss/_utilities"; @import "../../../node_modules/bootstrap/scss/_print"; // ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ своих SCSS Ρ„Π°ΠΉΠ»ΠΎΠ² @import "my";

ΠšΡ€ΠΎΠΌΠ΅ этого, для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Bootstrap 4 Π½ΡƒΠΆΠ΅Π½ Π΅Ρ‰Ρ‘ JavaScript ΠΊΠΎΠ΄.

Бписок js-Ρ„Π°ΠΉΠ»ΠΎΠ² Bootstrap 4 (находятся Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ "node_modules/bootstrap/js/dist/"): "util.js", "alert.js", "button.js", "carousel.js", "collapse.js", "dropdown.js", "modal.js", "tooltip.js", "popover.js", "scrollspy.js", "tab.js" ΠΈ "toast.js".

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊΠΈΠ΅ js-Ρ„Π°ΠΉΠ»Ρ‹ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° Bootstrap 4 Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ js-Ρ„Π°ΠΉΠ» ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π° ΠΊΠ°ΠΊΠΈΠ΅ Π½Π΅Ρ‚, выполняСтся посрСдством "main.js".

Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½ΡƒΠΆΠ½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ build/main.js осущСствляСтся посрСдством ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ конструкции:

//= ΠΏΡƒΡ‚ΡŒ_ΠΊ_Ρ„Π°ΠΉΠ»Ρƒ

ВыполняСт это дСйствиС Π±ΡƒΠ΄Π΅Ρ‚ Gulp ΠΏΠ»Π°Π³ΠΈΠ½ "gulp-rigger". Как Π΅Π³ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ описано Π½ΠΈΠΆΠ΅.

Π’ Π΄Π°Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ jQuery, Popper (Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Dropdown, Tooltip ΠΈ Popover) ΠΈ ΠΏΡ€ΠΈ нСобходимости свои js-Ρ„Π°ΠΉΠ»Ρ‹.

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ Ρ„Π°ΠΉΠ»Π° "main.js" (ΠΏΡ€ΠΈΠΌΠ΅Ρ€):

// Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ jQuery //= ../../../node_modules/jquery/dist/jquery.js // Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ Popper //= ../../../node_modules/popper.js/dist/umd/popper.js // Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ js-Ρ„Π°ΠΉΠ»Ρ‹ Bootstrap 4 //= ../../../node_modules/bootstrap/js/dist/util.js //= ../../../node_modules/bootstrap/js/dist/alert.js //= ../../../node_modules/bootstrap/js/dist/button.js //= ../../../node_modules/bootstrap/js/dist/carousel.js //= ../../../node_modules/bootstrap/js/dist/collapse.js //= ../../../node_modules/bootstrap/js/dist/dropdown.js //= ../../../node_modules/bootstrap/js/dist/modal.js //= ../../../node_modules/bootstrap/js/dist/tooltip.js //= ../../../node_modules/bootstrap/js/dist/popover.js //= ../../../node_modules/bootstrap/js/dist/scrollspy.js //= ../../../node_modules/bootstrap/js/dist/tab.js //= ../../../node_modules/bootstrap/js/dist/toast.js // Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ js-Ρ„Π°ΠΉΠ»Ρ‹ //= my.js

Как с нуля Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Gulp ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ установку зависимостСй?

НачинаСтся Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ с создания Ρ„Π°ΠΉΠ»Π° "package.json" (манифСста).

Π€Π°ΠΉΠ» "package.json" Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΎΠ±Ρ‰ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ (Π½Π°Π·Π²Π°Π½ΠΈΠ΅, Π²Π΅Ρ€ΡΠΈΡŽ, описаниС, имя Π°Π²Ρ‚ΠΎΡ€Π° ΠΈ Π΄Ρ€.), Π° Ρ‚Π°ΠΊΠΆΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π°Ρ…, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… этот ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ зависит.

Для создания манифСста, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² ΠΊΠΎΡ€Π½Π΅Π²ΡƒΡŽ ΠΏΠ°ΠΏΠΊΡƒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ ввСсти ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

Npm init

ПослС Π²Π²ΠΎΠ΄Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ вопросы:

  • имя ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° (name) – "bootstrap-4";
  • Π½ΠΎΠΌΠ΅Ρ€ вСрсии (version) – "2.0.0";
  • описаниС (description) – "Start project with use Bootstrap 4";
  • Π°Π²Ρ‚ΠΎΡ€ (author) – "сайт";
  • git Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ (git repository) - "";
  • Ρ‚ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° (entry point), тСстовая ΠΊΠΎΠΌΠ°Π½Π΄Π° (test command), лицСнзия (license), ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова (keywords) – значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

На вопрос Β«Is this ok?Β» ΠΎΡ‚Π²Π΅Ρ‚ΠΈΠΌ "yes" ΠΈΠ»ΠΈ Π½Π°ΠΆΠΌΡ‘ΠΌ Enter .

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° появится Ρ„Π°ΠΉΠ» "package.json".

Π’Π΅ΠΏΠ΅Ρ€ΡŒ установим ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

Npm install Π½Π°Π·Π²Π°Π½ΠΈΠ΅_ΠΏΠ°ΠΊΠ΅Ρ‚Π° --save-dev // установка ΠΏΠ°ΠΊΠ΅Ρ‚Π°, ΠΏΡ€ΠΈ этом информация ΠΎ Π½Ρ‘ΠΌ, автоматичСски прописываСтся Π² ΡΠ΅ΠΊΡ†ΠΈΡŽ "devDependencies" Ρ„Π°ΠΉΠ»Π° "package.json" npm install Π½Π°Π·Π²Π°Π½ΠΈΠ΅_ΠΏΠ°ΠΊΠ΅Ρ‚Π° --save-prod // установка ΠΏΠ°ΠΊΠ΅Ρ‚Π°, ΠΏΡ€ΠΈ этом информация ΠΎ Π½Ρ‘ΠΌ, автоматичСски прописываСтся Π² ΡΠ΅ΠΊΡ†ΠΈΡŽ "dependencies" Ρ„Π°ΠΉΠ»Π° "package.json"

ΠšΠ»ΡŽΡ‡ "--save-dev" ΠΈΠ»ΠΈ "--save-prod" опрСдСляСт Π² ΠΊΠ°ΠΊΡƒΡŽ ΡΠ΅ΠΊΡ†ΠΈΡŽ Ρ„Π°ΠΉΠ»Π° "package.json" ΠΏΠΎΠΏΠ°Π΄Ρ‘Ρ‚ информация ΠΎ Π½Ρ‘ΠΌ.

Бписок ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅:

Npm install gulp --save-dev // установка gulp npm install browser-sync --save-dev // установка browser-sync npm install gulp-autoprefixer --save-dev // установка gulp-autoprefixer npm install gulp-cache --save-dev // установка gulp-cache npm install gulp-clean-css --save-dev // установка gulp-clean-css npm install gulp-rimraf --save-dev // установка gulp-clean-css npm install gulp-imagemin --save-dev // установка gulp-imagemin npm install gulp-plumber --save-dev // установка gulp-plumber npm install gulp-rigger --save-dev // установка gulp-rigger npm install gulp-sass --save-dev // установка gulp-sass npm install gulp-sourcemaps --save-dev // установка gulp-sourcemaps npm install gulp-uglify --save-dev // установка gulp-uglify npm install imagemin-jpeg-recompress --save-dev // установка imagemin-jpeg-recompress npm install imagemin-pngquant --save-dev // установка imagemin-pngquant npm install gulp-rename --save-dev // установка imagemin-pngquant npm install jquery --save-prod npm install popper.js --save-prod npm install bootstrap --save-prod

ПослС установки всСх зависимостСй, Ρ„Π°ΠΉΠ» package.json Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ содСрТимоС:

{ "name": "bootstrap-4", "version": "2.0..com/itchief/gulp-project-bootstrap-4.git" }, "dependencies": { "jquery": "^3.4.1", "popper.js": "^1.14.7", "bootstrap": "^4.3.1" }, "devDependencies": { "browser-sync": "^2.26.7", "gulp": "^4.0.2", "gulp-autoprefixer": "^6.1.0", "gulp-cache": "^1.1.2", "gulp-clean-css": "^4.2.0", "gulp-rimraf": "^0.2.2", "gulp-imagemin": "^6.0.0", "gulp-plumber": "^1.2.1", "gulp-rigger": "^0.5.8", "gulp-sass": "^4.0.2", "gulp-sourcemaps": "^2.6.5", "gulp-uglify": "^3.0.2", "imagemin-jpeg-recompress": "^6.0.0", "imagemin-pngquant": "^8.0.0", "gulp-rename": "^1.4.0" } }

Как с нуля Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Bower ΠΈ установку Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²?

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ ΠΏΠ°ΠΏΠΊΡƒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Bower Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹. Для этого создадим Ρ„Π°ΠΉΠ».bowerrc ΠΈ Π²Π²Π΅Π΄Ρ‘ΠΌ Π² Π½Π΅Π³ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

{ "directory" : "assets/src/bower_components/" }

Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΠΌ Ρ„Π°ΠΉΠ».bowerrc . Π’Π΅ΠΏΠ΅Ρ€ΡŒ всС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒΡΡ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ bower_components , находящийся Π² assets/src/ .

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Bower (создадим Ρ„Π°ΠΉΠ»-манифСст bower.json). Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° bower.json ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ (Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°):

Bower init Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Bower

ПослС этого Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ вопросы:

  • имя ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° (name) – bootstrap-4;
  • описаниС (description) – Start project on Bootstrap 4 - сайт;
  • Π°Π²Ρ‚ΠΎΡ€ (author) – сайт;
  • ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ установлСнныС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΊΠ°ΠΊ зависимости (set currently installed components as dependencies) – Y (Π”Π°);
  • Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²Ρ‹ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ этот ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΉ, это ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ Π΅Π³ΠΎ ΡΠ»ΡƒΡ‡Π°ΠΉΠ½ΡƒΡŽ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΡŽ Π² рССстрС Bower (would you like to mark this package as private which prevents it from being accidentally published to the registry) – Y (Π”Π°);
  • Π½Π° ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ вопросы оставим ΠΎΡ‚Π²Π΅Ρ‚Ρ‹, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΡ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ;

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ этих дСйствий Π±ΡƒΠ΄Π΅Ρ‚ создан Ρ„Π°ΠΉΠ» bower.json .

Π—Π°Π³Ρ€ΡƒΠ·ΠΈΠΌ Bootstrap 4 ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½ зависит (Popper ΠΈ jQuery) Π² наш ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Bower.

Для этого Π² консоли Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ввСсти ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

Bower install bootstrap#v4.0.0-beta --save

ΠšΠ»ΡŽΡ‡ -save Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² ΡΠ΅ΠΊΡ†ΠΈΡŽ dependencies Ρ„Π°ΠΉΠ»Π° bower.json .

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ bower.json Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ содСрТимоС:

{ "name": "bootstrap-4", "description": "Start project on Bootstrap 4 - сайт", "authors": [ "сайт" ], "license": "ISC", "keywords": , "homepage": "", "ignore": [ "**/.*", "node_modules", "bower_components", "assets/src/bower_components/", "test", "tests" ], "dependencies": { "jquery": "^3.2.1", "bootstrap": "^v4.0.0-beta" } }

Если Π²Ρ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Bower (bower.json) с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ bower init ΠΈ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ просто ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» bower.json (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π°) ΠΈ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² Π½Π΅Π³ΠΎ Π²Ρ‹ΡˆΠ΅ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½Π½ΠΎΠ΅ тСкстовоС содСрТимоС. Для установки зависимостСй Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ достаточно Π±ΡƒΠ΄Π΅Ρ‚ ввСсти ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

Bower install

ОписаниС Ρ„Π°ΠΉΠ»Π° сборщика ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Gulp (gulpfile.js)

ВсС дСйствия, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Π΅ Π΄ΠΎ этого, Π±Ρ‹Π»ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ. Π’Π΅ΡΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ создаваСмоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅, Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒΡΡ Ρ„Π°ΠΉΠ»ΠΎΠΌ "gulpfile.js".

Π€Π°ΠΉΠ» "gulpfile.js" прСдставляСт собой список Π·Π°Π΄Π°Ρ‡.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ этот Ρ„Π°ΠΉΠ»:

  • сбор Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ² стилСй Π² ΠΎΠ΄ΠΈΠ½, компиляция ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ SCSS Π² CSS, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ автопрСфиксов, минимизация CSS ΠΈ созданиС source map;
  • ΠΈΠΌΠΏΠΎΡ€Ρ‚ всСх Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… js-Ρ„Π°ΠΉΠ»ΠΎΠ² Π² ΠΎΠ΄ΠΈΠ½, минимизация этого Ρ„Π°ΠΉΠ»Π° ΠΈ созданиС source map;
  • сбор html Ρ„Π°ΠΉΠ»Π°, пСрСнос ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠ², ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° (сТатиС) ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΎΠΊ ΠΈ автоматичСскоС ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ страниц посрСдством Browser Sync.

ΠšΡ€ΠΎΠΌΠ΅ этого Ρ‡Ρ‚ΠΎΠ±Ρ‹ эти Π·Π°Π΄Π°Ρ‡ΠΈ Π½Π΅ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ исходных Ρ„Π°ΠΉΠ»ΠΎΠ² Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, создадим Π΅Ρ‰Ρ‘ ΠΎΠ΄Π½Ρƒ Π·Π°Π΄Π°Ρ‡Ρƒ "watch". Она Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ измСнСния Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ автоматичСски.

Код Ρ„Π°ΠΉΠ»Π° "gulpfile.js" (ΠΏΡ€ΠΈ использовании Gulp 4):

"use strict"; /* ΠΏΡƒΡ‚ΠΈ ΠΊ исходным Ρ„Π°ΠΉΠ»Π°ΠΌ (src), ΠΊ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΌ Ρ„Π°ΠΉΠ»Π°ΠΌ (build), Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΊ Ρ‚Π΅ΠΌ, Π·Π° измСнСниями ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½ΡƒΠΆΠ½ΠΎ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ (watch) */ var path = { build: { html: "assets/build/", js: "assets/build/js/", css: "assets/build/css/", img: "assets/build/img/", fonts: "assets/build/fonts/" }, src: { html: "assets/src/*.html", js: "assets/src/js/main.js", style: "assets/src/style/main.scss", img: "assets/src/img/**/*.*", fonts: "assets/src/fonts/**/*.*" }, watch: { html: "assets/src/**/*.html", js: "assets/src/js/**/*.js", css: "assets/src/style/**/*.scss", img: "assets/src/img/**/*.*", fonts: "assets/srs/fonts/**/*.*" }, clean: "./assets/build/*" }; /* настройки сСрвСра */ var config = { server: { baseDir: "./assets/build" }, notify: false }; /* ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ gulp ΠΈ ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ */ var gulp = require("gulp"), // ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Gulp webserver = require("browser-sync"), // сСрвСр для Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈ автоматичСского обновлСния страниц plumber = require("gulp-plumber"), // ΠΌΠΎΠ΄ΡƒΠ»ΡŒ для отслСТивания ошибок rigger = require("gulp-rigger"), // ΠΌΠΎΠ΄ΡƒΠ»ΡŒ для ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° содСрТимого ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ sourcemaps = require("gulp-sourcemaps"), // ΠΌΠΎΠ΄ΡƒΠ»ΡŒ для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠ°Ρ€Ρ‚Ρ‹ исходных Ρ„Π°ΠΉΠ»ΠΎΠ² sass = require("gulp-sass"), // ΠΌΠΎΠ΄ΡƒΠ»ΡŒ для компиляции SASS (SCSS) Π² CSS autoprefixer = require("gulp-autoprefixer"), // ΠΌΠΎΠ΄ΡƒΠ»ΡŒ для автоматичСской установки автопрСфиксов cleanCSS = require("gulp-clean-css"), // ΠΏΠ»Π°Π³ΠΈΠ½ для ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ CSS uglify = require("gulp-uglify"), // ΠΌΠΎΠ΄ΡƒΠ»ΡŒ для ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ JavaScript cache = require("gulp-cache"), // ΠΌΠΎΠ΄ΡƒΠ»ΡŒ для ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ imagemin = require("gulp-imagemin"), // ΠΏΠ»Π°Π³ΠΈΠ½ для сТатия PNG, JPEG, GIF ΠΈ SVG ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ jpegrecompress = require("imagemin-jpeg-recompress"), // ΠΏΠ»Π°Π³ΠΈΠ½ для сТатия jpeg pngquant = require("imagemin-pngquant"), // ΠΏΠ»Π°Π³ΠΈΠ½ для сТатия png rimraf = require("gulp-rimraf"), // ΠΏΠ»Π°Π³ΠΈΠ½ для удалСния Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² rename = require("gulp-rename"); /* Π·Π°Π΄Π°Ρ‡ΠΈ */ // запуск сСрвСра gulp.task("webserver", function () { webserver(config); }); // сбор html gulp.task("html:build", function () { return gulp.src(path.src.html) // Π²Ρ‹Π±ΠΎΡ€ всСх html Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ ΠΏΡƒΡ‚ΠΈ.pipe(plumber()) // отслСТиваниС ошибок.pipe(rigger()) // ΠΈΠΌΠΏΠΎΡ€Ρ‚ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ.pipe(gulp.dest(path.build.html)) // Π²Ρ‹ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π½ΠΈΠ΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ².pipe(webserver.reload({ stream: true })); // ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° сСрвСра }); // сбор стилСй gulp.task("css:build", function () { return gulp.src(path.src.style) // ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ main.scss .pipe(plumber()) // для отслСТивания ошибок.pipe(sourcemaps.init()) // ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ sourcemap .pipe(sass()) // scss -> css .pipe(autoprefixer()) // Π΄ΠΎΠ±Π°Π²ΠΈΠΌ прСфиксы.pipe(gulp.dest(path.build.css)) .pipe(rename({ suffix: ".min" })) .pipe(cleanCSS()) // ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ CSS .pipe(sourcemaps.write("./")) // записываСм sourcemap .pipe(gulp.dest(path.build.css)) // Π²Ρ‹Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ Π² build .pipe(webserver.reload({ stream: true })); // ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΈΠΌ сСрвСр }); // сбор js gulp.task("js:build", function () { return gulp.src(path.src.js) // ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Ρ„Π°ΠΉΠ» main.js .pipe(plumber()) // для отслСТивания ошибок.pipe(rigger()) // ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ всС ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π² main.js .pipe(gulp.dest(path.build.js)) .pipe(rename({ suffix: ".min" })) .pipe(sourcemaps.init()) //ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ sourcemap .pipe(uglify()) // ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ js .pipe(sourcemaps.write("./")) // записываСм sourcemap .pipe(gulp.dest(path.build.js)) // ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ».pipe(webserver.reload({ stream: true })); // ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΈΠΌ сСрвСр }); // пСрСнос ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠ² gulp.task("fonts:build", function () { return gulp.src(path.src.fonts) .pipe(gulp.dest(path.build.fonts)); }); // ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΎΠΊ gulp.task("image:build", function () { return gulp.src(path.src.img) // ΠΏΡƒΡ‚ΡŒ с исходниками ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΎΠΊ.pipe(cache(imagemin([ // сТатиС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ imagemin.gifsicle({ interlaced: true }), jpegrecompress({ progressive: true, max: 90, min: 80 }), pngquant(), imagemin.svgo({ plugins: [{ removeViewBox: false }] }) ]))) .pipe(gulp.dest(path.build.img)); // Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΠ° Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² }); // ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° build gulp.task("clean:build", function () { return gulp.src(path.clean, { read: false }) .pipe(rimraf()); }); // очистка кэша gulp.task("cache:clear", function () { cache.clearAll(); }); // сборка gulp.task("build", gulp.series("clean:build", gulp.parallel("html:build", "css:build", "js:build", "fonts:build", "image:build"))); // запуск Π·Π°Π΄Π°Ρ‡ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² gulp.task("watch", function () { gulp.watch(path.watch.html, gulp.series("html:build")); gulp.watch(path.watch.css, gulp.series("css:build")); gulp.watch(path.watch.js, gulp.series("js:build")); gulp.watch(path.watch.img, gulp.series("image:build")); gulp.watch(path.watch.fonts, gulp.series("fonts:build")); }); // Π·Π°Π΄Π°Ρ‡Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ gulp.task("default", gulp.series("build", gulp.parallel("webserver","watch")));

Код Ρ„Π°ΠΉΠ»Π° "gulpfile.js" содСрТит ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½ΠΈΡ… поясняСтся Ρ‡Ρ‚ΠΎ выполняСт Ρ‚ΠΎΡ‚ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ инструкций.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ Π² Gulp выполняСтся ΠΎΡ‡Π΅Π½ΡŒ просто:

// созданиС gulp Π·Π°Π΄Π°Ρ‡ΠΈ (nametask – Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ) gulp.task("nametask", function() { // дСйствия, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Π°... });

Π—Π°Π΄Π°Ρ‡ΠΈ Π² gulp построСны ΠΎΡ‡Π΅Π½ΡŒ просто. Π˜Ρ… каркас дСйствий Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊ:

  • ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· исходных Ρ„Π°ΠΉΠ»ΠΎΠ²;
  • ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ исходныС Π΄Π°Π½Π½Ρ‹Π΅ посрСдством gulp ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ²;
  • ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ (Ρ„Π°ΠΉΠ»Ρ‹) Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ "build".

Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Gulp 3, Ρ‚ΠΎ содСрТимоС Ρ„Π°ΠΉΠ»Π° "gulpfile.js" Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ:

"use strict"; /* ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ для gulp-autoprefixer */ var autoprefixerList = [ "Chrome >= 45", "Firefox ESR", "Edge >= 12", "Explorer >= 10", "iOS >= 9", "Safari >= 9", "Android >= 4.4", "Opera >= 30" ]; /* ΠΏΡƒΡ‚ΠΈ ΠΊ исходным Ρ„Π°ΠΉΠ»Π°ΠΌ (src), ΠΊ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΌ Ρ„Π°ΠΉΠ»Π°ΠΌ (build), Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΊ Ρ‚Π΅ΠΌ, Π·Π° измСнСниями ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½ΡƒΠΆΠ½ΠΎ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ (watch) */ var path = { build: { html: "assets/build/", js: "assets/build/js/", css: "assets/build/css/", img: "assets/build/img/", fonts: "assets/build/fonts/" }, src: { html: "assets/src/*.html", js: "assets/src/js/main.js", style: "assets/src/style/main.scss", img: "assets/src/img/**/*.*", fonts: "assets/src/fonts/**/*.*" }, watch: { html: "assets/src/**/*.html", js: "assets/src/js/**/*.js", css: "assets/src/style/**/*.scss", img: "assets/src/img/**/*.*", fonts: "assets/srs/fonts/**/*.*" }, clean: "./assets/build/*" }; /* настройки сСрвСра */ var config = { server: { baseDir: "./assets/build" }, notify: false }; /* ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ gulp ΠΈ ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ */ var gulp = require("gulp"), // ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Gulp webserver = require("browser-sync"), // сСрвСр для Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈ автоматичСского обновлСния страниц plumber = require("gulp-plumber"), // ΠΌΠΎΠ΄ΡƒΠ»ΡŒ для отслСТивания ошибок rigger = require("gulp-rigger"), // ΠΌΠΎΠ΄ΡƒΠ»ΡŒ для ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° содСрТимого ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ sourcemaps = require("gulp-sourcemaps"), // ΠΌΠΎΠ΄ΡƒΠ»ΡŒ для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠ°Ρ€Ρ‚Ρ‹ исходных Ρ„Π°ΠΉΠ»ΠΎΠ² sass = require("gulp-sass"), // ΠΌΠΎΠ΄ΡƒΠ»ΡŒ для компиляции SASS (SCSS) Π² CSS autoprefixer = require("gulp-autoprefixer"), // ΠΌΠΎΠ΄ΡƒΠ»ΡŒ для автоматичСской установки автопрСфиксов cleanCSS = require("gulp-clean-css"), // ΠΏΠ»Π°Π³ΠΈΠ½ для ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ CSS uglify = require("gulp-uglify"), // ΠΌΠΎΠ΄ΡƒΠ»ΡŒ для ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ JavaScript cache = require("gulp-cache"), // ΠΌΠΎΠ΄ΡƒΠ»ΡŒ для ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ imagemin = require("gulp-imagemin"), // ΠΏΠ»Π°Π³ΠΈΠ½ для сТатия PNG, JPEG, GIF ΠΈ SVG ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ jpegrecompress = require("imagemin-jpeg-recompress"), // ΠΏΠ»Π°Π³ΠΈΠ½ для сТатия jpeg pngquant = require("imagemin-pngquant"), // ΠΏΠ»Π°Π³ΠΈΠ½ для сТатия png rimraf = require("gulp-rimraf"), // ΠΏΠ»Π°Π³ΠΈΠ½ для удалСния Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² rename = require("gulp-rename"); /* Π·Π°Π΄Π°Ρ‡ΠΈ */ // запуск сСрвСра gulp.task("webserver", function () { webserver(config); }); // сбор html gulp.task("html:build", function () { return gulp.src(path.src.html) // Π²Ρ‹Π±ΠΎΡ€ всСх html Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ ΠΏΡƒΡ‚ΠΈ.pipe(plumber()) // отслСТиваниС ошибок.pipe(rigger()) // ΠΈΠΌΠΏΠΎΡ€Ρ‚ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ.pipe(gulp.dest(path.build.html)) // Π²Ρ‹ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π½ΠΈΠ΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ².pipe(webserver.reload({ stream: true })); // ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° сСрвСра }); // сбор стилСй gulp.task("css:build", function () { return gulp.src(path.src.style) // ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ main.scss .pipe(plumber()) // для отслСТивания ошибок.pipe(sourcemaps.init()) // ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ sourcemap .pipe(sass()) // scss -> css .pipe(autoprefixer({ // Π΄ΠΎΠ±Π°Π²ΠΈΠΌ прСфиксы browsers: autoprefixerList })) .pipe(gulp.dest(path.build.css)) .pipe(rename({ suffix: ".min" })) .pipe(cleanCSS()) // ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ CSS .pipe(sourcemaps.write("./")) // записываСм sourcemap .pipe(gulp.dest(path.build.css)) // Π²Ρ‹Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ Π² build .pipe(webserver.reload({ stream: true })); // ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΈΠΌ сСрвСр }); // сбор js gulp.task("js:build", function () { return gulp.src(path.src.js) // ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Ρ„Π°ΠΉΠ» main.js .pipe(plumber()) // для отслСТивания ошибок.pipe(rigger()) // ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ всС ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π² main.js .pipe(gulp.dest(path.build.js)) .pipe(rename({ suffix: ".min" })) .pipe(sourcemaps.init()) //ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ sourcemap .pipe(uglify()) // ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ js .pipe(sourcemaps.write("./")) // записываСм sourcemap .pipe(gulp.dest(path.build.js)) // ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ».pipe(webserver.reload({ stream: true })); // ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΈΠΌ сСрвСр }); // пСрСнос ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠ² gulp.task("fonts:build", function () { return gulp.src(path.src.fonts) .pipe(gulp.dest(path.build.fonts)); }); // ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΎΠΊ gulp.task("image:build", function () { return gulp.src(path.src.img) // ΠΏΡƒΡ‚ΡŒ с исходниками ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΎΠΊ.pipe(cache(imagemin([ // сТатиС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ imagemin.gifsicle({ interlaced: true }), jpegrecompress({ progressive: true, max: 90, min: 80 }), pngquant(), imagemin.svgo({ plugins: [{ removeViewBox: false }] }) ]))) .pipe(gulp.dest(path.build.img)); // Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΠ° Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² }); // ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° build gulp.task("clean:build", function () { return gulp.src(path.clean, { read: false }) .pipe(rimraf()); }); // очистка кэша gulp.task("cache:clear", function () { cache.clearAll(); }); // сборка gulp.task("build", [ "clean:build", "html:build", "css:build", "js:build", "fonts:build", "image:build" ]); // запуск Π·Π°Π΄Π°Ρ‡ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² gulp.task("watch", function () { gulp.watch(path.watch.html, ["html:build"]); gulp.watch(path.watch.css, ["css:build"]); gulp.watch(path.watch.js, ["js:build"]); gulp.watch(path.watch.img, ["image:build"]); gulp.watch(path.watch.fonts, ["fonts:build"]); }); // Π·Π°Π΄Π°Ρ‡Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ gulp.task("default", [ "build", "webserver", "watch" ]);

ΡΠ΅Π½Ρ‚ΡΠ±Ρ€ΡŒ 24 , 2016

Π‘ΡƒΠ΄ΡƒΡ‚ рассмотрСны Ρ‚Π°ΠΊΠΈΠ΅ вопросы: Ρ€Π°Π±ΠΎΡ‚Π° со стилями sass с использованиСм sourcemaps, склСиваниС ΠΈ сТатиС js-Ρ„Π°ΠΉΠ»ΠΎΠ², сборка requirejs с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ rjs, прСпроцСссинг html, очистка ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ², оптимизация ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, поднятиС локального Π²Π΅Π±-сСрвСра ΠΈ Ρ€Π΅ΠΆΠΈΠΌ наблюдСния - watch-таски. Π”ΠΎΠ±Ρ€ΠΎ ΠΏΠΎΠΆΠ°Π»ΠΎΠ²Π°Ρ‚ΡŒ Π² ΡΡ‚Π°Ρ‚ΡŒΡŽ, Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ интСрСсного!
P.S. ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π° ΠΌΠ½ΠΎΠ³ΠΎ, поэтому ΡΡ‚Π°Ρ‚ΡŒΡ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Π±ΠΈΡ‚Π° Π½Π° 3 части: основы сборки ΠΈ организация ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, написаниС тСстового прилоТСния Π½Π° Backbone + Require.js ΠΈ собствСнно сборка с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ gulp.

Π—Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½Π° сборка Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄Π°.

Один ΠΈΠ· самых Π²Π°ΠΆΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ - это ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Π Π°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π° мноТСство Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ…, Π² ΠΈΠ΄Π΅Π°Π»Π΅ слабосвязанных ΠΌΠ΅ΠΆΠ΄Ρƒ собой кусочков-ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ. Π­Ρ‚ΠΎ касаСтся Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ javascript-ΠΊΠΎΠ΄Π°. Π­Ρ‚ΠΎ относится ΠΈ ΠΊ стилям, ΠΈ html-шаблонам, ΠΊ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ структура простого прилоТСния, написанного Π½Π° Backbone + Require.

И это нСбольшой тСстовый ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сотни ΠΈ тысячи. Π—Π°ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π΄Π΅Π»Π°Ρ‚ΡŒ сотни http-запросов ΠΏΠΎ мСньшСй ΠΌΠ΅Ρ€Π΅ Π½Π΅Π³ΡƒΠΌΠ°Π½Π½ΠΎ. ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ максимально Π±Ρ‹ΡΡ‚Ρ€ΡƒΡŽ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ написанного Π½Π°ΠΌΠΈ сСрвиса. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΎΠ΄Π½Π° ΠΈΠ· самых Π²Π°ΠΆΠ½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡ инструмСнтов сборки - это минификация, ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ количСства ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ², склСиваниС ΠΈΡ… Π² Π±Π°Π½Π΄Π»Ρ‹. На Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΊΡ€Π°Ρ‚ΠΊΡƒΡŽ структуру, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²ΠΎΡ‚ Ρ‚Π°ΠΊΡƒΡŽ:

Π Π°Π·Π½ΠΈΡ†Π° Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π·Π°ΠΌΠ΅Ρ‚Π½Π°: вмСсто дСсятков Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ index.html, ΠΎΠ΄ΠΈΠ½ css-Ρ„Π°ΠΉΠ», ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΈ сТатыС изобраТСния Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠ΅, хотя Π½Π° ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚Π΅ этого ΠΈ Π½Π΅ Π²ΠΈΠ΄Π½ΠΎ:-)

А Ρ‚Π°ΠΊΠΆΠ΅ самоС интСрСсноС: Π² ΠΏΠ°ΠΏΠΊΠ΅ js ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ всСго 3 сТатых Ρ„Π°ΠΉΠ»Π°.
P.S. ΠŸΠΎΡ‡Π΅ΠΌΡƒ Ρ‚Ρ€ΠΈ, Π° Π½Π΅ ΠΎΠ΄ΠΈΠ½, расскаТу ΠΏΠΎΠ·ΠΆΠ΅.
Π—Π°ΠΌΠ΅Ρ‡Ρƒ, Ρ‡Ρ‚ΠΎ это Ρ€Π΅Π°Π»ΡŒΠ½Π°Ρ структура тСстового прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ вскорС напишСм.

Π― описал лишь ΠΎΠ΄Π½Ρƒ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ использования инструмСнтов сборки, Π½ΠΎ ΠΎΠ½Π° ΡƒΠΆΠ΅ достаточна, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ gulp, grunt, webpack ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ Π² своих ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния, пишСм Π»ΠΈ ΠΌΡ‹ Π³Ρ€ΠΎΠΌΠ°Π΄Π½Ρ‹ΠΉ сСрвис, нСбольшоС SPA (ΠΊΠ°ΠΊ Π² нашСй ΡΡ‚Π°Ρ‚ΡŒΠ΅) ΠΈΠ»ΠΈ landing page. ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ сборки ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ для всСх ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ лишь Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·ΠΈΠ΅ΠΌ Π·Π°Π΄Π°Ρ‡ ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠ² ΠΊ ΠΈΡ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ. Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ создадим Ρ‚Π°ΠΊΡƒΡŽ структуру, которая ΠΌΠΎΠΆΠ΅Ρ‚ сколь ΡƒΠ³ΠΎΠ΄Π½ΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒΡΡ Π² дальнСйшСм, Π½ΠΎ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ всСгда Π±ΡƒΠ΄Π΅Ρ‚ аккуратная стопка Ρ„Π°ΠΉΠ»ΠΎΠ², готовая ΠΊ Π²Ρ‹Π»ΠΈΠ²ΠΊΠ΅ Π½Π° ваш ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½ - Π±ΠΎΠ΅Π²ΠΎΠΉ сайт.

Как ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Ρ‚Π°ΠΊΠΎΠΉ: Π΅ΡΡ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π» с дСвСлопСрскими Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, Π΅ΡΡ‚ΡŒ с собранными ΠΈ всС ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅, Ρ‡Ρ‚ΠΎ это Π΄ΠΎΠ±Ρ€ΠΎ обслуТиваСт. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π² ΠΊΠΎΡ€Π½Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° 2 ΠΏΠ°ΠΏΠΊΠΈ: src ΠΈ build. Π’ src ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² src ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ Ρ€Π°Π·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒΡΡ. На ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚Π΅ Π²Ρ‹ΡˆΠ΅, Ρ‚Π°ΠΌ, Π³Π΄Π΅ ΠΏΠ°Ρ€Π° дСсятков Ρ„Π°ΠΉΠ»ΠΎΠ², Π’Ρ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ содСрТимоС ΠΏΠ°ΠΏΠΊΠΈ src нашСго тСстового ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. А Ρ‡ΡƒΡ‚ΡŒ Π½ΠΈΠΆΠ΅ нСсколько Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ· ΠΏΠ°ΠΏΠΊΠΈ build. Она формируСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ автоматичСски, инструмСнтами сборки, Π½ΠΈΡ‡Π΅Π³ΠΎ самим Ρ‚Π°ΠΌ ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ. ВсС Ρ€Π°Π²Π½ΠΎ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ сборкС Π΅Π΅ содСрТимоС затираСтся Π½ΠΎΠ²Ρ‹ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ (Π° Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ development ΠΏΠ°ΠΏΠΊΠΈ build Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅Ρ‚ - удаляСтся, Π΄Π°Π±Ρ‹ Π½Π΅ ΠΌΠΎΠ·ΠΎΠ»ΠΈΡ‚ΡŒ Π³Π»Π°Π·Π°)

ΠšΡ€ΠΎΠΌΠ΅ src ΠΈ build Π² ΠΊΠΎΡ€Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π»Π΅ΠΆΠ°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ package.json, gulpfile.js, ΠΏΠ°ΠΏΠΊΠ° node_modules ΠΈ ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ, .gitignore (Ссли Π’Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Π³ΠΈΡ‚ΠΎΠΌ). Π£ мСня Π΅Ρ‰Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΏΠ°ΠΏΠΊΡƒ logs - это ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ apache ΠΈ давняя ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡ΠΊΠ° Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π² Π΅Π³ΠΎ ΠΆΠ΅ ΠΏΠ°ΠΏΠΊΠ΅, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΠ² Π΅Π΅ ΠΈΠ· рСпозитория Π³ΠΈΡ‚Π°:-)

Π’ΠΎΡ‚ Ρ‚Π°ΠΊ выглядит структура ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ:

По содСрТимому build, Π΄ΡƒΠΌΠ°ΡŽ, вопросов Π½Π΅Ρ‚, ΠΏΠΎ src поясню ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅:

  • 1. html - index.html, ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ индСксный Ρ„Π°ΠΉΠ» ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π½Π΅ сразу Π² ΠΊΠΎΡ€Π½Π΅ src? ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΈΡ‚ΡŒΡΡ ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ gulp-ΠΎΠΌ. Каким ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΡƒΠ·Π½Π°Π΅ΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ·ΠΆΠ΅, ΠΊΠΎΠ³Π΄Π° Π²ΠΏΠ»ΠΎΡ‚Π½ΡƒΡŽ займСмся сборкой.
  • 2. img - изобраТСния, Π½Π΅ сТатыС, ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅
  • 3. js - вся javascript-Π΄Π²ΠΈΠΆΡƒΡ…Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ прСдставлСния Backbone
  • 4. lib - сторонниС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π²Ρ€ΠΎΠ΄Π΅ backbone.js, require.js, lodash.js ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΡ…
  • 5. scripts - js-скрипты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ Π½Π° Π±ΠΎΠ΅Π²ΠΎΠΌ сайтС, Π½ΠΎ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Π˜ΠΌΠ΅ΡŽΡ‚ΡΡ Π² Π²ΠΈΠ΄Ρƒ ΠΊΠΎΠ΄Ρ‹ для Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠΈ, Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… экспСримСнтов ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΡ… ΠΌΠ°Ρ€ΠΊΠ΅Ρ‚ΠΈΠ½Π³ΠΎΠ²Ρ‹Ρ… ΡˆΡ‚ΡƒΠΊ.
  • 6. styles - sass-Ρ„Π°ΠΉΠ»Ρ‹ со стилями. Π’ эту ΠΆΠ΅ ΠΏΠ°ΠΏΠΊΡƒ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒΡΡ собранный css-Ρ„Π°ΠΉΠ» (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ€Π΅ΠΆΠΈΠΌΠ° Π΄Π΅Π²Π΅Π»ΠΎΠΏΠΌΠ΅Π½Ρ‚Π°)
  • 7. tpl - html-ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ прСдставлСниями Backbone с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ»Π°Π³ΠΈΠ½Π° require.js text

Π’Π½Π΅ΡˆΠ½ΠΈΠΉ Π²ΠΈΠ΄ тСстового прилоТСния довольно нСказистый. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ подобная Ρ…Ρ€Π΅Π½ΡŒ дСлаСтся ΠΏΠ°Ρ€ΠΎΠΉ строк html ΠΈ css-ΠΊΠΎΠ΄Π° Π±Π΅Π· Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ js-Ρ„Π°ΠΉΠ»Π°.
Но ΠΌΡ‹ прСслСдуСм Ρ†Π΅Π»ΡŒ Π½Π΅ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ ΠΊΡ€Π°ΡΠΈΠ²ΡƒΡŽ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ, Π° ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½Π°Π΄Π΅ΠΆΠ½ΡƒΡŽ структуру ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ большС аспСктов сборки. Когда ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ разрастСтся Π΄ΠΎ сотни Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΌΡ‹ ΡƒΠΆΠ΅ Π±ΡƒΠ΄Π΅ΠΌ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΊ этой напасти ΠΈ Π»Π΅Π³ΠΊΠΎ управимся с Π²ΠΎΠ·Ρ€ΠΎΡΡˆΠΈΠΌΠΈ объСмами. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ нСсмотря Π½Π° ΠΌΠ°Π»ΠΎΡΡ‚ΡŒ ΠΈ внСшнюю ΡƒΠ±ΠΎΠ³ΠΎΡΡ‚ΡŒ тСстового прилоТСния, ΠΌΡ‹ ΡƒΠ·Π½Π°Π΅ΠΌ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ сборки для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΈ слоТных ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ².

КакиС Π·Π°Π΄Π°Ρ‡ΠΈ сборки ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠΌ.

Напомню, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈΡΡŒ ΠΎ Π΄Π²ΡƒΡ… Ρ€Π΅ΠΆΠΈΠΌΠ°Ρ… сборки: development ΠΈ production. ВсС наши Π·Π°Π΄Π°Ρ‡ΠΈ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ, помня ΠΎΠ± этих Π΄Π²ΡƒΡ… Ρ€Π΅ΠΆΠΈΠΌΠ°Ρ…. НС всС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ Π² процСссС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, ΠΈ Π½Π΅ всС Π² сборкС для ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π°.

Π’ΠΎΡ‚ список Ρ‚ΠΎΠ³ΠΎ, Ρ‡Π΅ΠΌ ΠΌΡ‹ займСмся послС написания тСстового прилоТСния:

  • 1. ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΏΠ°ΠΏΠΎΠΊ ΠΎΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ сборки
  • 2. Π‘Π±ΠΎΡ€ΠΊΠ° css ΠΈΠ· sass-Ρ„Π°ΠΉΠ»ΠΎΠ², со сТатиСм ΠΈ Π±Π΅Π·
  • 3. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ sourcemaps ΠΊ стилям, Π·Π°ΠΎΠ΄Π½ΠΎ ΠΏΠΎΠΊΠ°ΠΆΡƒ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Π·Π°Ρ‡Π΅ΠΌ это Π½ΡƒΠΆΠ½ΠΎ
  • 4. Π‘Π±ΠΎΡ€ΠΊΠ° js-Π±Π°Π½Π΄Π»Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ requirejs
  • 5. Π‘ΠΊΠ»Π΅ΠΈΠ²Π°Π½ΠΈΠ΅ ΠΈ сТатиС ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… js-Ρ„Π°ΠΉΠ»ΠΎΠ² (Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠΈ)
  • 6. ΠŸΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΈΠ½Π³ html
  • 7. ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ ΠΈ сТатиС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ
  • 8. ΠŸΠΎΠ΄Π½ΡΡ‚ΠΈΠ΅ локального Π²Π΅Π±-сСрвСра
  • 9. Π—Π°Π΄Π°Ρ‡ΠΈ наблюдСния Π·Π° Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π΄Π΅Π²Π΅Π»ΠΎΠΏΠΌΠ΅Π½Ρ‚Π° - watch-таски
  • 10. Π‘Π±ΠΎΡ€ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡ Π² ΠΊΡƒΡ‡Ρƒ - ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹Π΅ таски для production-сборки ΠΈ development-Ρ€Π°Π±ΠΎΡ‚Ρ‹

Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ порассуТдали, Π·Π°Ρ‡Π΅ΠΌ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½ΡƒΠΆΠ½Π° сборка Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄Π°, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈΡΡŒ со структурой ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΡ‚ сборки ΠΈ Π² ΠΎΠ±Ρ‰ΠΈΡ… Ρ‡Π΅Ρ€Ρ‚Π°Ρ… ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ ΠΏΡ€ΠΎ тСстовоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ части ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΌΡ‹ займСмся написаниСм ΠΏΡ€ΠΎΡΡ‚Π΅Π½ΡŒΠΊΠΎΠ³ΠΎ Backbone-прилоТСния Π² связкС с Require.js. Если Π’Ρ‹ Π½Π΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с Backbone ΠΈ/ΠΈΠ»ΠΈ Require.js, Ρ‚ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ ΡΡ‚Ρ€Π°ΡˆΠ½ΠΎΠ³ΠΎ Π½Π΅Ρ‚. БобствСнно Backbone-овского ΠΊΠΎΠ΄Π° Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΌΠ°Π»ΠΎ. Π’Ρ‹ Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ вмСсто Π½Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±ΠΈΠΌΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ ΠΈΠ»ΠΈ просто ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π½Π° javascript/jquery ΠΈ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π» настройки requirejs.

Π”Π°Π½Π½Ρ‹ΠΉ ΠΌΠ°Π½ΡƒΠ°Π» содСрТит описаниС ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΈ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… front-end инструмСнтов. Π’Ρ‹ смоТСтС ΡƒΠ·Π½Π°Ρ‚ΡŒ процСсс установки инструмСнтов ΠΈ основныС ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½ΠΈΠΌΠΈ.

NPM

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π’ процСссС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° часто приходится Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ сторонниС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ поиск Π½ΡƒΠΆΠ½ΠΎΠΉ зависимости, ΡΠΊΠ°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ, Ρ€Π°ΡΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Π°Ρ€Ρ…ΠΈΠ² ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. ΠŸΠ°ΠΊΠ΅Ρ‚Π½Ρ‹Π΅ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρ‹ ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½ΡƒΡŽ Ρ€ΡƒΡ‚ΠΈΠ½Π½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ.

ΠŸΠ°ΠΊΠ΅Ρ‚Π½Ρ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ – ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ обСспСчСниС, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π΅ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ процСссом установки, удалСния, настройки ΠΈ обновлСния Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ².

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ сторонних Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ с использованиСм ΠΏΠ°ΠΊΠ΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° замСняСтся ΠΏΠ°Ρ€ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅.

Одним ΠΈΠ· ΠΏΠ°ΠΊΠ΅Ρ‚Π½Ρ‹Ρ… ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π²ΠΎ frontend-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… являСтся NPM.

npm (Node.js Package Manager) - ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², входящий Π² состав Node.js. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для скачивания ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΈΠ· ΠΎΠ±Π»Π°Ρ‡Π½ΠΎΠ³ΠΎ сСрвСра npm, Π»ΠΈΠ±ΠΎ для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Π½Π° этот сСрвСр.

ΠžΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ сайт

Начало Ρ€Π°Π±ΠΎΡ‚Ρ‹

Для установки npm Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ NodeJS (npm Π±ΡƒΠ΄Π΅Ρ‚ автоматичСски установлСн): https://nodejs.org/en/.

ИспользованиС

Установка ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²

ΠŸΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ называСтся ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько JavaScript-Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… собой ΠΊΠ°ΠΊΡƒΡŽ-Ρ‚ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ ΠΈΠ»ΠΈ инструмСнт. Для установки ΠΏΠ°ΠΊΠ΅Ρ‚Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ npm Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

Npm install <Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π°>

Для глобальной установки ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ»ΡŽΡ‡ -g. ПослС установки ΠΏΠ°ΠΊΠ΅Ρ‚ вмСстС с исходниками находится Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ node_modules/.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° вСрсии

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ npm, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

Настройка Ρ„Π°ΠΉΠ»Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

Π€Π°ΠΉΠ» package.json содСрТит Π² сСбС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ вашСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ: Π½Π°Π·Π²Π°Π½ΠΈΠ΅, вСрсия, зависимости ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅. Π›ΡŽΠ±Π°Ρ дирСктория, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΅ΡΡ‚ΡŒ этот Ρ„Π°ΠΉΠ», интСрпрСтируСтся ΠΊΠ°ΠΊ Node.js-ΠΏΠ°ΠΊΠ΅Ρ‚.

Для создания Ρ„Π°ΠΉΠ»Π° package.json Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

Npm init

ПослС этого Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅.

Π’ Π΄Π°Π½Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ наимСнования ΠΈ вСрсии всСх ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ npm install ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ всС ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ находятся Π² package.json .

Для установки Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΈ автоматичСским сохранСниСм Π² Ρ„Π°ΠΉΠ»Π΅ package.json ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π°:

Npm install<Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π°> --save-dev

ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹

Yarn

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ

  • Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π²Π΅Π±-сСрвСра ΠΈ автоматичСская ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° страницы Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ ΠΏΡ€ΠΈ сохранСнии ΠΊΠΎΠ΄Π°, слСТСниС Π·Π° измСнСниями Π² Ρ„Π°ΠΉΠ»Π°Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.
  • ИспользованиС Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… JavaScript, CSS ΠΈ HTML прСпроцСссоров (CoffeeScript, Less, Sass, Stylus, Jade ΠΈ Ρ‚.Π΄.).
  • ΠœΠΈΠ½ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ CSS ΠΈ JS ΠΊΠΎΠ΄Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅, оптимизация ΠΈ конкатСнация ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π² ΠΎΠ΄ΠΈΠ½.
  • АвтоматичСскоС созданиС Π²Π΅Π½Π΄ΠΎΡ€Π½Ρ‹Ρ… прСфиксов (приставок ΠΊ названию CSS свойства, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΠΈ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠ² для нСстандартных свойств) для CSS.
  • Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΈ ΠΏΠ°ΠΏΠΊΠ°ΠΌΠΈ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° – созданиС, ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅, ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅.
  • Запуск ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ выполнСния Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы.
    Π Π°Π±ΠΎΡ‚Π° с изобраТСниями – сТатиС, созданиС спрайтов, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² (png, jpg, svg ΠΈ Π΄Ρ€.).
  • Π”Π΅ΠΏΠ»ΠΎΠΉ (ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° Π½Π° внСшний сСрвСр) ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΏΠΎ FTP, SFTP ΠΈ Ρ‚. Π΄.
    ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈ использованиС Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Π±Π΅Π·Π³Ρ€Π°Π½ΠΈΡ‡Π½ΠΎ большого количСства Node.js ΠΈ Gulp ΡƒΡ‚ΠΈΠ»ΠΈΡ‚, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΈ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ².
  • Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΊΠ°Ρ€Ρ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ автоматизация Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ€ΡƒΡ‡Π½ΠΎΠ³ΠΎ Ρ‚Ρ€ΡƒΠ΄Π°.

Начало Ρ€Π°Π±ΠΎΡ‚Ρ‹

Π’ систСмС Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ установлСны NodeJS ΠΈ npm.

Π¨Π°Π³ 1: Для глобальной установки GulpJS с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°ΠΊΠ΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° npm Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

Npm install gulp -g

Π¨Π°Π³ 2: НСобходимо ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ для прилоТСния:

Npm install --save-dev gulp

ΠŸΠΎΠ΄Π³Ρ€ΡƒΠ·ΠΊΠ° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΏΡ€ΠΈ сборкС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Ρ‚Π°ΠΊΠΆΠ΅ осущСствляСтся c ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ npm ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:

Npm install <Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½Π°> --save-dev

ВсС установлСнныС ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ находятся Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ node_modules/ .

ИспользованиС

Π¨Π°Π³ 1: Π‘ΠΏΠ΅Ρ€Π²Π° Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ gulp ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ. Для этого Π² Ρ„Π°ΠΉΠ»Π΅ gulpfile.js прописываСм строчку:

Var gulp = require("gulp");

Ѐункция require() позволяСт ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ ΠΈΠ· ΠΏΠ°ΠΏΠΊΠΈ node_modules/.

Π¨Π°Π³ 2: Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ gulp ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ таски для сборки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°:

Gulp.task("exampleTask", function() {});

ΠœΠ΅Ρ‚ΠΎΠ΄ task ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°: Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с Ρ‚Π΅Π»ΠΎΠΌ таски.
Π”Π°Π½Π½ΡƒΡŽ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ ΡƒΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ. Для этого Π² консоли прописываСм:

Gulp exampleTask

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

НиТС прСдставлСн Π±ΠΎΠ»Π΅Π΅ слоТный ΠΏΡ€ΠΈΠΌΠ΅Ρ€ инструкции:

Gulp.task("exampleTask", function () { return gulp.src("source-files") .pipe(plugin()) .pipe(gulp.dest("folder")); });

Π Π°Π·Π±Π΅Ρ€Π΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

  • gulp.src – Π²Ρ‹Π±ΠΎΡ€ΠΊΠ° исходных Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠΌ;
  • .pipe(plugin()) – Π²Ρ‹Π·ΠΎΠ² Gulp ΠΏΠ»Π°Π³ΠΈΠ½Π° для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ„Π°ΠΉΠ»Π°;
  • .pipe(gulp.dest(β€˜folder’)) – Π²Ρ‹Π²ΠΎΠ΄ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ„Π°ΠΉΠ»Π° Π² ΠΏΠ°ΠΏΠΊΡƒ назначСния.

Маски Ρ„Π°ΠΉΠ»ΠΎΠ²

Ѐункция gulp.src ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° маску Ρ„Π°ΠΉΠ»ΠΎΠ². ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ масок:

  • ./ – тСкущая дирСктория;
  • ../ – Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠ°Ρ дирСктория;
  • js/index.js – Ρ„Π°ΠΉΠ» index.js Π² ΠΏΠ°ΠΏΠΊΠ΅ js;
  • js/*.js – всС Ρ„Π°ΠΉΠ»Ρ‹ с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ js Π² ΠΏΠ°ΠΏΠΊΠ΅ js;
  • js/**/*.js – всС Ρ„Π°ΠΉΠ»Ρ‹ с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ js Π² ΠΏΠ°ΠΏΠΊΠ΅ js ΠΈ Π² Π΅Π΅ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ…;
  • !js/*.js – ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ js Π² ΠΏΠ°ΠΏΠΊΠ΅ js.

ΠŸΠΎΡ‚ΠΎΠΊΠΈ

ИспользованиС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² являСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π²Π°ΠΆΠ½Π΅ΠΉΡˆΠΈΡ… прСимущСств GulpJS.

ΠŸΠΎΡ‚ΠΎΠΊΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΉ, каТдая ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… выполняСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ дСйствия с этими Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.

Ѐункция gulp.src() создаСт ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… Ρ„Π°ΠΉΠ»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹ Π΅ΠΉ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. Π”Π°Π»Π΅Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ pipe выстраиваСтся ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ пСрСдаСтся ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Π”Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° пСрСдаСтся ΠΏΠ»Π°Π³ΠΈΠ½, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ способом ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

НиТС прСдставлСн ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ сторонниС ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ gulp-jshint ΠΈ gulp-concat, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² gulpfile.js.

Ѐункция gulp.src Π±Π΅Ρ€Π΅Ρ‚ Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΠΎ маскС js/*.js . ЗапускаСт JSHint ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. Π—Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΡŽ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ Π² ΠΊΠΎΠ½Ρ†Π΅ сохраняСт ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» послС ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠΈ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ dist/ .

Gulp.task("example", function () { return gulp.src("js/*.js") .pipe(jshint()) .pipe(concat("index.js")) .pipe(gulp.dest("dist")); });

Π‘Ρ‚ΠΎΡ€ΠΎΠ½Π½ΠΈΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования сторонних ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ². Для этого создадим ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² js:

Π¨Π°Π³ 1: Π‘ΠΏΠ΅Ρ€Π²Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΠ»Π°Π³ΠΈΠ½ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ require:

Var concat = require("gulp-concat");

Π¨Π°Π³ 2: Π—Π°Ρ‚Π΅ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ таск для ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ js находящихся Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ js/ . Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠΈΠΉΡΡ Ρ„Π°ΠΉΠ» помСщаСтся Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ dist/js:

Gulp.task("concat", function () { return gulp.src("js/*.js") .pipe(concat("index.js")) .pipe(gulp.dest("dist/js")); });

Gulp concat

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ информация

Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ таск, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΡ… тасков.

Gulp.task("build", ["html", "css"]);

ΠšΡ€ΠΎΠΌΠ΅ этого сущСствуСт ΠΌΠ΅Ρ‚ΠΎΠ΄ watch для наблюдСния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Ρ„Π°ΠΉΠ»Π°Ρ…:

Gulp.watch("маска Ρ„Π°ΠΉΠ»ΠΎΠ² для наблюдСния", ["Π½Π°Π·Π²Π°Π½ΠΈΠ΅ таски, которая выполнится ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²"]);

Π’ gulpfile.js ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½Ρ‹ΠΉ таск:

Gulp.task("default", ["task1", "task2"]);

Π”Π°Π½Π½Ρ‹ΠΉ таск запускаСтся ΠΈΠ· консоли ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹

  • gulp-autoprefixer – автоматичСски расставляСт прСфиксы ΠΊ CSS свойствам;
  • gulp-browser-sync – создаСт ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, послС Ρ‡Π΅Π³ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ Π°Π²Ρ‚ΠΎΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ страницы ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ клиСнтских ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ сСрвСрных Ρ„Π°ΠΉΠ»ΠΎΠ²;
  • gulp-uncss – оптимизация CSS Ρ„Π°ΠΉΠ»ΠΎΠ². Плагин Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ HTML ΠΊΠΎΠ΄ ΠΈ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ всС Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΈ ΠΏΡ€ΠΎΠ΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ стили;
  • gulp-csso – CSS ΠΌΠΈΠ½ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€;
  • gulp-htmlmin – простой HTML ΠΌΠΈΠ½ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€;
  • gulp-htmlhint – HTML Π²Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€;
  • gulp-uglify – JavaScript ΠΌΠΈΠ½ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€;
  • gulp-concat – конкатСнация Ρ„Π°ΠΉΠ»ΠΎΠ²;
  • gulp-webserver – позволяСт ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ сСрвСр;
  • gulp-jshint – ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° качСства JS ΠΊΠΎΠ΄Π°;
  • gulp-jasmine – запуск jasmine тСстов;
  • gulp-jsdoc – гСнСрация JSDoc Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

Π‘ ΠΏΠΎΠ»Π½Ρ‹ΠΌ списком Gulp-ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ ΠΏΠΎ ссылкС:
http://gulpjs.com/plugins/

ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹

GruntJS

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ

  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° асинхронного тСстирования.
  • Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»Π΅ΠΉ (observer) Π½Π° Ρ€Π°Π·Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹.

Начало Ρ€Π°Π±ΠΎΡ‚Ρ‹

Для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Jasmine ΠΊ своСму ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ Π½Π° Π³Π»Π°Π²Π½ΡƒΡŽ HTML-страницу:

  • lib/jasmine-*/jasmine.js - сам Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ;
  • lib/jasmine-*/jasmine-html.js - ΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Π² Π²ΠΈΠ΄Π΅ HTML;
  • lib/jasmine-*/jasmine.css - внСшний Π²ΠΈΠ΄ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° выполнСния тСстов;
  • SpecRunner.html - Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ слСдуСт ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ для запуска тСстов.

Бинхронизация с инструмСнтами

GulpJS

Jasmine ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² сборку ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π° GulpJS:

Π¨Π°Π³ 1: Π’Π½Π°Ρ‡Π°Π»Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ»Π°Π³ΠΈΠ½ gulp-jasmine:

Npm install gulp-jasmine --save-dev

Π¨Π°Π³ 2: Π—Π°Ρ‚Π΅ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΠ»Π°Π³ΠΈΠ½ Π² Ρ„Π°ΠΉΠ»Π΅ сборки ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ таску запуска тСстов:

Var jasmine = require("gulp-jasmine"); gulp.task("jasmine", function() { gulp.src("Ρ„Π°ΠΉΠ»Ρ‹ тСстов") .pipe(jasmine()); });

KarmaJS

(Π² ΠΊΠΎΠ½Ρ†Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ описана Ρ€Π°Π±ΠΎΡ‚Π° с этим инструмСнтом)

Для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Jasmine Π² KarmaJS Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ:

Π¨Π°Π³ 1: Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ KarmaJS:

Npm install -g karma-cli

Π¨Π°Π³ 2: Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для запуска тСстов написанных Π½Π° Jasmine Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ… Chrome ΠΈ PhantomJS:

Npm install karma-jasmine karma-chrome-launcher karma-phantomjs-launcher

Π¨Π°Π³ 3: Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ сам Jasmine:

Npm install -g jasmine

Π¨Π°Π³ 4: Π’ Ρ„Π°ΠΉΠ»Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ karma ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ ΠΈ ΠΏΡ€ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡƒΡ‚ΡŒ ΠΊ тСстам.

ИспользованиС

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова

  • describe – ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π°Π±ΠΎΡ€Π° тСстов;
  • it – ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ тСста;
  • expect – ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ΡΡ Π² тСстС.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ describe ΠΈ it ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°: ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ – Π½Π°Π·Π²Π°Π½ΠΈΠ΅, Π²Ρ‚ΠΎΡ€ΠΎΠΉ – функция с ΠΊΠΎΠ΄ΠΎΠΌ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ тСста

describe(β€œΠ½Π°Π·Π²Π°Π½ΠΈΠ΅ Π½Π°Π±ΠΎΡ€Π° тСстов”, function () { it(β€œΠ½Π°Π·Π²Π°Π½ΠΈΠ΅ тСста”, function () { expect(2+2).toBe(4); }); });

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ²

  • expect().toBe() – ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π½Π° равСнство (β€˜===’);
  • expect().not.toBe() – ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π½Π° равСнство (β€˜!==’);
  • expect().toEqual() – ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° равСнство ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π²ΠΊΠ»ΡŽΡ‡Π°Ρ содСрТимоС;
  • expect().toBeDefined() – ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° сущСствованиС;
  • expect().toBeUndefined() – ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° нСсущСствованиС;
  • expect().toBeNull() – ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π½Π° null;
  • expect().toBeTruthy() – ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΠΈΡΡ‚ΠΈΠ½Π½ΠΎΡΡ‚ΡŒ;
  • expect().toBeFalsy() – ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ;
  • expect().toBeLessThan() – ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ мСньшС Ρ‡Π΅ΠΌ;
  • expect().toBeGreaterThan() – ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ большС Ρ‡Π΅ΠΌ;
  • expect().toBeCloseTo() – ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π±Π»ΠΈΠ·ΠΊΠΎ ΠΊ числу;
  • expect().toMatch() – ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° соотвСтствиС рСгулярному Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ;
  • expect().toContain() – ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° содСрТаниС Π² массивС;
  • expect().toThrow() – ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π²Ρ‹Π·ΠΎΠ²Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ;
  • expect().toHaveBeenCalled() – ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π’ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Π½ΠΈΠ΅ копирования ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Π»ΠΎΠ³ΠΈΠΊΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ Π² тСстах, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ beforeEach/afterEach . Они Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ соотвСтствСнно ΠΏΠ΅Ρ€Π΅Π΄/послС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ тСста.

Для тСстирования асинхронных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ runs ΠΈ waitsFor .

  • runs – ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π°ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для выполнСния;
  • waitsFor – ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚Ρ€ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°: ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ – функция, которая Π΄ΠΎΠ»ΠΆΠ½Π° Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ true, Ссли асинхронный Π²Ρ‹Π·ΠΎΠ² Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ runs Π±Ρ‹Π» Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½, Π²Ρ‚ΠΎΡ€ΠΎΠΉ – сообщСниС ΠΎΠ± ошибкС, Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ – ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π² миллисСкундах.
describe(β€œΠΏΡ€ΠΈΠΌΠ΅Ρ€ тСстирования асинхронного вызова”, function () { var result = 0; function asyncFunc() { setTimeout(function() { result = result + 2; }, 500); } it(β€œΠ½Π°Π·Π²Π°Π½ΠΈΠ΅ тСста”, function () { runs(function () { asyncFunc(); }); waitsFor(function() { return result === 2; }, β€œΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΎΡΡŒβ€, 2000); }); });

ΠΠ°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»ΠΈ

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ отслСТивания Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ производится с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ spyOn . Данная функция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°: ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ – ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ осущСствляСтся Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π²Ρ‚ΠΎΡ€ΠΎΠΉ – имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ.

If(β€œΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π²Ρ‹Π·ΠΎΠ²Π° функции”, function () { spyOn(exampleObject, "exampleFunction"); exampleObject.exampleFunction(); expect(exampleObject.exampleFunction).toHaveBeenCalled(); });

ΠŸΡ€ΠΈ тСстировании с использованиСм spyOn ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ количСство Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², ΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

Для создания Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Π΅Π· Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ createSpy . Ѐункция createSpy ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ.

If(β€œΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π²Ρ‹Π·ΠΎΠ²Π° функции”, function () { var example = createSpy("EXAMPLE"); example(β€œparam1”, β€œparam2”); expect(example.identify).toHaveBeenCalledWith(β€œparam1”, β€œparam2”); expect(example.calls.length).toEqual(1); });

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π·Π°Π³Π»ΡƒΡˆΠΊΠΈ осущСствляСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ createSpyObj . Π’ качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² createSpyObj ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ имя ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ массив строк, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΉΡΡ списком ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π·Π°Π³Π»ΡƒΡˆΠΊΠΈ.

ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹

Mocha

ИспользованиС

ГСнСрация Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ производится ΠΈΠ· ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² исходного ΠΊΠΎΠ΄Π°.

Π’ нашС врСмя сборка front-end’a являСтся ΡƒΠΆΠ΅ Π½Π΅ΠΊΠΈΠΌ стандартом Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ сайтов ΠΈ Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Π•ΡΡ‚ΡŒ мноТСство Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² сборки рСсурсов сайта ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ для сСбя сам, ΠΊΠ°ΠΊΠΈΠ΅ инструмСнты для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Π― ΠΆΠ΅ Ρ…ΠΎΡ‡Ρƒ ΠΏΠΎΠ²Π΅Π΄Π°Ρ‚ΡŒ ΠΎ процСссС сборкС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° Π·Π°Π΄Π°Ρ‡, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΎΡ‚Π΄Π°Π» ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΠ΅, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ GULP.

Π’ Π΄Π²ΡƒΡ… слова ΠΎ Gulp

Gulp β€” это ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ Π·Π°Π΄Π°Ρ‡ (ΠΊΠ°ΠΊ grunt) для сборки рСсурсов ΠΈ выполнСния Ρ€ΡƒΡ‚ΠΈΠ½Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡. Он прост Π² использовании. Π­Ρ‚ΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΡˆΠ²Π΅ΠΉΡ†Π°Ρ€ΡΠΊΠΈΠΉ Π½ΠΎΠΆ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ мноТСство Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. А самоС Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΎΠ½ быстр.

Установка Gulp

ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго для Ρ€Π°Π±ΠΎΡ‚Ρ‹ gulp Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ node.js

ΠΠ°Ρ…ΠΎΠ΄ΡΡΡŒ Π² ΠΊΠΎΡ€Π½Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ для npm.

Npm init

Установим gulp ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π΅Π³ΠΎ Π² зависимости ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

Npm install --save-dev gulp

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» Π² ΠΊΠΎΡ€Π½Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° gulpfile.js ΠΈ создадим ΠΏΡƒΡΡ‚ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°.

Var gulp = require("gulp"); gulp.task("default", function() { // мСсто для ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π² Π·Π°Π΄Π°Ρ‡Π΅ });

БобствСнно Ρ‚Π°ΠΊ ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Π·Π°Π΄Π°Ρ‡ΠΈ Π² gulp. ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ для сборки вашСго front-end’a Π΅ΡΡ‚ΡŒ ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹. Об установкС ΠΈ использовании ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² Π΄Π°Π»Π΅Π΅.

Π‘Π±ΠΎΡ€ΠΊΠ° css

Π”ΡƒΠΌΠ°ΡŽ Π² наши Π΄Π½ΠΈ ΡƒΠΆΠ΅ всС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ css прСпроцСссоры. Если Π²Ρ‹ Π΅Ρ‰Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ css прСпроцСссор, Π²Π°ΠΌ срочно Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с ΠΈΠ»ΠΈ ΠΈ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ sass ΠΈΠ»ΠΈ less Π² Ρ€Π°Π±ΠΎΡ‚Π΅.

Π― ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ sass, поэтому ΠΏΠΎΠΊΠ°ΠΆΡƒ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠ»Π°Π³ΠΈΠ½Π° sass.

Установка ΠΏΠ»Π°Π³ΠΈΠ½Π°

Npm install gulp-sass --save-dev

Π”Π²Π΅ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΡ… Π·Π°Π΄Π°Ρ‡ΠΈ для сборки ΠΈ live сборки sass Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΡ€ΠΈ ΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ.

Var gulp = require("gulp"); var sass = require("gulp-sass"); //Π—Π°Π΄Π°Ρ‡Π° для сборки gulp.task("sass", function () { return gulp.src("./sass/**/*.scss") .pipe(sass().on("error", sass.logError)) .pipe(gulp.dest("./css")); }); //Π—Π°Π΄Π°Ρ‡Π°, послС запуска ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ, gulp Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° измСнСниями Ρ„Π°ΠΉΠ»ΠΎΠ² gulp.task("watch", function () { gulp.watch("./sass/**/*.scss", ["sass"]); });

Π’Π΅ΠΏΠ΅Ρ€ΡŒ прописав Π² консоли gulp sass , gulp собСрСт всС ваши sass Ρ„Π°ΠΉΠ»Ρ‹ Π² ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ.
А Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² gulp watch запустится процСсс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ sass Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΈ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ сразу ΠΈΡ… ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

Для остановки процСсса достаточно Π½Π°ΠΆΠ°Ρ‚ΡŒ Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅ Ctrl + C.

ОбъСдинСниС JavaScript Ρ„Π°ΠΉΠ»ΠΎΠ²

Для этого Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ»Π°Π³ΠΈΠ½ gulp-concat .

Npm install --save-dev gulp-concat

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π·Π°Π΄Π°Ρ‡Ρƒ Π² наш gulpfile.js .

Var gulp = require("gulp"); var sass = require("gulp-sass"); var concat = require("gulp-concat"); gulp.task("sass", function () { return gulp.src("./sass/**/*.scss") .pipe(sass().on("error", sass.logError)) .pipe(gulp.dest("dist/css")); }); gulp.task("scripts", function() { return gulp.src("src/**/*.js") .pipe(concat("app.js")) .pipe(gulp.dest("dist/js")); }); gulp.task("watch", ["sass", "scripts"], function() { gulp.watch("css/**/*.sass", ["sass"]); gulp.watch("src/**/*.js", ["scripts"]); });

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π·Π°Π΄Π°Ρ‡ΠΈ sass ΠΈ scripts находятся Π² зависимостях Ρƒ Π·Π°Π΄Π°Ρ‡ΠΈ watch.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ скрипты Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒΡΡ ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ gulp scripts ΠΈΠ»ΠΈ ΠΆΠ΅ ΠΏΡ€ΠΈ gulp watch .

ΠœΠΈΠ½ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ рСсурсов

Для ΠΌΠΈΠ½ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ JavaScript Ρ„Π°ΠΉΠ»ΠΎΠ² Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ»Π°Π³ΠΈΠ½ uglify , Π° для ΠΌΠΈΠ½ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ sass Ρ„Π°ΠΉΠ»ΠΎΠ² Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΎΠΏΡ†ΠΈΡŽ {outputStyle: "compressed"} .

Var gulp = require("gulp"); var sass = require("gulp-sass"); var concat = require("gulp-concat"); var uglify = require("gulp-uglify"); gulp.task("sass", function () { return gulp.src("./sass/**/*.scss") .pipe(sass({outputStyle: "compressed"}).on("error", sass.logError)) .pipe(gulp.dest("dist/css")); }); gulp.task("scripts", function() { return gulp.src("src/**/*.js") .pipe(concat("app.js")) .pipe(uglify()) .pipe(gulp.dest("dist/js")); }); gulp.task("watch", ["sass", "scripts"], function() { gulp.watch("css/**/*.sass", ["sass"]); gulp.watch("src/**/*.js", ["scripts"]); });

Π’Π΅Ρ€ΡΠΈΠΎΠ½Π½ΠΎΡΡ‚ΡŒ рСсурсов

Π’Π΅Ρ€ΡΠΈΠΎΠ½Π½ΠΎΡΡ‚ΡŒ рСсурсов Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° для контроля ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ… посСтитСлСй. Если Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ с html Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π° создаваСмым Ρ„Π°ΠΉΠ»Π°ΠΌ ΠΈ ΠΏΡƒΡ‚ΠΈ ΠΊ Π½ΠΈΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ»Π°Π³ΠΈΠ½Π° gulp-rev ΠΈΠ»ΠΈ gulp-rev-all . Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½ΠΈΡ… выходят Ρ„Π°ΠΉΠ»Ρ‹ Ρ„Π°ΠΉΠ»Ρ‹ с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°: app-ef62e7.js .
Но ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ с Π΄Π²ΠΈΠΆΠΊΠ°ΠΌΠΈ сайтов ΠΈ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ (любого Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°), Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ мСстС ΠΏΡ€ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΏΡƒΡ‚ΠΈ, Ρ‚ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ это ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΈΠΌ способом.

Π’ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ установим ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ gulp-html-replace ΠΈ gulp-rename .

Npm install gulp-html-replace --save-dev npm install gulp-rename --save-dev

gulp-rename β€” Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹, Π° gulp-html-replace Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΏΡƒΡ‚ΠΈ Π² ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ….

ИмСна Ρ„Π°ΠΉΠ»ΠΎΠ²

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΠΌ наш gulpfile Π½ΠΎΠ²Ρ‹ΠΌΠΈ строками:

Var gulp = require("gulp"); var sass = require("gulp-sass"); var concat = require("gulp-concat"); var uglify = require("gulp-uglify"); var htmlreplace = require("gulp-html-replace"); var rename = require("gulp-rename"); var time = Date.now(); gulp.task("path", function () { gulp.src("/assets_tpl.php") .pipe(htmlreplace({ "js": [ "/dist/js/app-"+time+".js" ], "css": [ "/dist/css/bundle-"+time+".css" ] })) .pipe(rename("assets.php")) .pipe(gulp.dest("/")); }); gulp.task("sass",["path"], function () { return gulp.src("./sass/**/*.scss") .pipe(sass({outputStyle: "compressed"}).on("error", sass.logError)) .pipe(concat("bundle-"+time+".css")) .pipe(gulp.dest("dist/css")); }); gulp.task("scripts",["path"], function() { return gulp.src("src/**/*.js") .pipe(concat("app-"+time+".js")) .pipe(uglify()) .pipe(gulp.dest("dist/js")); }); gulp.task("watch", ["sass", "scripts"], function() { gulp.watch("css/**/*.sass", ["sass"]); gulp.watch("src/**/*.js", ["scripts"]); });

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ time создана для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ числа Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ gulp скрипта. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС это простой timestamp. Он ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒΡΡ Π² имя Ρ„Π°ΠΉΠ»Π°.

ΠŸΡƒΡ‚ΠΈ ΠΊ Ρ„Π°ΠΉΠ»Π°ΠΌ

Π’Π°ΠΊΠΆΠ΅ создана новая Π·Π°Π΄Π°Ρ‡Π° path , которая ΠΏΠΎ Ρ„Π°ΠΉΠ»Ρƒ-ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ assets_tpl.php сгСнСрируСт Ρ„Π°ΠΉΠ» assets.php с Π±ΠΎΠ΅Π²Ρ‹ΠΌΠΈ путями ΠΊ Ρ„Π°ΠΉΠ»Π°ΠΌ.

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ выглядит Ρ„Π°ΠΉΠ»-шаблон assets_tpl.php:

ВмСсто ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Ρ‚Π΅Π³ΠΎΠ² Π² сгСнСрированном Ρ„Π°ΠΉΠ»Π΅ Π±ΡƒΠ΄ΡƒΡ‚ прописаны ΠΏΡƒΡ‚ΠΈ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ.

Π’Π°ΠΊ ΠΆΠ΅ стоит ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π·Π°Π΄Π°Ρ‡Π° path Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΊΠ°ΠΊ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ для Π·Π°Π΄Π°Ρ‡ sass ΠΈ scripts .

Но Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ любой ΠΈΠ· Π·Π°Π΄Π°Ρ‡ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π½ΠΎΠ²Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, Π° старыС Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π±Ρ‹ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ свСТиС Ρ„Π°ΠΉΠ»Ρ‹, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠ°ΠΏΠΊΡƒ с скомпилированными рСсурсами. Для этого Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ»Π°Π³ΠΈΠ½ gulp-clean .

Npm install --save-dev gulp-clean

Π—Π°Ρ‚Π΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π·Π°Π΄Π°Ρ‡Ρƒ с Ρ„Π»Π°Π³ΠΎΠΌ {read: false} , для ускорСнного удалСния.

Var clean = require("gulp-clean"); gulp.task("clean", function () { return gulp.src("dist", {read: false}) .pipe(clean()); });

И создадим Π·Π°Π΄Π°Ρ‡Ρƒ build , которая Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ чистку, Π° Π·Π°Ρ‚Π΅ΠΌ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ всС наши рСсурсы.

Gulp.task("build",["clean","sass","scripts","path"], function () {});

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² Π² консоли ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ gulp build , gulp ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ автоматичСски собСрСт вСсь front-end для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Π”Π°Π½Π½ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ²Π΅ΡΠΈΡ‚ΡŒ Π½Π° Ρ…ΡƒΠΊ послС дСплоя ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π° сСрвСр / хостинг.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ для ознакомлСния, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ стилСй ΠΈ скриптов для Π²Π°ΡˆΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ². Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² ΠΈ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² мноТСство ΠΈ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ΄ сСбя сам.

Если Π²Π°ΠΌ ΠΏΠΎΠ»Π΅Π·Π΅Π½ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π», ΠΏΠΎΠ΄ΠΏΠΈΡΡ‹Π²Π°ΠΉΡ‚Π΅ΡΡŒ Π½Π° ΠΌΠΎΠΉ Π±Π»ΠΎΠ³, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ увСдомлСния ΠΎ Π½ΠΎΠ²Ρ‹Ρ… публикациях Π½Π° Ρ‚Π΅ΠΌΡ‹: вСрстки, javascript ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ кроссплатформСнных ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.