Giter VIP home page Giter VIP logo

enb-stylus's Introduction

enb-stylus

NPM version Build Status Build status Coverage Status Dependency Status

Пакет предоставляет ENB-технологию для сборки CSS- и Stylus-файлов в проектах, построенных по методологии БЭМ.

Принципы работы технологии и ее API описаны в документе API технологии.

Совместимость: технология пакета enb-stylus поддерживает версию CSS-препроцессора Stylus 0.54.2.

Обзор документа

Работа технологии stylus

В БЭМ-методологии стили к каждому блоку хранятся в отдельных файлах в директориях блоков.

ENB-технология stylus позволяет писать код как в синтаксисе Stylus, так и на чистом CSS. Для компиляции Stylus-кода в CSS используется CSS-препроцессор Stylus.

В результате сборки вы получите CSS-файл. Для обработки итогового CSS используется CSS-построцессор postcss.

Как начать использовать?

1. Установите пакет enb-stylus:

$ npm install --save-dev enb-stylus

Требования: зависимость от пакета enb версии 0.16.0 или выше.

2. Опишите код стилей в файле с расширением .styl:

 blocks/
 └── block/
     └── block.styl

3. Добавьте в конфигурационный файл .enb/make.js следующий код:

var stylusTech = require('enb-stylus/techs/stylus'),
    FileProvideTech = require('enb/techs/file-provider'),
    bemTechs = require('enb-bem-techs');

module.exports = function(config) {
    config.node('bundle', function(node) {
        // Получаем список файлов (FileList)
        node.addTechs([
            [FileProvideTech, { target: '?.bemdecl.js' }],
            [bemTechs.levels, { levels: ['blocks'] }],
            bemTechs.deps,
            bemTechs.files
        ]);

        // Строим CSS-файл
        node.addTech([stylusTech, {
            // target: '?.css',
            // filesTarget: '?.files',
            // sourceSuffixes: ['.styl', '.css'],
            // url: 'rebase'
            // imports: 'include',
            // comments: true
        }]);
        node.addTarget('?.css');
    });
};

Особенности работы пакета

Совместное использование Stylus и CSS

В проекте допускается совместное использование .css- и .styl-файлов. Однако в рамках одного блока обе технологии не могут использоваться одновременно. Если стили блока реализованы и в CSS, и в Stylus, будет использоваться файл с расширением .styl.

Пример 1. Если файл одного блока реализован в CSS-технологии, а файл другого — в Stylus:

blocks/
└── block1/
    └── block1.styl
└── block2/
    └── block2.css
bundle
└── bundle.css

В сборку попадут оба файла:

@import "../blocks/block1/block1.styl";
@import "../blocks/block1/block2.css";

Пример 2. Если у одного блока есть несколько реалиализаций: файл c расширением .styl и файл c расширением .css:

blocks/
└── block/
    ├── block.styl
    └── block.css
bundle
└── bundle.css

В сборку попадет только Stylus-файл:

@import "../blocks/block/block.styl";

Пример 3. Если у одного блока есть несколько реалиализаций, но на разных уровнях переопределения:

common.blocks/
└── block/
    └── block.styl
desktop.blocks/
    └── block/
        └── block.css
bundle
└── bundle.css

В сборку попадут оба файла:

@import "../common.blocks/block/block.styl";
@import "../desktop.blocks/block/block.css";

Добавление вендорных префиксов

Технология stylus поддерживает Autoprefixer.

Для автоматического добавления вендорных префиксов в процессе сборки используйте опцию autoprefixer.

Минимизация CSS-кода

Для минимизации CSS-кода используется csswring.

Включить минимизацию можно с помощью опции compress.

Сборка отдельного бандла для IE

Если в проекте есть стили, которые должны примениться только для IE, то их помещают в отдельный файл со специальным расширением .ie*.styl:

  • .ie.styl — стили для любого IE, ниже 9й версии.
  • .ie6.styl — стили для IE 6.
  • .ie7.styl — стили для IE 7.
  • .ie8.styl — стили для IE 8.
  • .ie9.styl — стили для IE 9.

Чтобы собрать отдельный бандл для IE нужно:

1. В папке блока создать один или несколько файлов c расширением .ie*.styl:

blocks/
└── block/
    ├── block.styl
    ├── block.ie.styl
    └── block.ie6.styl

2. Добавить еще технологию StylusTech:

