Почему я не могу скомпилировать SASS с помощью Webpack?
У меня есть следующие модули в моей конфигурации Webpack:
module: {
preLoaders: [
{
test: /\.vue$/,
loader: 'eslint',
include: projectRoot,
exclude: /node_modules/
},
{
test: /\.js$/,
loader: 'eslint',
include: projectRoot,
exclude: /node_modules/
}
],
loaders: [
{
test: /\.vue$/,
loader: 'vue'
},
{
test: /\.js$/,
loader: 'babel',
include: projectRoot,
exclude: /node_modules/
},
{
test: /\.json$/,
loader: 'json'
},
{
test: /\.html$/,
loader: 'vue-html'
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url',
query: {
limit: 10000,
name: utils.assetsPath('img/[name].[hash:7].[ext]')
}
},
{
test: /\.scss$/,
loaders: ['style', 'css', 'sass']
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
loader: 'url',
query: {
limit: 10000,
name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
}
}
]
},
Вы можете видеть, что я использую sass-loader, а для *.scss файлов я определяю этот конвейер: ['style', 'css', 'sass']
.
Затем у меня есть файл scss:
html {
height: 100%;
}
body {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
}
(...)
Наконец, у меня есть моя HTML-страница (в VUE файле из vue.js), которая импортирует этот scss файл:
<script>
require('./styles/main.scss')
(...)
</script>
Но почему-то я получаю эту ошибку при запуске проекта:
ERROR in ./~/css-loader!./~/sass-loader!./~/style-loader!./~/css-loader!./~/sass-loader!./src/styles/main.scss
Module build failed:
html {
^
Invalid CSS after "...load the styles": expected 1 selector or at-rule, was "var content = requi"
in /Users/td/uprank/src/styles/main.scss (line 1, column 1)
@ ./src/styles/main.scss 4:14-247 13:2-17:4 14:20-253
Почему это неправильно? (Похоже, webpack пытается обработать ['css', 'sass', 'style', 'css', 'sass']
, а не только ['style', 'css', 'sass']
, как это было настроено в модулях.
Что я делаю неправильно?
Спасибо!
EDIT: Ссылка на полный пример проекта: https://dl.dropboxusercontent.com/u/1066659/dummy.zip
Ответы
Ответ 1
Причина, по которой это происходит, заключается в том, что Vue автоматически создает конфигурации загрузчика для CSS, SASS/SCSS, Stylus.
(см. projectRoot/build/utils.js
строки от ~ 10 до ~ 50)
Итак, вы видите ошибку, потому что у вас есть загрузчик webpack, который пытается импортировать файл, а затем Vue пытается импортировать (уже загруженный) файл. Таким образом, вы можете думать о своей цепочке загрузчиков как sass -> css -> style -> sass -> css -> vue-style
Чтобы решить эту проблему, вам нужно избавиться от загружаемого вами загрузчика:
{
test: /\.scss$/,
loaders: ['style', 'css', 'sass']
},
и просто полагайтесь на предоставленный загрузчик.
Вы можете загрузить таблицу стилей одним из двух способов:
ПРИМЕЧАНИЕ. Вы ДОЛЖНЫ использовать scss
вместо sass
, так как sass
будет пытаться проанализировать вашу таблицу стилей, используя синтаксис с отступом вместо синтаксиса скобки.
1
<style lang="scss">
@import './styles/main.scss
</style>
2:
<style src="./styles/main.scss"></style>
Оба из них импортируют таблицу стилей, последняя просто препятствует добавлению какого-либо дополнительного стиля в компонент.