Страницы

Поиск по вопросам

Показаны сообщения с ярлыком pug. Показать все сообщения
Показаны сообщения с ярлыком pug. Показать все сообщения

пятница, 21 февраля 2020 г.

Как создать переменные, которые будут видимы в SASS, JavaScript и Jade(Pug)

#javascript #sass #jade #pug


Каким наиболее простым образом можно создать переменные, которые будут видимы в:


SASS
JavaScript-файлах (с использованием Webpack и возможностей ES6)
Jade-шаблонах


Зачем это надо, думаю понятно: меняем имя, например, CSS-класса в одном месте, и
оно автоматически подставляется везде. Без этой возможности изменить имя класса в крупном
проекте - целая проблема.
    


Ответы

Ответ 1



создаете файл .env и в нем переменную SOME_ENV_VAR к примеру SASS_ENV=blabla читаем переменную в компиляторе SASS или JS: var ENV = process.env.SOME_ENV_VAR || 'default'; асайним переменную для Jade: const express = require('express'); var app = express(); app.locals.env = process.env; и читаем переменную в Jade #{env.SOME_ENV_VAR} Дополнение #1 var sass = encodeURIComponent(jsonToSassVars(sassGlobals)); var webpackConfig = { module: { loaders:[ {test: /.scss$/, loader: "style!css!sass!prepend?data=" + sass} ] }, } jsonToSassVars - https://gist.github.com/Kasu/ea4f4861a81e626ea308 Update: the previous link is not available anymore, prefer to use https://gist.github.com/ali-master/cb54a3501c0ea29a88a0297cb9533be9

воскресенье, 16 февраля 2020 г.

Как создать переменные, которые будут видимы в SASS, JavaScript и Jade(Pug)

#javascript #sass #jade #pug


Каким наиболее простым образом можно создать переменные, которые будут видимы в:


SASS
JavaScript-файлах (с использованием Webpack и возможностей ES6)
Jade-шаблонах


Зачем это надо, думаю понятно: меняем имя, например, CSS-класса в одном месте, и
оно автоматически подставляется везде. Без этой возможности изменить имя класса в крупном
проекте - целая проблема.
    


Ответы

Ответ 1



создаете файл .env и в нем переменную SOME_ENV_VAR к примеру SASS_ENV=blabla читаем переменную в компиляторе SASS или JS: var ENV = process.env.SOME_ENV_VAR || 'default'; асайним переменную для Jade: const express = require('express'); var app = express(); app.locals.env = process.env; и читаем переменную в Jade #{env.SOME_ENV_VAR} Дополнение #1 var sass = encodeURIComponent(jsonToSassVars(sassGlobals)); var webpackConfig = { module: { loaders:[ {test: /.scss$/, loader: "style!css!sass!prepend?data=" + sass} ] }, } jsonToSassVars - https://gist.github.com/Kasu/ea4f4861a81e626ea308 Update: the previous link is not available anymore, prefer to use https://gist.github.com/ali-master/cb54a3501c0ea29a88a0297cb9533be9

пятница, 24 января 2020 г.

gulp: как перекомпилировать только изменённые файлы, разбитые на несколько файлов (на примере pug)

#gulp #pug #gulp_watch


В приведённой ниже файловой подсистеме файл partial1.pug является частью test1.pug
(включён в него через include), а файл partial2.pug - полностью самостоятельный:

📁 pug

  test1.pug

  test2.pug

   📁 partials

     partial1.pug

test1.pug

doctype html
html
  head
    title Test 1
  body
    h1 Test 1
    include partials/partial1.pug


Вот, какого результата я хочу в результате написания gulp-таска:


отредактировали test1.pug  → скомпилировался только test1.pug
отредактировали partial1.pug→ скомпилировался только test1.pug
отредактировался test2.pug  → скомпилировался только test2.pug 


В следующем gulp-таске, при редактировании одного из partial1.pug или partial2.pug
каждый раз компилироваться будут оба:

