Skip to content

Commit 835b2ed

Browse files
committed
Use mini-css-extract-plugin@^0.6.0 and embed webpack-manifest-plugin into Encore
1 parent d423c9e commit 835b2ed

17 files changed

+521
-66
lines changed

.eslintignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
lib/webpack/webpack-manifest-plugin.js

index.js

+28
Original file line numberDiff line numberDiff line change
@@ -913,6 +913,34 @@ class Encore {
913913
return this;
914914
}
915915

916+
/**
917+
* Configure the mini-css-extract-plugin.
918+
*
919+
* https://github.com/webpack-contrib/mini-css-extract-plugin#configuration
920+
*
921+
* ```
922+
* Encore.configureMiniCssExtractPlugin(
923+
* function(loaderConfig) {
924+
* // change the loader's config
925+
* // loaderConfig.reloadAll = true;
926+
* },
927+
* function(pluginConfig) {
928+
* // change the plugin's config
929+
* // pluginConfig.chunkFilename = '[id].css';
930+
* }
931+
* );
932+
* ```
933+
*
934+
* @param {function} loaderOptionsCallback
935+
* @param {function} pluginOptionsCallback
936+
* @returns {Encore}
937+
*/
938+
configureMiniCssExtractPlugin(loaderOptionsCallback, pluginOptionsCallback = () => {}) {
939+
webpackConfig.configureMiniCssExtractPlugin(loaderOptionsCallback, pluginOptionsCallback);
940+
941+
return this;
942+
}
943+
916944
/**
917945
* If enabled, the react preset is added to Babel.
918946
*

lib/WebpackConfig.js

+15
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,8 @@ class WebpackConfig {
146146
this.eslintLoaderOptionsCallback = () => {};
147147
this.tsConfigurationCallback = () => {};
148148
this.handlebarsConfigurationCallback = () => {};
149+
this.miniCssExtractLoaderConfigurationCallback = () => {};
150+
this.miniCssExtractPluginConfigurationCallback = () => {};
149151
this.loaderConfigurationCallbacks = {
150152
javascript: () => {},
151153
css: () => {},
@@ -453,6 +455,19 @@ class WebpackConfig {
453455
this.cssLoaderConfigurationCallback = callback;
454456
}
455457

458+
configureMiniCssExtractPlugin(loaderOptionsCallback, pluginOptionsCallback = () => {}) {
459+
if (typeof loaderOptionsCallback !== 'function') {
460+
throw new Error('Argument 1 to configureMiniCssExtractPluginLoader() must be a callback function.');
461+
}
462+
463+
if (typeof pluginOptionsCallback !== 'function') {
464+
throw new Error('Argument 2 to configureMiniCssExtractPluginLoader() must be a callback function.');
465+
}
466+
467+
this.miniCssExtractLoaderConfigurationCallback = loaderOptionsCallback;
468+
this.miniCssExtractPluginConfigurationCallback = pluginOptionsCallback;
469+
}
470+
456471
enableSingleRuntimeChunk() {
457472
this.shouldUseSingleRuntimeChunk = true;
458473
}

lib/config-generator.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -405,9 +405,7 @@ class ConfigGenerator {
405405
buildPluginsConfig() {
406406
const plugins = [];
407407

408-
if (this.webpackConfig.extractCss) {
409-
miniCssExtractPluginUtil(plugins, this.webpackConfig);
410-
}
408+
miniCssExtractPluginUtil(plugins, this.webpackConfig);
411409

412410
// register the pure-style entries that should be deleted
413411
deleteUnusedEntriesPluginUtil(plugins, this.webpackConfig);

lib/loaders/css-extract.js

+13-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
const WebpackConfig = require('../WebpackConfig'); //eslint-disable-line no-unused-vars
1313
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
14+
const applyOptionsCallback = require('../utils/apply-options-callback');
1415

1516
module.exports = {
1617
/**
@@ -32,6 +33,17 @@ module.exports = {
3233
}, ...loaders];
3334
}
3435

35-
return [MiniCssExtractPlugin.loader, ...loaders];
36+
// Default options
37+
const options = {
38+
hmr: webpackConfig.useHotModuleReplacementPlugin(),
39+
};
40+
41+
return [{
42+
loader: MiniCssExtractPlugin.loader,
43+
options: applyOptionsCallback(
44+
webpackConfig.miniCssExtractLoaderConfigurationCallback,
45+
options
46+
),
47+
}, ...loaders];
3648
}
3749
};

lib/plugins/manifest.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
'use strict';
1111

1212
const WebpackConfig = require('../WebpackConfig'); //eslint-disable-line no-unused-vars
13-
const ManifestPlugin = require('webpack-manifest-plugin');
13+
const ManifestPlugin = require('../webpack/webpack-manifest-plugin');
1414
const PluginPriorities = require('./plugin-priorities');
1515
const applyOptionsCallback = require('../utils/apply-options-callback');
1616
const sharedEntryTmpName = require('../utils/sharedEntryTmpName');

lib/plugins/mini-css-extract.js

+12-1
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,19 @@
1212
const WebpackConfig = require('../WebpackConfig'); //eslint-disable-line no-unused-vars
1313
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
1414
const PluginPriorities = require('./plugin-priorities');
15+
const applyOptionsCallback = require('../utils/apply-options-callback');
1516

1617
/**
1718
* @param {Array} plugins
1819
* @param {WebpackConfig} webpackConfig
1920
* @return {void}
2021
*/
2122
module.exports = function(plugins, webpackConfig) {
23+
// Don't add the plugin if CSS extraction is disabled
24+
if (!webpackConfig.extractCss) {
25+
return;
26+
}
27+
2228
// Default filename can be overridden using Encore.configureFilenames({ css: '...' })
2329
let filename = webpackConfig.useVersioning ? '[name].[contenthash:8].css' : '[name].css';
2430
// the chunk filename should use [id], not [name]. But, due
@@ -45,7 +51,12 @@ module.exports = function(plugins, webpackConfig) {
4551
};
4652

4753
plugins.push({
48-
plugin: new MiniCssExtractPlugin(miniCssPluginOptions),
54+
plugin: new MiniCssExtractPlugin(
55+
applyOptionsCallback(
56+
webpackConfig.miniCssExtractPluginConfigurationCallback,
57+
miniCssPluginOptions
58+
)
59+
),
4960
priority: PluginPriorities.MiniCssExtractPlugin
5061
});
5162
};

0 commit comments

Comments
 (0)