#javascript #webpack #sass
#javascript #webpack #sass
Вопрос:
Я думаю, что я правильно следовал документации, но это вообще не работает.
Что я хочу, так это сгенерировать файл css и не загружать его в тегах стиля с помощью js.
В моем каталоге src:: «scss / custom.scss» и «style.scss», и ни один из них не генерируется на выходе.
РЕДАКТИРОВАТЬ: src-код:https://github.com/marcosroot/webpackexample
Мои настройки:
const path = require('path');
const BundleTracker = require('webpack-bundle-tracker');
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const devMode = true;
module.exports = {
entry: [
'./src/toggle_menu.js',
'./src/calls_apis.js'
],
output: {
path: path.resolve(__dirname, "dist"),
filename: devMode ? 'main.js' : 'main.[hash].js',
},
plugins: [
new BundleTracker({
filename: './webpack-stats.json'
}),
new MiniCssExtractPlugin({
filename: devMode ? '[name].css' : '[name].[hash].css'
})
],
module: {
rules: [{
test: /.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
}
},
{
test: /.scss$/,
include: path.resolve(__dirname, 'scss/custom.scss'),
use: [
MiniCssExtractPlugin.loader,
'css-loader',
'postcss-loader',
'sass-loader',
]
}
]
},
}
Комментарии:
1. Похоже, вам нужно указать относительный путь к вашему выводу. У меня есть следующая конфигурация в моем проекте
new MiniCssExtractPlugin({filename: DEV ? '../css/_.css' : '../css/_-[contenthash].css'}),
Ответ №1:
Этот вопрос относительно старый, но я столкнулся с такой же проблемой и хотел поделиться своим решением. Это, вероятно, очень зависит от вашей конфигурации, но в любом случае, мой mini-css-extract-plugin
не сработал, потому что:
- Я запустил его с
webpack -p
(который является псевдонимом для производственного режима minify) - Правило css, которое я установил, не разъясняло, что оно создает побочные эффекты.
В результате, когда я запустил сборку в рабочем режиме (т. Е. webpack -p
), она не выдала результат, потому что, когда webpack увидел это…
import './my-css-file.css';
… и было что-то вроде «это ничего не дает, я удалю это из вашей сборки».
Итак, чтобы сообщить webpack, что этот тип файла имеет значение, вы должны пометить правило как sideEffects: true
// ...
module.exports = {
// ...
module: {
rules: [
{
test: /.css$/,
use: [MiniCssExtractPlugin.loader, 'css-loader'],
include: [/* fill this in */],
exclude: /node_modules/,
// 👇👇👇
sideEffects: true, // 👈 ADD THIS
// 👆👆👆
},
],
},
// ...
}
Комментарии:
1. Спасибо, что добавили это. Я имел дело с этой же проблемой при управлении правилом для модулей css и правилом для модулей, отличных от css. Правило non css module было по существу удалено из пакета, и я не мог понять, почему. Конечно, это сработало так, как ожидалось.
2. Спасибо. Это именно то, что мне тоже было нужно.
Ответ №2:
Я думаю, что ваша проблема связана с неправильным разрешением пути в вашей конфигурации :
include: path.resolve(__dirname, 'scss/custom.scss'),
Это означает, что webpack должен включать только ресурс, расположенный под {root}/scss/custom.scss
и, учитывая ваше объяснение, я предполагаю, что правильный путь должен быть {root}/src/scss/custom.scss
.
Итак, чтобы включить ваши два файла {root}/src/scss/custom.scss
и {root}/src/styles.scss
и любые другие файлы scss в src
папку, вы можете использовать :
module: {
rules: [{
test: /.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
}
},
{
test: /.scss$/,
include: /src/, // <-- Change here ---------------------
use: [
MiniCssExtractPlugin.loader,
'css-loader',
'postcss-loader',
'sass-loader',
]
}
]
},
Вы также можете просто удалить include
опцию, если вы уверены, что в вашем проекте или модулях узла нет других перемещаемых файлов scss, которые могут быть найдены и не должны быть включены одновременно (вероятно, это так).
Вы также можете предоставить массив из двух файлов, добавив src в разрешение пути :
include: [
path.resolve(__dirname, 'src/scss/custom.scss'),
path.resolve(__dirname, 'src/styles.scss'),
]
****** РЕДАКТИРОВАТЬ *******
После вашего комментария и из вашего репозитория есть еще несколько ошибок :
postcss-loader
не включен в качестве зависимости от разработчика и для него также нет конфигурации- Вы ошибаетесь в том, что является
include
опцией правила. Это просто означает, что только ресурсы, соответствующие включаемому тесту, будут обрабатываться так, как настроено в этом правиле. Вам все равно нужно запросить файлы scss в какой-то момент вашего скрипта.
Я разветвил ваше репозиторий и настроил правильную конфигурацию с импортом scss в call_api.js (одна из ваших точек входа). Создайте, и вы увидите файл css в папке dist (я настроил глупую конфигурацию cssnano для postcss, которая будет обработана жестко)
Ответ №3:
Вам необходимо указать относительный путь в вашем имени файла или publicPath: '../'
в конфигурации вашего загрузчика https://www.npmjs.com/package/mini-css-extract-plugin#minimal-example
В моем проекте у меня есть
new MiniCssExtractPlugin({filename: DEV ? '../css/styles.css' : '../css/styles-[contenthash].css'}),
В документации приведен пример с общедоступным путем
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
module.exports = {
plugins: [
new MiniCssExtractPlugin({
// Options similar to the same options in webpackOptions.output
// both options are optional
filename: "[name].css",
chunkFilename: "[id].css"
})
],
module: {
rules: [
{
test: /.css$/,
use: [
{
loader: MiniCssExtractPlugin.loader,
options: {
// you can specify a publicPath here
// by default it use publicPath in webpackOptions.output
publicPath: '../'
}
},
"css-loader"
]
}
]
}
}