gulp.task('pug', () => {
  return gulp.src('pug/*.pug')
  .pipe(pug())
  .pipe(gulp.dest('dist'))
});


Пытаясь решить эту проблему, мы можем добавить {since: gulp.lastRun('pug')}:

gulp.task('pug', () => {
  return gulp.src('pug/*.pug', {since: gulp.lastRun('pug')})
  .pipe(pug())
  .pipe(gulp.dest('dist'))
});


Тогда инкрементальной сборке (с использованием gulp-watch) начиная со второго, автоматического
запуска таска pug будет скомпилирован только отредактированный файл. Однако, если мы
отредактируем partial1.pug, то ничего откомпилировано не будет (оно и понятно: test1.pug
же не менялся).

Изменение glob-паттерна на 'pug/**/*.pug' тоже желаемого результата не даст:


Если установить такой паттерн для gulp-watch, то после редактирования partial1.pug
запуск таска pug произойдёт, но {since: gulp.lastRun('pug')} не пропустит файл test1.pug. 
Если установить такой паттерн для самого таска pug, то partial1.pug будет компилироваться
в отдельный файл, чего нам не нужно.


Как же быть?
    


Ответы

Ответ 1



var pathJsChangeFile = ''; gulp.task('watch', function() { gulp.watch(paths.pathWeb + '/js/**/*.js', ['jsWathc']).on('change', function(event) { pathJsChangeFile = event.path; console.log('File ' + event.path + ' was ' + event.type + ', running tasks...'); }); }); gulp.task('jsWathc', function() { return gulp.src(pathJsChangeFile) ..// .pipe(gulp.dest(paths.pathDist + dest + '')) }) не идельное решение но работает

Ответ 2



gulp.task('pug', () => { return gulp.src('pug/*.pug') /* https://www.npmjs.com/package/gulp-newer */ .pipe(newer({ dest: 'dist', extra: './app/{components,helpers,layouts,partials}/**/*.*' })) .pipe(pug()) .pipe(gulp.dest('dist')) }); или плагин Emitty

четверг, 9 января 2020 г.

Условия if/else в pug

#html5 #jade #pug


Есть блок с svg и нужно менять содержимое в зависимости от переменной, код:

mixin container(svg)    
.logo-box
    if svg == first
      svg.class__first
    else if svg === second
      svg.class__second
    else if svg === third
      svg.class__third
    else
      svg.class__fourth
+container(first)
+container(second)
+container(third)


Проблема заключается в том, что неважно какое значение я пишу в миксине container()
всегда отображается svg.class__first?
    


Ответы

Ответ 1



Синтаксис pug, вроде как, гласит что нужны кавычки. mixin container(svg) .logo-box if svg=='first' svg.class__first else if svg=='second' svg.class__second else if svg=='third' svg.class__third else svg.class__fourth +container('first') +container('second') +container('third') Пример на CodePen (View Compiled HTML)

Ответ 2



Небольшое дополнение к соседнему ответу. Код в pug является обычным кодом javascript. Без кавычек first, second, third считаются переменными и, так как они нигде не объявлены, их значением будет undefined. Убедиться в этом можно добавив следующее условие: if(typeof(first) == 'undefined') +container(first) И в этом случае будет выведено всего два блока. Так как все переменные равны undefined, и передаются тоже, то вполне работает равенство undefined === undefined. Для исправления можно воспользоваться решением из соседнего ответа: отказаться от переменных и использовать строки. Либо объявить переменные и присвоить им нужные значения.

суббота, 14 декабря 2019 г.

Как корректно перейти с Jade на Pug?

#nodejs #jade #pug


Здравствуйте. Я создал чистый проект при помощи express-generator'а и проверив его
на устаревшие зависимости при помощи npm-check, начал их обновлять. Всё обновилось
успешно, кроме jade, который недавно сменил имя. NPM пишет по этому поводу следующее: 


  npm WARN deprecated jade@1.11.0: Jade has been renamed to pug, please install the
latest version of pug instead of jade


Я выполнил следующие команды:

npm uninstall --save jade
npm install --save pug
npm start


Сервер запустился, но при переходе на localhost:3000 упал с ошибкой 'Error: Cannot
find module 'jade'. Тогда я обновил в коде app.js

app.set('view engine', 'jade');


на

app.set('view engine', 'pug');


и сервер падает с новой ошибкой: Error: Failed to lookup view "error" in views directory
"~/documents/projects/node/template/views"

Подскажите пожалуйста, что я делаю не так?
    


Ответы

Ответ 1



Всё, спасибо, разобрался методом тыка! :) Нужно было в папке views переименовать все файлы *.jade на *.pug!

Ответ 2



У меня проблема решилась сама собой после npm-check -u

среда, 17 июля 2019 г.

Как правильно настроить webpack, для работы с pug файлами

Возникли проблемы с настройкой webpack
Надо, чтобы в проекте была динамическая HTML-страница. Лучше, чтобы она пререндерилась на сервере. Сам фреймворк: Adonis, однако стандартный template language в нем не такой удобный (edge - файлы). Посему решил использовать Pug
Сама структура проекта такая: есть папка source, в ней папки для каждой страницы / компонента. После билда webpack'ом все попадает в нужные места: public и views.
Все, кроме картинок. Я так и не понял, как по правильному настроить webpack, так, чтобы он не компилировал pug в html и менял ссылки в img src (в случае JPG/JPEG/PNG - это image/[name].[ext], а в случае SVG - icon/[name].svg).
И вообще: правильно ли таким образом использовать pug? Или лучше его использовать только во время билда?
Сейчас я использую следующий способ: Добавляю pug файл в webpack с помощью: html-webpack-plugin, после использую html-webpack-pug-plugin, чтобы в файл добавлялись link и script pug-вида. Я так понимаю, надо настроить loader, такая конструкция:
{ test: /\.pug$/, loaders: ['html-loader', 'pug-html-loader'] }
работает, однако на выходе получаю файл с дефолтным HTML шаблоном.


Ответ

Появилось решение: https://www.npmjs.com/package/pug-asset-loader С помощью этого плагина, можно обрабатывать pug файлы, используя функцию pal() для относительного пути, который будет заменен после сборки.

вторник, 9 июля 2019 г.

Как добавлять инкремент(i) в css класс на pug(он же бывший jade)?

На нативном javascript это было-бы примерно следующим образом:
HTML:


Js:
var buttons = document.querySelectorAll('.btns');
for(i=0; iPug:
- var modalList = [{ title: "Многокамерная съемка", posterImage: "content/video.jpg", description: 'Мы используем камеры Panasonic, Sony, Blackmagic, Go Pro.Съемка на несколько камер с возможностью прямой трансляции, проекторы, плазменные панели. Онлайн трансляции в сети Интернет: 720р, 1080р, 4К.В нашем арсенале мультироторы для съемки верхних планов с 3-х осевой стабилизацией и возможностью передачи сигнала на пульт видеоинженеров (с дальнейшей трансляцией на экраны или в сеть).Кинематографические краны и тележки обеспечивают подвижность картинки и необходимую плавность кадра. Тросовая гиростабилизированная система подвеса с длиной кабельной линии до 100 метров позволяет снимать большие спортивные мероприятия и концерты непосредственно над зрителями.Благодаря оптическим удлинителям сигнала работа операторов проходит на значительном удалении от пультовой. Изображение передается в формате высокой четкости.' }, {title: "blabla"} ];
mixin modal-tackles(tackles) .modal.modal-contact.fade.tackles__modal_(здесь должен быть инкремент)(tabindex="-1", role="dialog", aria-labelledby="exampleModalLabel") .modal-dialog(role="document") .modal-content .modal-header span= tackles.title button.close(type="button",data-dismiss="modal", aria-label="Close") span(aria-hidden="true") x .modal-body
for tackles in modalList +modal-tackles(tackles)


Ответ

Вместо for в данном случае лучше использовать each, так как он позволяет получить индекс текущей итерации.
Далее этот индекс нужно передать в mixin.
Так как классы не поддерживают интерполяцию, класс, который надо собирать динамически нужно перенести в атрибуты.
В итоге должно получиться что-то такое:
for tackles, index in modalList +modal-tackles(tackles, index)
И в mixin:
mixin modal-tackles(tackles, index) .modal.modal-contact.fade(class=`tackles__modal_${index}`, tabindex="-1", role="dialog", aria-labelledby="exampleModalLabel")

пятница, 26 апреля 2019 г.

Как создать переменные, которые будут видимы в SASS, JavaScript и Jade(Pug)

Каким наиболее простым образом можно создать переменные, которые будут видимы в:
SASS JavaScript-файлах (с использованием Webpack и возможностей ES6) Jade-шаблонах
Зачем это надо, думаю понятно: меняем имя, например, CSS-класса в одном месте, и оно автоматически подставляется везде. Без этой возможности изменить имя класса в крупном проекте - целая проблема.


Ответ

создаете файл .env и в нем переменную SOME_ENV_VAR к примеру SASS_ENV=blabla
читаем переменную в компиляторе SASS или JS: var ENV = process.env.SOME_ENV_VAR || 'default';
асайним переменную для Jade:
const express = require('express'); var app = express(); app.locals.env = process.env;
и читаем переменную в Jade #{env.SOME_ENV_VAR}
Дополнение #1
var sass = encodeURIComponent(jsonToSassVars(sassGlobals)); var webpackConfig = { module: { loaders:[ {test: /.scss$/, loader: "style!css!sass!prepend?data=" + sass} ] }, }
jsonToSassVars - https://gist.github.com/Kasu/ea4f4861a81e626ea308
Update: the previous link is not available anymore, prefer to use https://gist.github.com/ali-master/cb54a3501c0ea29a88a0297cb9533be9

пятница, 15 февраля 2019 г.

Условия if/else в pug

Есть блок с svg и нужно менять содержимое в зависимости от переменной, код:
mixin container(svg) .logo-box if svg == first svg.class__first else if svg === second svg.class__second else if svg === third svg.class__third else svg.class__fourth +container(first) +container(second) +container(third)
Проблема заключается в том, что неважно какое значение я пишу в миксине container() всегда отображается svg.class__first?


Ответ

Синтаксис pug, вроде как, гласит что нужны кавычки.
mixin container(svg) .logo-box if svg=='first' svg.class__first else if svg=='second' svg.class__second else if svg=='third' svg.class__third else svg.class__fourth
+container('first') +container('second') +container('third')
Пример на CodePen (View Compiled HTML)

вторник, 23 октября 2018 г.

Как корректно перейти с Jade на Pug?

Здравствуйте. Я создал чистый проект при помощи express-generator'а и проверив его на устаревшие зависимости при помощи npm-check, начал их обновлять. Всё обновилось успешно, кроме jade, который недавно сменил имя. NPM пишет по этому поводу следующее:
npm WARN deprecated jade@1.11.0: Jade has been renamed to pug, please install the latest version of pug instead of jade
Я выполнил следующие команды:
npm uninstall --save jade npm install --save pug npm start
Сервер запустился, но при переходе на localhost:3000 упал с ошибкой 'Error: Cannot find module 'jade'. Тогда я обновил в коде app.js
app.set('view engine', 'jade');
на
app.set('view engine', 'pug');
и сервер падает с новой ошибкой: Error: Failed to lookup view "error" in views directory "~/documents/projects/node/template/views"
Подскажите пожалуйста, что я делаю не так?


Ответ

Всё, спасибо, разобрался методом тыка! :) Нужно было в папке views переименовать все файлы *.jade на *.pug!