Extends
يمتد
string | string[]
تتيح لك الخاصية extends أن توسِّع تخصيصاً قائماً لتجعله أساساً تبني عليه. وهي تعتمد داخلياً على الحزمة webpack-merge لدمج التخصيصات، فتُعينك على تجنّب تكرار نفس الإعدادات بين عدّة ملفات تخصيص.
base.webpack.config.js
export default {
module: {
rules: [
{
test: /\.js$/,
use: "babel-loader",
exclude: /node_modules/,
},
{
test: /\.css$/,
use: ["style-loader", "css-loader"],
},
],
},
plugins: [
new webpack.DefinePlugin({
"process.env.NODE_ENV": JSON.stringify("production"),
}),
],
};webpack.config.js
import path from "node:path";
import { fileURLToPath } from "node:url";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
export default {
extends: path.resolve(__dirname, "./base.webpack.config.js"),
entry: "./src/index.js",
output: {
path: path.resolve(__dirname, "dist"),
filename: "bundle.js",
},
};توسعة عدّة تخصيصات
يمكنك أن توسِّع عدّة تخصيصات دفعةً واحدة بأن تُمرِّر مصفوفة من مسارات التخصيص إلى الخاصية extends.
تُدمَج التخصيصات الواردة في extends من اليمين إلى اليسار، بمعنى أنّ التخصيص الواقع على اليمين يندمج داخل التخصيص الواقع على اليسار. ويمكنك تجاوز قيمة ما بأن تُمرِّر نفس الخاصية في التخصيص الواقع على اليمين.
js.webpack.config.js
export default {
module: {
rules: [
{
test: /\.js$/,
use: "babel-loader",
exclude: /node_modules/,
},
],
},
};css.webpack.config.js
export default {
module: {
rules: [
{
test: /\.css$/,
use: ["style-loader", "css-loader"],
},
],
},
};webpack.config.js
import path from "node:path";
import { fileURLToPath } from "node:url";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
export default {
extends: [
path.resolve(__dirname, "./js.webpack.config.js"),
path.resolve(__dirname, "./css.webpack.config.js"),
],
entry: "./src/index.js",
output: {
path: path.resolve(__dirname, "dist"),
filename: "bundle.js",
},
};تجاوز التخصيصات
يمكنك تجاوز ما ورد في التخصيص المُوسَّع بأن تُمرِّر نفس الخاصية في التخصيص الذي يوسِّعه.
base.webpack.config.js
import path from "node:path";
import { fileURLToPath } from "node:url";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
export default {
output: {
path: path.resolve(__dirname, "dist"),
filename: "bundle.js",
},
};webpack.config.js
import path from "node:path";
import { fileURLToPath } from "node:url";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
export default {
extends: path.resolve(__dirname, "./base.webpack.config.js"),
entry: "./src/index.js",
// تجاوز مسار الإخراج واسم الملفّ
output: {
path: path.resolve(__dirname, "build"),
filename: "[name].bundle.js",
},
};ضمّ الـ rules والـ plugins
في حين أنّ القيم البدائية (كالنصوص) يُكتب فوقها، فإنّ حقول المصفوفات تُضمّ بعضها إلى بعض بدلاً من أن يُستبدل أحدها بالآخر. وهذا السلوك مصدره webpack-merge التي يستعملها webpack داخلياً عند معالجة extends.
base.webpack.config.js
import webpack from "webpack";
export default {
module: {
rules: [
{
test: /\.js$/,
use: "babel-loader",
},
],
},
plugins: [
new webpack.DefinePlugin({
__DEV__: false,
}),
],
};webpack.config.js
import path from "node:path";
import { fileURLToPath } from "node:url";
import webpack from "webpack";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
export default {
extends: path.resolve(__dirname, "./base.webpack.config.js"),
module: {
rules: [
{
test: /\.css$/,
use: ["style-loader", "css-loader"],
},
],
},
plugins: [new webpack.HotModuleReplacementPlugin()],
};النتيجة بعد الدمج
بدلاً من أن يُستبدل module بكامله، فإنّ مصفوفتي rules وplugins قد ضُمّتا.
import webpack from "webpack";
export default {
module: {
rules: [
// من base.webpack.config.js
{
test: /\.js$/,
use: "babel-loader",
},
// من webpack.config.js (مُلحَق)
{
test: /\.css$/,
use: ["style-loader", "css-loader"],
},
],
},
plugins: [
// من base.webpack.config.js
new webpack.DefinePlugin({
__DEV__: false,
}),
// من webpack.config.js (مُلحَق)
new webpack.HotModuleReplacementPlugin(),
],
};تحميل التخصيص من حزم خارجية
يمكنك أيضاً تحميل التخصيص من حزم طرف ثالث بتمرير اسم الحزمة إلى الخاصية extends. ويُشترط أن تُصدِّر الحزمة تخصيص webpack ضمن ملف package.json.
webpack.config.js
import path from "node:path";
import { fileURLToPath } from "node:url";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
export default {
extends: import.meta.resolve("webpack-config-foo"),
entry: "./src/index.js",
output: {
path: path.resolve(__dirname, "dist"),
filename: "bundle.js",
},
};


