# Использование пре-процессоров
В webpack все пре-процессоры должны обрабатываться соответствующими загрузчиками. vue-loader
позволяет вам использовать другие загрузчики webpack для обработки секций в однофайловых компонентах Vue. Они будут автоматически вызваны на основе указанного атрибута lang
у секции файла.
# Sass
Например, для компиляции нашего тега <style>
с помощью Sass/SCSS:
npm install -D sass-loader node-sass
В вашей конфигурации webpack:
module.exports = {
module: {
rules: [
// ... другие правила опущены
// это правило будет применяться к обычным файлам `.scss`
// А ТАКЖЕ к секциям `<style lang="scss">` в файлах `.vue`
{
test: /\.scss$/,
use: [
'vue-style-loader',
'css-loader',
'sass-loader'
]
}
]
},
// плагин опущен
}
Теперь, в дополнение к возможности писать import 'style.scss'
, мы можем использовать SCSS также и в компонентах Vue:
<style lang="scss">
/* используем SCSS здесь */
</style>
Любое содержимое внутри блока будет обработано webpack, как если бы оно находилось внутри файла *.scss
.
# Sass vs SCSS
Обратите внимание, что sass-loader
обрабатывает синтаксис scss
по умолчанию. Если вам требуется синтаксис sass
с отступами, то необходимо передать опцию в загрузчик:
// webpack.config.js -> module.rules
{
test: /\.sass$/,
use: [
'vue-style-loader',
'css-loader',
{
loader: 'sass-loader',
options: {
indentedSyntax: true,
// sass-loader >= 8
sassOptions: {
indentedSyntax: true
}
}
}
]
}
# Передача глобальных переменных
sass-loader
также поддерживает опцию additionalData
, которая позволяет вам передавать общие переменные во все обрабатываемые файлы без необходимости везде их явно импортировать:
// webpack.config.js -> module.rules
{
test: /\.scss$/,
use: [
'vue-style-loader',
'css-loader',
{
loader: 'sass-loader',
options: {
// вы можете также указать файл, например `variables.scss`
// используйте свойство `prependData` здесь, если версия sass-loader = 8
// используйте свойство `data` здесь, если версия sass-loader < 8
additionalData: `$color: red;`
}
}
]
}
# LESS
npm install -D less less-loader
// webpack.config.js -> module.rules
{
test: /\.less$/,
use: [
'vue-style-loader',
'css-loader',
'less-loader'
]
}
# Stylus
npm install -D stylus stylus-loader
// webpack.config.js -> module.rules
{
test: /\.styl(us)?$/,
use: [
'vue-style-loader',
'css-loader',
'stylus-loader'
]
}
# PostCSS
СОВЕТ
Vue Loader v15 больше не применяет трансформацию PostCSS по умолчанию. Вам необходимо использовать PostCSS через postcss-loader
.
npm install -D postcss-loader
// webpack.config.js -> module.rules
{
test: /\.css$/,
use: [
'vue-style-loader',
{
loader: 'css-loader',
options: { importLoaders: 1 }
},
'postcss-loader'
]
}
Конфигурация PostCSS может быть выполнена через postcss.config.js
или опции postcss-loader
. Подробнее можно прочитать в документации postcss-loader.
postcss-loader
может также применяться в комбинации с другими пре-процессорами, указанными выше.
# Babel
npm install -D babel-core babel-loader
// webpack.config.js -> module.rules
{
test: /\.js?$/,
loader: 'babel-loader'
}
Конфигурация Babel может быть выполнена через .babelrc
или опции babel-loader
.
# Исключение node_modules
Обычная практика, указывать exclude: /node_modules/
для правил транспиляции JS (например, babel-loader
) которые применяются к файлам .js
. Из-за изменений версии v15, если вы импортируете однофайловые компоненты SFC внутри node_modules
, его секция <script>
также будет исключена из транспиляции.
Чтобы обеспечить транспиляцию JS для однофайловых компонентов Vue в node_modules
, вам необходимо добавить для них исключение с помощью функции в опции exclude:
{
test: /\.js$/,
loader: 'babel-loader',
exclude: file => (
/node_modules/.test(file) &&
!/\.vue\.js/.test(file)
)
}
# TypeScript
npm install -D typescript ts-loader
// webpack.config.js
module.exports = {
resolve: {
// Добавляем `.ts` как обрабатываемое расширение.
extensions: ['.ts', '.js']
},
module: {
rules: [
// ... другие правила опущены
{
test: /\.ts$/,
loader: 'ts-loader',
options: { appendTsSuffixTo: [/\.vue$/] }
}
]
},
// ... плагин опущен
}
Конфигурация TypeScript может быть выполнена через tsconfig.json
. Также смотрите документацию для ts-loader.
# Pug
Обработка шаблонов несколько отличается, потому что большинство загрузчиков webpack для шаблонов, такие как pug-loader
, возвращают функцию шаблона вместо скомпилированной строки HTML. Вместо использования pug-loader
мы должны использовать загрузчик, который вернёт сырую строку HTML, например pug-plain-loader
:
npm install -D pug pug-plain-loader
// webpack.config.js -> module.rules
{
test: /\.pug$/,
loader: 'pug-plain-loader'
}
Теперь вы можете писать:
<template lang="pug">
div
h1 Hello world!
</template>
Если вы также собираетесь импортировать файлы .pug
как HTML-строки в JavaScript, вам нужно добавить в цепочку raw-loader
после загрузчика пре-процессора. Обратите внимание, что добавление raw-loader
сломает использование в компонентах Vue, поэтому потребуется два правила: одно для файлов Vue с использованием resourceQuery
, другое (fallback) для импортов из JavaScript:
// webpack.config.js -> module.rules
{
test: /\.pug$/,
oneOf: [
// это применяется к `<template lang="pug">` в компонентах Vue
{
resourceQuery: /^\?vue/,
use: ['pug-plain-loader']
},
// это применяется к импортам pug внутри JavaScript
{
use: ['raw-loader', 'pug-plain-loader']
}
]
}