node.addTechs([
   [stylusTech], // для основного CSS
   [stylusTech]  // для IE
]);

3. Добавить новую цель сборки для IE файла — ?.ie6.css:

node.addTechs([
    [stylusTech],
    [stylusTech, { target: '?.ie6.css' }]  // IE 6
]);

node.addTargets(['?.css', '?.ie6.css']);

4. В БЭМ проектах принято подключать стили с помощью условных комментариев.

Пример

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8"/>
        <!--[if gt IE 9]><!-->
            <link rel="stylesheet" href="index.css"/>
        <!--<![endif]-->
        <!--[if lte IE 9]>
            <link rel="stylesheet" href="index.ie.css"/>
        <![endif]-->
    </head>
    <body>

Важно, чтобы файл, подключаемый для IE, содержал стили не только специфичные для него, но и общие для всей страницы.

Чтобы собрать такой файл, нужно расширить список суффиксов с помощью опции sourceSuffixed.

node.addTechs([
    [stylusTech],
    [stylusTech, {
        target: '?.ie6.css',
        sourceSuffixes: [
            'styl', 'css',          // Общие стили
            'ie.styl', 'ie.css',    // Стили для IE < 9
            'ie6.styl', 'ie6.css'   // Стили для IE 6
        ]
    }]
]);
node.addTargets(['?.css', '?.ie.css']);

В итоге получаем следующий конфигурационный файл .enb/make.js:

var stylusTech = require('enb-stylus/techs/stylus'),
    FileProvideTech = require('enb/techs/file-provider'),
    bemTechs = require('enb-bem-techs');

module.exports = function(config) {
    config.node('bundle', function(node) {
        // получаем список файлов (FileList)
        node.addTechs([
            [FileProvideTech, { target: '?.bemdecl.js' }],
            [bemTechs.levels, { levels: ['blocks'] }],
            bemTechs.deps,
            bemTechs.files
        ]);

        // Собираем CSS-файлы
        node.addTechs([
            [stylusTech],
            [stylusTech, {
                target: '?.ie6.css',
                sourceSuffixes: [
                    'styl', 'css',          // Общие стили
                    'ie.styl', 'ie.css',    // Стили для IE < 9
                    'ie6.styl', 'ie6.css'   // Стили для IE 6
                ]
            }]
        ]);
        node.addTargets(['?.css', '?.ie6.css']);
    });
};

Лицензия

© 2014 YANDEX LLC. Код лицензирован Mozilla Public License 2.0.

enb-stylus's People

Contributors

4eb0da avatar blond avatar dmikis avatar egavr avatar godfreyd avatar greenkeeperio-bot avatar j0tunn avatar jilizart avatar mdevils avatar mishanga avatar qfox avatar sameoldmadness avatar sbmaxx avatar scf2k avatar tadatuta avatar tarmolov avatar tavriaforever avatar

Stargazers

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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

enb-stylus's Issues

Не склеивает styl файлы с разных уровней переопределения

@andrewblond
Версия пакета 1.2.0
Обновленный пакет перестал склеивать с разных уровней одинаковые файлы.
Например, в bem-site-engine есть файл menu_list.styl
Если на уровне лего-сайта есть этот файл с доопределением стилей, то он не доезжает.

Все ок -> в 1.1.5

Url option

url: 'rebase' — Allow you to fix url() according to target. By Default.
url: 'inline' — Allow you to inline assets using base64 syntax.

--inline — Utilize image inlining via data URI support.

See docs

Imports option

imports: 'include'. By Default.

--include-css — Include regular CSS on @import. The default value is true.

Resolve option

--resolve-url — Resolve relative urls inside imports. The default value is true.

Не раскрываются `@import'`ы в css

В версияx [email protected] и [email protected] в исходный css бандла стали попадать нераскрытые строчки с @import. В [email protected] и ниже всё нормально.

P.S. Я не проверял на "чистых проектах", но у себя использую немного модифицированную версию технологии css-stylus-with-autoprefixer, хотя там вряд ли есть чему сломаться.

