webpack mini-css-extract-plugin => 在单个条目上输出多个 css-文件
webpack mini-css-extract-plugin => output multiple css-files on single entry
我如何为我的 gutenberg 块设置 webpack 以提取多个 css 文件并根据样式表的名称捆绑这些文件。
Zack Gordon 在 webpack 3 中使用了 Extract Text Plugin,效果非常好。但是对于 webpack 4,我不得不切换到 mini-css-extract-plugin,我不能再让它工作了。
在下面查看我当前的设置,以便您了解我正在尝试做什么。
这是我的项目文件夹:
Plugin folder
|-- [src]
| |-- [block1]
| | |-- block1.js
| | |-- style.scss
| | `-- editor.scss
| |-- [block2]
| | |-- block2.js
| | |-- style.scss
| | `-- editor.scss
| `-- index.js
`-- [build]
|-- index.js
|-- style.build.css
`-- editor.build.css
在block1.js / block2.js:
import './style.scss'
import './editor.scss'
在index.js中:
import './block1'
import './block2'
在webpack.config.js中:
const defaultConfig = require("./node_modules/@wordpress/scripts/config/webpack.config");
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module.exports = {
...defaultConfig,
optimization: {
...defaultConfig.optimization,
splitChunks: {
cacheGroups: {
style: {
name: 'style',
test: /style\.s?css$/,
chunks: 'all',
enforce: true,
},
editor: {
name: 'editor',
test: /editor\.s?css$/,
chunks: 'all',
enforce: true,
},
},
},
},
plugins: [
...defaultConfig.plugins,
new MiniCssExtractPlugin({
filename: 'blocks.[name].build.css'
}),
],
module: {
...defaultConfig.module,
rules: [
...defaultConfig.module.rules,
{
test: /\.s?css$/,
exclude: /node_modules/,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
'postcss-loader',
'sass-loader'
],
},
]
},
};
预期输出:
[build]
|-- blocks.editor.build.css
|-- index.js
|-- blocks.style.build.css
当前输出:
[build]
|-- blocks.editor.build.css
|-- editor.js
|-- index.js
|-- blocks.style.build.css
|-- style.js
`-- (...and indentical map files)
当前的设置吐出两个我不需要的额外 js 文件 (style.js/editor.js),但最大的问题是它也导致该块无法在 Wordpress 中加载。当我不使用 splitChunks 时它会加载,但是所有 css 都捆绑在一个文件中......我需要两个。
比较:
index.js 没有 splitChunks:
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = "./src/index.js");
/******/ })
index.js 分割块:
/******/ // add entry module to deferred list
/******/ deferredModules.push(["./src/index.js","editor","style"]);
/******/ // run deferred modules when ready
/******/ return checkDeferredModules();
/******/ })
查看我的评论,更改我的设置,现在可以使用了:
(好吧,它不再是一个单独的条目了,但是嘿:-)
项目文件夹:
Plugin folder
|-- [src]
| |-- [block1]
| | |-- block1.js
| | |-- style.scss
| | `-- editor.scss
| |-- [block2]
| | |-- block2.js
| | |-- style.scss
| | `-- editor.scss
| `-- index.js
| `-- css.js
`-- [build]
|-- index.js
|-- style.build.css
`-- editor.build.css
在css.js中:
import './block1/style.scss'
import './block1/editor.scss'
import './block2/style.scss'
import './block2/editor.scss'
在webpack.config.js中:
const defaultConfig = require("./node_modules/@wordpress/scripts/config/webpack.config");
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module.exports = {
...defaultConfig,
entry: {
index: path.resolve( process.cwd(), 'src', 'index.js' ),
css: path.resolve( process.cwd(), 'src', 'css.js' ),
},
optimization: {
...defaultConfig.optimization,
splitChunks: {
cacheGroups: {
style: {
name: 'style',
test: /style\.s?css$/,
chunks: 'all',
enforce: true,
},
editor: {
name: 'editor',
test: /editor\.s?css$/,
chunks: 'all',
enforce: true,
},
},
},
},
plugins: [
...defaultConfig.plugins,
new MiniCssExtractPlugin({
filename: 'blocks.[name].build.css'
}),
],
module: {
...defaultConfig.module,
rules: [
...defaultConfig.module.rules,
{
test: /\.s?css$/,
exclude: /node_modules/,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
'postcss-loader',
'sass-loader'
],
},
]
},
};
输出构建文件夹:
[build]
|-- blocks.editor.build.css
|-- index.js
|-- blocks.style.build.css
|-- style.js (ignore)
|-- editor.js (ignore)
|-- css.js (ignore)
`-- (...and indentical map files)
实际上您不需要多次输入。使用当前解决方案中的配置,您只缺少一个选项来使其按您想要的方式工作。 filename
选项必须根据块名称动态设置。
plugins: [
new MiniCssExtractPlugin({
filename: ({ chunk }) => `${chunk.name.replace('/js/', '/css/')}.css`,
})
],
这将为每个块创建一个 .css
文件。由于您已经有了 style
和 editor
块,它将创建 style.css
和 'editor.css',每个块都有相应的 css 或 scss在 js 文件中导入。
看起来像这样,唯一的补充是 filename
更改为 MiniCssExtractPlugin
选项,并删除了 css 条目。这应该有效。
module.exports = {
...defaultConfig,
entry: {
index: path.resolve( process.cwd(), 'src', 'index.js' ),
},
optimization: {
...defaultConfig.optimization,
splitChunks: {
cacheGroups: {
style: {
name: 'style',
test: /style\.s?css$/,
chunks: 'all',
enforce: true,
},
editor: {
name: 'editor',
test: /editor\.s?css$/,
chunks: 'all',
enforce: true,
},
},
},
},
plugins: [
...defaultConfig.plugins,
new MiniCssExtractPlugin({
filename: ({ chunk }) => `${chunk.name.replace('/js/', '/css/')}.css`,
// chunkFilename: "[name].css"
})
],
module: {
...defaultConfig.module,
rules: [
...defaultConfig.module.rules,
{
test: /\.s?css$/,
exclude: /node_modules/,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
'postcss-loader',
'sass-loader'
],
},
]
},
};
我如何为我的 gutenberg 块设置 webpack 以提取多个 css 文件并根据样式表的名称捆绑这些文件。
Zack Gordon 在 webpack 3 中使用了 Extract Text Plugin,效果非常好。但是对于 webpack 4,我不得不切换到 mini-css-extract-plugin,我不能再让它工作了。
在下面查看我当前的设置,以便您了解我正在尝试做什么。
这是我的项目文件夹:
Plugin folder
|-- [src]
| |-- [block1]
| | |-- block1.js
| | |-- style.scss
| | `-- editor.scss
| |-- [block2]
| | |-- block2.js
| | |-- style.scss
| | `-- editor.scss
| `-- index.js
`-- [build]
|-- index.js
|-- style.build.css
`-- editor.build.css
在block1.js / block2.js:
import './style.scss'
import './editor.scss'
在index.js中:
import './block1'
import './block2'
在webpack.config.js中:
const defaultConfig = require("./node_modules/@wordpress/scripts/config/webpack.config");
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module.exports = {
...defaultConfig,
optimization: {
...defaultConfig.optimization,
splitChunks: {
cacheGroups: {
style: {
name: 'style',
test: /style\.s?css$/,
chunks: 'all',
enforce: true,
},
editor: {
name: 'editor',
test: /editor\.s?css$/,
chunks: 'all',
enforce: true,
},
},
},
},
plugins: [
...defaultConfig.plugins,
new MiniCssExtractPlugin({
filename: 'blocks.[name].build.css'
}),
],
module: {
...defaultConfig.module,
rules: [
...defaultConfig.module.rules,
{
test: /\.s?css$/,
exclude: /node_modules/,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
'postcss-loader',
'sass-loader'
],
},
]
},
};
预期输出:
[build]
|-- blocks.editor.build.css
|-- index.js
|-- blocks.style.build.css
当前输出:
[build]
|-- blocks.editor.build.css
|-- editor.js
|-- index.js
|-- blocks.style.build.css
|-- style.js
`-- (...and indentical map files)
当前的设置吐出两个我不需要的额外 js 文件 (style.js/editor.js),但最大的问题是它也导致该块无法在 Wordpress 中加载。当我不使用 splitChunks 时它会加载,但是所有 css 都捆绑在一个文件中......我需要两个。
比较: index.js 没有 splitChunks:
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = "./src/index.js");
/******/ })
index.js 分割块:
/******/ // add entry module to deferred list
/******/ deferredModules.push(["./src/index.js","editor","style"]);
/******/ // run deferred modules when ready
/******/ return checkDeferredModules();
/******/ })
查看我的评论,更改我的设置,现在可以使用了: (好吧,它不再是一个单独的条目了,但是嘿:-)
项目文件夹:
Plugin folder
|-- [src]
| |-- [block1]
| | |-- block1.js
| | |-- style.scss
| | `-- editor.scss
| |-- [block2]
| | |-- block2.js
| | |-- style.scss
| | `-- editor.scss
| `-- index.js
| `-- css.js
`-- [build]
|-- index.js
|-- style.build.css
`-- editor.build.css
在css.js中:
import './block1/style.scss'
import './block1/editor.scss'
import './block2/style.scss'
import './block2/editor.scss'
在webpack.config.js中:
const defaultConfig = require("./node_modules/@wordpress/scripts/config/webpack.config");
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module.exports = {
...defaultConfig,
entry: {
index: path.resolve( process.cwd(), 'src', 'index.js' ),
css: path.resolve( process.cwd(), 'src', 'css.js' ),
},
optimization: {
...defaultConfig.optimization,
splitChunks: {
cacheGroups: {
style: {
name: 'style',
test: /style\.s?css$/,
chunks: 'all',
enforce: true,
},
editor: {
name: 'editor',
test: /editor\.s?css$/,
chunks: 'all',
enforce: true,
},
},
},
},
plugins: [
...defaultConfig.plugins,
new MiniCssExtractPlugin({
filename: 'blocks.[name].build.css'
}),
],
module: {
...defaultConfig.module,
rules: [
...defaultConfig.module.rules,
{
test: /\.s?css$/,
exclude: /node_modules/,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
'postcss-loader',
'sass-loader'
],
},
]
},
};
输出构建文件夹:
[build]
|-- blocks.editor.build.css
|-- index.js
|-- blocks.style.build.css
|-- style.js (ignore)
|-- editor.js (ignore)
|-- css.js (ignore)
`-- (...and indentical map files)
实际上您不需要多次输入。使用当前解决方案中的配置,您只缺少一个选项来使其按您想要的方式工作。 filename
选项必须根据块名称动态设置。
plugins: [
new MiniCssExtractPlugin({
filename: ({ chunk }) => `${chunk.name.replace('/js/', '/css/')}.css`,
})
],
这将为每个块创建一个 .css
文件。由于您已经有了 style
和 editor
块,它将创建 style.css
和 'editor.css',每个块都有相应的 css 或 scss在 js 文件中导入。
看起来像这样,唯一的补充是 filename
更改为 MiniCssExtractPlugin
选项,并删除了 css 条目。这应该有效。
module.exports = {
...defaultConfig,
entry: {
index: path.resolve( process.cwd(), 'src', 'index.js' ),
},
optimization: {
...defaultConfig.optimization,
splitChunks: {
cacheGroups: {
style: {
name: 'style',
test: /style\.s?css$/,
chunks: 'all',
enforce: true,
},
editor: {
name: 'editor',
test: /editor\.s?css$/,
chunks: 'all',
enforce: true,
},
},
},
},
plugins: [
...defaultConfig.plugins,
new MiniCssExtractPlugin({
filename: ({ chunk }) => `${chunk.name.replace('/js/', '/css/')}.css`,
// chunkFilename: "[name].css"
})
],
module: {
...defaultConfig.module,
rules: [
...defaultConfig.module.rules,
{
test: /\.s?css$/,
exclude: /node_modules/,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
'postcss-loader',
'sass-loader'
],
},
]
},
};