Подтвердить что ты не робот

Как настроить webpack для минимизации и объединения scss и javascript, например CodeKit?

У меня возникли проблемы с использованием webpack вместо Codekit v1.9.3. Я начал работать, чтобы перейти от CodeKit к Grunt и Gulp, а затем узнал о webpack, который звучит очень круто. Я просто не могу заставить его работать правильно.

"Подобно Codekit" означает, что я могу:

  • Напишите javascript с синтаксисом coffeescript
  • У всех исходных файлов и библиотек script minified/ouglified и объединены в один файл
  • При необходимости выберите компоненты структуры bootstrap-sass (scss)
  • Поддерживайте небольшой файл с настройками бутстрапа через переменные sass, например $brand-primary
  • Используйте webpack --watch для автоматической смены сценариев и стилей при их изменении.
  • Завершите работу с одним файлом css и одним script файлом, который может быть включен в таблицу стилей и тег script.

Настройка проекта Codekit

Ресурсы Bower:

В настоящее время я храню эти глобально, вне проекта:

~/bower_components/twbs-bootstrap-sass/vendor/assets/stylesheets

Поскольку CodeKit поддерживает компас, у меня есть это в моем файле config.rb:

add_import_path "~/bower_components/twbs-bootstrap-sass/vendor/assets/stylesheets"

Структура проекта

js/fancybox.js
js/main.js               <-- currently the compiled js 'output' file
js/main.coffee

css/styles.css           <-- currently the compiled css 'output' file

scss/styles.scss
scss/modules/_bootstrap-customizations.scss
scss/modules/_typography.scss
scss/partials/_header.scss
scss/partials/_footer.scss

Содержание styles.scss

@import "modules/bootstrap-customizations";  # local customizations
@import "bootstrap/variables";
@import "bootstrap/mixins";
...                                          # load bootstrap files as required
@import "bootstrap/wells";

Настройка системы:

  • : OS X 10.9
  • node - v0.10.32
  • npm - v2.1.7
  • zsh - zsh 5.0.7 (x86_64-apple-darwin13.4.0)

node был установлен с homebrew brew install node и, похоже, работает отлично.


Что я пробовал

Я прочитал эти страницы:

Я попытался создать файл webpack.config.js несколько раз, моя последняя попытка состояла в нескольких версиях этого:

module.exports = {
    entry: [
    "./node_modules/bootstrap-sass-webpack!./bootstrap-sass.config.js",
    "./js/main.coffee"
    ],
    output: {
        path: __dirname,
        filename: "main.js"
    },
    module: {
        loaders: [
        { test: /\.css$/, loader: "style!css" }
        ]
    }
};

Ошибка Webpack

Когда я запускаю webpack, я получаю следующее:

ERROR in ./~/bootstrap-sass-webpack/~/css-loader!/Users/cwd/~/sass-loader!./~/bootstrap-sass-webpack/bootstrap-sass-styles.loader.js!./bootstrap-sass.config.js
stdin:1: file to import not found or unreadable: "~bootstrap-sass/assets/stylesheets/bootstrap/variables

Ошибка NPM

Я получаю сообщение об ошибке при попытке npm install bootstrap-sass, и вам не удавалось найти решение. Я даже не уверен, что мне нужен этот модуль.

npm ERR! Darwin 13.4.0
npm ERR! argv "node" "/usr/local/bin/npm" "install" "bootstrap-sass"
npm ERR! node v0.10.32
npm ERR! npm  v2.1.7
npm ERR! code EPEERINVALID

npm ERR! peerinvalid The package bootstrap-sass does not satisfy its siblings' peerDependencies requirements!
npm ERR! peerinvalid Peer [email protected] wants [email protected]~3.2.0

npm ERR! Please include the following file with any support request:
npm ERR!     /Users/cwd/webpack-test/npm-debug.log

Источники путаницы