Merge techs to `stylus`

  • Add autoprefixer option to css-stylus tech (#64).
  • Remove css-stylus-with-nib tech (#65).
  • Remove css-stylus-with-autoprefixer tech (#66).
  • Rename css-stylus to stylus tech (#67).

Url resolve is broken for non-quoted links

в новой версии stylus появилась возможность не брать в кавычки пути в конструкции background*: url().
при этом, если раньше путь строго передавался в кавычках и возвращался в функцию-обработчик (https://github.com/enb-make/enb-stylus/blob/master/techs/css-stylus.js#L45) в виде одного аргумента с полем val, то теперь, когда появилась возможность не закавычивать пути, парсер разбивает его по токенам и передает в обработчик в виде пачки параметров.

я закостылял это так: tadatuta@4c80bca
но есть подозрение, что если заиспользовать внутри url() какие-нибудь хитрые конструкции, мое решение может сломаться, т.к. нельзя будет просто конкатенировать поля string для каждого токена.

в целом кажется, что изобретать кастомное решение для каждого препроцессора — не самый рациональный подход. можно либо применять возможности самого препроцессора, тогда есть хоть какая-то гарантия, что при следующем обновлении все не взорвется, либо добавлять в цепочку сборки borschik, который изначально задуман для решения этой задачи.

Autoprefixer option

Add autoprefixer option to css-stylus tech. Need support browsers config.

Boolean | {{ browsers: String[] }}. The default value is false.

  • If false — do nothing.
  • If true — autoprefix with default browsers or config.
  • If autoprefixer.browsers — autoprefix with specified browsers.

Not support composite targets

nodeConfig.addTech([require('enb-stylus/techs/css-stylus'), {
    target: '?.css' // urls should be handled relative to this file
}]);
nodeConfig.addTech([require('enb-stylus/techs/css-stylus'), {
    target: '.tmp/no-prefix.css' // urls should be handled relative to this node, 
                                 // but not `node/.tmp` directory
}]);

Баг с # в урлах

При сборке с помощью таски enb-stylus/tech/css-stylus, если в файле .styl есть такая конструкция:
body
background: url("#")

Падает ошибка:
TypeError: /Test/stylus-test/static/desktop.blocks/b-page/b-page.styl:2 1| body > 2| background: url("#") 3| Cannot call method 'substr' of null at "body"

Ошибка происходит внутри stylus, который использует enb-stylus.

Если собирать последним stylus 0.49.3, тот файл с таким же содержимым:
body
background: url("#")
То никаких проблем нет и конструкция отрабатывает корректно.

Дело в том, что enb-stylus использует устаревшую версию stylus: 0.47.1
Тогда, как актуальная версию stylus: 0.49.3.

Прошу починить и поднять версию stylus для фикса бага.

Add prefixes at the level of the postcss

Now prefixes are added using a stylus and only for styl files, since the stylus does not disclose css @import. Need to add prefixes to the level of the stylus and do it at the level of postcss

Compress option

  • Use csswring for compress by default: compress: true.
  • Support native compressor: compress: 'native'.

Баг в css-stylus-with-autoprefixer

Конфиг:

[require('enb-stylus/techs/css-stylus-with-autoprefixer'), {
                    browsers: [
                        '> 1%',
                        'last 2 versions',
                        'Firefox >= 15',
                        'Explorer >= 7',
                        'Opera 12.1'
                    ]
                }],

И автопрефиксер не обрабатывает в итоге css. Я заглянул, что он возвращает тут — https://github.com/enb-make/enb-stylus/blob/master/techs/css-stylus-with-autoprefixer.js#L37 — там CSS только с импортами, а файлы .styl не импортами, но пустые выводятся.

Comments options

  • comments: true — Default value. Emits comments in the generated CSS indicating the url. Need use ENB-style: /* <url>:begin */\n<code>\n/* <url>:end */.
  • comments: false — Disables emits comments.

Hoist option

--hoist-atrules — Move @import and @charset to the top.

Return css-preprocessor

The css-preprocesor was removed in #8. It affects project build process dramatically.

For example, I wanna include a css file into my project but I cannot do it because of error:

500 TypeError: /project/node_modules/pikaday/css/pikaday.css:55
  51|     z-index: 9998;
  52|     margin: 0;
  53|     left: 0;
  54|     top: 5px;
> 55|     filter: alpha(opacity=0);
  56|     opacity: 0;
  57| }
  58| 

Please, return css-preprocessor logic.

//cc @andrewblond, @mdevils

Recommend Projects

  • React photo React

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

  • Vue.js photo Vue.js

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

  • Typescript photo Typescript

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

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

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

Recommend Topics

  • javascript

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

  • web

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

  • server

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

  • Machine learning

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

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

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

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.