Vue: Webpack и vue-файлы с разными типами содержимого

Alex Sokolov
2 min readDec 18, 2016

--

Обновлено 10.01.2018: Пересмотрел свежим взглядом и внёс мелкие правки. Заходите и в Telegram-канал по Vue: https://t.me/vuejs_ru

Vue предлагает собственный способ организации компонентов — однофайловые компоненты. Vue-файлы позволяют создавать любые вариации описания компонента. Хочется использовать SASS для стилей? Пожалуйста. Вместо HTML использовать шаблонизатор Pug? Тоже можно. Писать на TypeScript? Легко! Так или иначе, с помощью загрузчиков для Webpack всё приведётся к HTML+CSS+JS, но мы вольны выбирать что захочется.

Из чего состоят vue-файлы

Каждый компонент состоит из 3 основных частей:

  • шаблон компонента (тег template)
  • логика работы компонента (тег script)
  • стили (теги styles)

Кстати, если тег template и script может быть только один в файле компонента, то тегов style несколько — например, если потребуются глобальные стили и стили только для данного модуля.

По умолчанию, в секциях HTML, JS (ES2015) и CSS. Нестандартный тип содержимого нужно указывать с помощью атрибута lang:

// vue-файл<!-- Шаблон в jade -->
<template lang="jade">
...
</template>
<!-- CoffeeScript в скриптах -->
<script lang="coffee">
...
</script>
<!-- SASS в стилях -->
<style lang="scss">
...
</style>

Для красивой подсветки кода в секциях может потребоваться установить плагин для редактора (например, Sublime Text, Atom).

Секции однофайлового компонента не обязательно располагать в одном vue-файле. При желании все или некоторые части можно вынести в отдельные файлы и подключать с помощью атрибута src:

// vue-файл состоящий из подключений других файлов<template src="./template.html"></template>
<style src="./style.css"></style>
<script src="./script.js"></script>

С содержимым вроде разобрались, как же подключать vue-файлы?

Настройка Webpack & vue-loader

Устанавливаем Webpack и vue-loader.

Вообще для любого типа содержимого, который будет обрабатывать Webpack потребуется установить соответствующий loader:

В конфиг Webpack добавляем правило обработки vue-файлов с помощью vue-loader:

// webpack.config.js...
rules: [
...
{
test: /\.vue$/,
loader: 'vue-loader',
}
...
]
...

Рекомендуется ограничивать область действия правил добавляя свойствоinclude или exclude, причём одновременно их указывать не стоит. Если в проекте будут использоваться vue-файлы из сторонних пакетов, то нужно чтобы это правило распространялось на файлы из каталога node_modules.

Настройка нестандартного содержимого vue-файлов

Кроме того, что для секции необходимо указать атрибут lang, для vue-loader нужно указать в настройках цепочки loader’ов для каждого нестандартного типа:

// Webpack 1
// webpack.config.js
...
module: {
loaders: [...]
},
// Цепочки loader'ов, используемые в vue-файлах
vue: {
loaders: {
scss: 'style!css!sass'
}
}
...

В результате при обработке секции с lang=”scss” в однофайловом компоненте будет использована цепочка из sass-loader, css-loader и style-loader.

В Webpack 2 ситуация немного изменилась:

// Webpack 2
// webpack.config.js
...
rules: [
{
test: /\.vue$/,
loader: 'vue-loader',
options: {
loaders: {
scss: 'vue-style-loader!css-loader!sass-loader', // <style lang="scss">
}
}
}
]

Всё! Теперь vue-loader будет передавать правильные цепочки loader’ов Webpack’у, который в свою очередь соберёт их в javascript-модули.

--

--