Самые запутанные части веб-пакета для меня:

  • Где добавить такие вещи, как require("bootstrap-sass-webpack") - это в файле webpack.config.js или в файле js/main.js?
  • Если модули, подобные этому, доступны для веб-пакета, как только они установлены с помощью npm install?
  • Я думал, что должен сделать npm install webpack -g, чтобы webpack был установлен глобально, и используйте npm install без -g для других модулей. Однако в моем проекте не создается папка node_modules. Не должно быть одного?
  • Как определяются/заданы пути поиска для таких вещей, как require("bootstrap-sass-webpack")?

Какие модули node следует установить, чтобы это сделать? И как должен выглядеть мой webpack.config.js?

4b9b3361

Ответ 1

Введение

Webpack - это в основном JavaScript-пакет. Его "родным" языком является JavaScript, и для каждого другого источника требуется загрузчик, который преобразует его в JavaScript. Если вы require() html файл, например...

var template = require("./some-template.html");

... вам понадобится html-loader. Он поворачивается...

<div>
    <img src="./assets/img.png">
</div>

... в...

module.exports = "<div>\n    <img src=\"" + require("./assets/img.png") + "\">\n</div>";

Если загрузчик не возвращает JavaScript, он должен быть "подключен" к другому загрузчику.


Как загрузить SASS файлы

Настройка загрузчиков

Для использования SASS вам понадобится как минимум sass-loader и css-loader. Css-loader возвращает строку JavaScript. Если вы хотите импортировать возвращаемую строку JavaScript как StyleSheet, вам также понадобится style-loader.

Запустите npm i sass-loader css-loader style-loader --save

Теперь вам нужно применить эти загрузчики для всех файлов, которые соответствуют /\.scss$/:

// webpack.config.js
...
module: {
    loaders: [
        // the loaders will be applied from right to left
        { test: /\.scss$/, loader: "style!css!sass" }
    ]
}
...

Вы также можете передать параметры node-sass в качестве параметров запроса:

{
    test: /\.scss$/, loader: "style!css!sass?includePaths[]=" + 
        path.resolve(__dirname, "./bower_components/bootstrap-sass/assets/stylesheets/"
}

Так как бутстрап ссылается на значки с помощью инструкции url(), css-loader попытается включить эти активы в пакет и в противном случае выбросит исключение. Для этого вам также понадобится file-loader:

// webpack.config.js
...
module: {
    loaders: [
        { test: /\.scss$/, loader: "style!css!sass" },
        { test: /\.jpe?g$|\.gif$|\.png$|\.svg$|\.woff$|\.ttf$/, loader: "file" },
    ]
}
...

Настроить запись

Чтобы включить загрузку в свой пакет, существует несколько способов. Один из них - это вариант с несколькими входами, как вы уже пробовали. Я рекомендую использовать одну запись, где вы require() ваш главный sass файл:

// main.js
require("./main.scss");

Учитывая, что ваш includePaths настроен, вы можете:

// main.scss
// Set the font path so that url() points to the actual file
$icon-font-path: "../../../fonts/bootstrap";

@import "bootstrap";

Обратите внимание, что операции импорта в scss файлах не затрагиваются webpack, потому что у libsass нет api ( для предоставления настраиваемых преобразователей.

Чтобы предотвратить дублирование кода, важно также иметь основной файл single, потому что webpack компилирует каждый sass файл по отдельности.

Когда кофе-загрузчик установлен через npm, ваш окончательный webpack.config.js должен выглядеть так:

module.exports = {
    entry: "./js/main.coffee",
    output: {
        path: __dirname,
        filename: "main.js"
    },
    module: {
        loaders: [
            { test: /\.scss$/, loader: "style!css!sass" },
            { test: /\.jpe?g$|\.gif$|\.png$|\.svg$|\.woff$|\.ttf$/, loader: "file" },
            { test: /\.coffee$/, loader: "coffee" }
        ]
    }
};

Webpack глобально?

Лучше всего не устанавливать webpack глобально, потому что это зависимость вашего проекта и, следовательно, его нужно контролировать с помощью npm. Вы можете использовать scripts - раздел вашего package.json:

{
    ...
    "scripts": {
        "start": "webpack --config path/to/webpack.config.js & node server.js"
    }
}

Тогда вам просто нужно запустить npm start