मिनी-सीएसएस-एक्सट्रैक्ट प्लगइन के साथ वेबपैक 4 समाधान
वेबपैक टीम एक्सट्रेक्ट टेक्स्ट प्लगइन पर मिनी-सीएसएस-एक्सट्रैक्ट का उपयोग करने की सिफारिश करती है
यह समाधान आपको एक अलग हिस्सा बनाने की अनुमति देता है जिसमें केवल आपकी सीएसएस प्रविष्टियाँ होती हैं:
const path = require('path');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
function recursiveIssuer(m) {
if (m.issuer) {
return recursiveIssuer(m.issuer);
} else if (m.name) {
return m.name;
} else {
return false;
}
}
module.exports = {
entry: {
foo: path.resolve(__dirname, 'src/foo'),
bar: path.resolve(__dirname, 'src/bar'),
},
optimization: {
splitChunks: {
cacheGroups: {
fooStyles: {
name: 'foo',
test: (m, c, entry = 'foo') =>
m.constructor.name === 'CssModule' && recursiveIssuer(m) === entry,
chunks: 'all',
enforce: true,
},
barStyles: {
name: 'bar',
test: (m, c, entry = 'bar') =>
m.constructor.name === 'CssModule' && recursiveIssuer(m) === entry,
chunks: 'all',
enforce: true,
},
},
},
},
plugins: [
new MiniCssExtractPlugin({
filename: '[name].css',
}),
],
module: {
rules: [
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, 'css-loader'],
},
],
},
};
यहाँ मेरी व्यक्तिगत परियोजनाओं में से एक म्यूटेंटल प्रविष्टियों का उपयोग करके एक अधिक विरोधाभासी उदाहरण दिया गया है:
const ManifestPlugin = require('webpack-manifest-plugin')
const webpack = require('webpack')
const path = require('path')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const VENDOR = path.join(__dirname, 'node_modules')
const LOCAL_JS = path.join(__dirname, 'app/assets/js')
const LOCAL_SCSS = path.join(__dirname, 'app/assets/scss')
const BUILD_DIR = path.join(__dirname, 'public/dist')
const EXTERNAL = path.join(__dirname, 'public/external')
function recursiveIssuer(m) {
if (m.issuer) {
return recursiveIssuer(m.issuer);
} else if (m.name) {
return m.name;
} else {
return false;
}
}
module.exports = {
entry: {
vendor: [
`${VENDOR}/jquery/dist/jquery.js`,
`${VENDOR}/codemirror/lib/codemirror.js`,
`${VENDOR}/codemirror/mode/javascript/javascript.js`,
`${VENDOR}/codemirror/mode/yaml/yaml.js`,
`${VENDOR}/zeroclipboard/dist/ZeroClipboard.js`,
],
app: [
`${LOCAL_JS}/utils.js`,
`${LOCAL_JS}/editor.js`,
`${LOCAL_JS}/clipboard.js`,
`${LOCAL_JS}/fixtures.js`,
`${LOCAL_JS}/ui.js`,
`${LOCAL_JS}/data.js`,
`${LOCAL_JS}/application.js`,
`${LOCAL_JS}/google.js`
],
'appStyles': [
`${EXTERNAL}/montserrat.css`,
`${EXTERNAL}/icons.css`,
`${VENDOR}/purecss/pure-min.css`,
`${VENDOR}/purecss/grids-core-min.css`,
`${VENDOR}/purecss/grids-responsive-min.css`,
`${VENDOR}/codemirror/lib/codemirror.css`,
`${VENDOR}/codemirror/theme/monokai.css`,
]
},
optimization: {
splitChunks: {
cacheGroups: {
appStyles: {
name: 'appStyles',
test: (m, c, entry = 'appStyles') =>
m.constructor.name === 'CssModule' && recursiveIssuer(m) === entry,
chunks: 'all',
enforce: true,
},
},
},
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: [ 'script-loader'],
},
{
test: /\.(scss|css)$/,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
],
},
],
},
mode: 'development',
resolve: {
extensions: ['.js', '.css', '.scss']
},
output: {
path: BUILD_DIR,
filename: "[name].[chunkhash].js",
},
plugins: [
new ManifestPlugin(),
new MiniCssExtractPlugin({
filename: '[name].css'
}),
]
};
मुझे लगता है कि यह दृष्टिकोण बहुत मॉड्यूलर नहीं है, लेकिन इससे आपको निर्माण करने के लिए एक नींव मिलनी चाहिए और परियोजनाओं में वेबपैक को अपनाने के लिए एक उत्कृष्ट रणनीति है जहां आप जावास्क्रिप्ट और सीएसएस को मिश्रण नहीं करना चाहते हैं।
इस दृष्टिकोण के लिए नकारात्मक पक्ष यह है कि सीएसएस-लोडर अभी भी एक अतिरिक्त जावास्क्रिप्ट फ़ाइल (चाहे आप इसे उपयोग करने के लिए चुनते हैं या नहीं) उत्पन्न करता है, यह माना जाता है कि वेबपैक 5 में तय किया जाएगा ।
यदि मुझे अपने जेएस में मिश्रण नहीं करना है तो क्या मुझे गैर-जेएस परिसंपत्तियों के लिए वेबपैक का उपयोग करना चाहिए?
मुझे इसमें कुछ भी गलत नहीं दिखता, लेकिन अंततः यह कई बिल्ड सिस्टम के प्रबंधन के लिए आपकी सहनशीलता पर निर्भर करता है। मेरे लिए यह ओवरकिल जैसा लगता है, इसलिए मेरी प्राथमिकता वेबपैक पारिस्थितिकी तंत्र में बने रहना है।
ऊपर उल्लिखित रणनीतियों के बारे में अधिक जानकारी के लिए, कृपया https://github.com/webpack-contrib/mini-css-extract-plugin#extracting-css-based-on-entry देखें