وب پک ( webpack ) در ری اکت چیست ؟ webpack در react چه کاربردی داره ؟
وب پک ( webpack ) در ری اکت یک ماژول باندلر به حساب میاد که وظیفه مدیریت و باندل کردن ( یا همون پک کردن ) Dependencies های پروژه ری اکتی مارو به عهده داره. میشه اینجوری گفت که webpack در ری اکت میاد تمام فایلهای پروژه مثل فایلهای js ،css، تصاویر و .. رو به یک فایل واحد تبدیل میکنه ( پک میکنه ).
با انجام اینکار مرورگر خیلی راحت تر میتونه با دانلود 1 فایل به تمام فایلهای مورد نیاز اپیکیشن ما دسترسی داشته باشه.
البته تو این 2 پاراگراف خیلی خلاصه webpack رو معرفی کردیم ..
اگه میخواین کاربرد وب پک در ری اکت رو بدونین، تو این مقاله با فِرانت اِندی همراه باشین 🙂
وب پک ( webpack ) چیست ؟
وب پک یک ماژول باندلر ( module bundler ) برای اپیکیشن های پیشرفته جاوااسکریپتی به حساب میاد که تمام فایلهای پروژه رو به یک فایل واحد ( bundle.js ) تبدیل میکنه.
اگه بخوایم بگیم در پشت صحنه وب پک در ری اکت چه اتفاقی میوفته، میشه گفت که webpack در ری اکت یک نقشه از وابستگی ماژول ها ( پکیج ها ) برای خودش درست میکنه.
علاوه بر این، وب پک در ری اکت به ما اجازه میده از loader ها و پلاگین های مختلف برای موارد مختلف مثل minification، linting یا hot module استفاده کنیم. معمولا تو پروژه هایی که با ری اکت توسعه میدیم، از webpack در فاز development استفاده میکنیم.
در نهایت هم برای اینکه از پروژه خودمون Build بگیریم و به فاز production بریم، میتونیم از وب پک در ریکت کمک بگیریم. ( برای Build گرفتن )
برای شروع استفاده از webpack در ری اکت میتونیم یک مسیر ( path ) به webpack بدیم. این مسیر معمولا entry point پروژه ما هست مثل فایل index.js یا main.js …
پس از انجام اینکار، وب پک شروع به جستجو و بررسی پروژه ما میکنه.
اینکه میگیم جستجو میکنه یعنی میاد تمام مواردی که بهش مروبط هست رو آنالیز میکنه ( مواردی مثل فایلهای require، import ، css ها ، URL ها، تصاویر، فونت ها و .. )
در حقیقت میاد و وابستگی های پروژه مارو پیدا میکنه تا بتونه فایل bundle.js رو بسازه.
حالا شاید سوال برامون پیش بیاد که webpack در ریکت چیکار میکنه؟
وب پک چیکار میکنه ؟
اگه بخوایم خلاصه بگیم که webpack در ری اکت دقیقا چیکار میکنه میتونیم به موارد زیر اشاره کنیم :
- منابع پروژه مارو باندل ( پک ) میکنه.
- به کمک Babel اجازه میده که از جدیدترین ویژگی های جاوااسکریپت استفاده کنیم ( حتی در مرورگر های قدیمی )
- یک web server در زمان توسعه اپیکیشن و پروژه در اختیار ما میزاره
- کد های بلااستفاده پروژه رو حذف میکنه
خب دیگه مباحث مقدماتی کافیه، بریم سراغ اصل مطلب 🙂
وب پک در ری اکت شامل چه مواردی میشه ؟
چند مفهوم مهم درمورد وب پک در ری اکت وجود داره که باید درکشون کنیم.
این موارد عبارتند از :
مفهوم Loaders در وب پک
مفهوم Dev Server در وب پک
مفهوم Plugins در وب پک
مفهوم Entry در وب پک
مفهوم Output در وب پک
اصلا نگران نباشید چون قراره هرکدوم از این مفاهیم رو باهمدیگه بررسی کنیم و یاد بگیریم 🙂
Entry در وب پک چیست ؟
درحقیقت Entry یک آدرس ( end point ) هست که وب پک در ریکت از طریق این آدرس graph وابستگی های پروژه رو مشخص میکنه.
این آدرس ( end point ) به webpack یک نقطه شروع میده تا وب پک در react بتونه کار خودش رو شروع کنه.
برای تعریف Entry کافیه به فایل webpack.config.js بریم و بصورت زیر end point اپیکیشن خودمون رو به وب پک بدیم :
module.exports =
{
entry: "./src/index.js"
}
حالا که entry رو مشخص کردیم، میتونیم بریم سراغ output در وب پک!
Output در وب پک چیست ؟
زمانیکه webpack در ری اکت کار خودش رو انجام میده و تمام فایلهای اپیکیشن مارو پک میکنه ( باندل میکنه )، فایل نهایی bundle.js رو باید یک جایی ذخیره کنه. این آدرس رو از طریق output میتونیم به وب پک اعلام کنیم.
علاوه بر آدرس خروجی وب پک، ما میتونیم یکسری تنظیمات اضافه درمورد خروجی webpack تنظیم کنیم:
module.exports = {
entry: "./src/index.js"
output: {
path: "Idist/assets",
filename: "bundle.js",
publicPath: "assets"
}
}
Loaders در وب پک چیست ؟
Loaders یکی از ویژگی های اصلی webpack در ری اکت هست و به ما اجازه میده assets های خودمون ( تصاویر، CSS ها و ..) رو به ماژول تبدیل کنیم.
اگه بخوایم ساده تر بهش اشاره کنیم، Loaders ها از ما یک ورودی میگیرن و روی ورودی یکسری پردازش انجام میدن ( مثل linting ) و در نهایت اون ورودی رو به ماژول تبدیل میکنن.
ما میدونیم که وب پک باید مدیریت تمام فایلهای assets مثل فایلهای جاوااسکریپت، css، تصاویر و .. رو انجام بده.
این نکته رو هم در نظر داشته باشیم که وب پک در ری اکت، با اینکه فقط جاوااسکریپت رو درک میکنه اما تمام دارایی های پروژه مارو به عنوان یک ماژول در نظر میگیره. یعنی هر تصویر، هر CSS و .. یک ماژول هستن.
برای تنظیم Loaders در وب پک باید به فایل webpack.config.js مراجعه کنیم:
( بعدا بیشتر راجب Loaders صحبت میکنیم )
module.exports = {
module: {
loaders: [{
test: /\.(js|jsx)$/,
exclude: /(node_modules)/,
loader: 'babel-loader',
query: {
presets: ('es2015', •react, 'stage-Ol']
}
}, ]
}
}
Dev Server در وب پک چیست ؟
webpack-dev-server یک ابزار قدرتمند هست که توسط خود وب پک ارائه میشه و به ما اجازه میده خیلی ساده تر بتونیم اپیکیشن خودمون رو توسعه بدیم.
ابزار Dev Server به عنوان یک سرور محلی هم شناخته میشه و قابلیت ریلود زنده ( live reload ) اپیکیشن رو به ما ارائه میده. یعنی اگه ما تغییری در کد خودمون اعمال کنیم، وب پک بصورت خودکار این تغییر رو شناسایی میکنه، کد رو کامپایل میکنه و صفحه رو reload میکنه.
برای تنظیم webpack Dev Server کافیه به فایل کانفیگ وب پک در ری اکت بریم و بصورت زیر عمل کنیم :
module.exports = {
devServer: {
inline: true,
contentBase: './dist',
port: 8080
},
};
Plugins در وب پک چیست ؟
Plugins در وب پک نقش مهمی در توسعه ی اپیکیشن ها داره. در حقیقت به کمک Plugins میتونیم پروسه Build اپیکیشن رو طبق نیاز خودمون شخصی سازی کنیم.
پلاگین های وب پک، هرکدوم یک وظیفه مشخص دارن و روی کل اپیکیشن تاثیر میزارن.
برای وب پک Plugins های خیلی زیادی وجود داره مثل :
پلاگین HtmlWebpackPlugin : این پلاگین ارائه فایل های HTML رو برای مرورگر خیلی ساده تر میکنه.
پلاگین HotModuleReplacementPlugin : این پلاگین ویژگی Hot Module Replacement یا همون HMR رو فعال میکنه.
برای استفاده از پلاگین های Webpack میتونیم بصورت زیر عمل کنیم :
query: {
presets: Ces2015 ', '
react ', •stage-m,
plugins: ['react-html-attrs'],
}
وب پک در ری اکت چطور کار میکنه ؟
حالا که تونستیم با webpack در ری اکت و ویژگی های اصلی اون آشنا بشیم، بریم ببینیم که اصلا وب پک در ری اکت چطور کار میکنه ؟!
ما تو هر پروژه فایلهای خیلی زیادی داریم که معمولا عبارتند از: HTML ها، CSS ها، JS ها، فونت ها، تصاویر و …
در ری اکت خروجی اپیکیشن ما یک فایل index.html هست چون اپیکیشن های ری اکتی تک صفحه ( SPA ) هستن. وب پک تمام فایلهای پروژه ( شاید صدها فایل ) رو بهینه میکنه و بعد از باندل کردن بصورت Link به فایل index.html اضافه میکنه.
زمانیکه از وب پک در React استفاده میکنیم شاید اصلا نیاز به انجام تنظیمات یا کانفیگ در وب پک نداشته باشیم چون کانفیگ اولیه خود وب پک در ری اکت خیلی خوب انجام شده.
ری اکت از ما یک نقطه شروع میگیره که در ابتدای همین مقاله درموردش صحبت کردیم. این نقطه شروع در فایل کانفیگ وب پک مشخص شده.
وب پک از این فایل شروع به جستجوی ماژول ها و وابستگی های هر ماژول میکنه تا بتونه یک گراف کامل از تمام ماژول ها و وابستگی های پروژه ما ایجاد کنه.
این جستجو به واسطه شناسایی import ها و require ها برای پیدا کردن ماژول ها انجام میشه. زمانیکه webpack در ری اکت تمام ماژول های اپیکیشن مارو پیدا میکنه، میره سراغ Loaders ها.
Loaders های وب پک، هر ماژول رو بر اساس نیازی که ما مشخص کردیم باندل میکنه. مثلا کد های ES6 به ES5 تبدیل میشن یا کد های JSX به جاوااسکریپت تبدیل میشن.
زمانیکه کار Loaders به اتمام میرسه، خروجی یک یا چند فایل bundle.js هست و در محلی که خودمون در فایل webpack.config.js مشخص کردیم ذخیره میشن.
این فایل های باندل بصورت Link داخل فایل HTML ما قرار میگیرن. زمانیکه فایل HTML برای کاربر دانلود میشه، فایل یا فایلهای Bundle.js نیز دانلود میشه.
حالا شاید بپرسیم مزیت این ماجرا کجاست؟
مرورگر فقط یک یا چند فایل bundle.js دانلود میکنه اما درحالت عادی باید ده ها یا حتی صدها فایل دانلود میکرد تا اپیکیشن ما برای کاربر به درستی نمایش داده بشه.
با انجام اینکار صفحه و اپیکیشن ما خیلی سریعتر و بهینه تر برای کاربر نمایش داده میشه.
البته راجب مزیت های وب پک برای محیط development ( زمان توسعه پروژه ) هم صحبت کردیم که یکیش reload و کامپایل خودکار پروژه بود که اجازه میداد بدون refresh تغییرات جدید رو در مرورگر ببینیم.
بطور ساده و خلاصه، وب پک در ری اکت یک ابزار خیلی خیلی ضروریه که تو اپیکیشن های جاوااسکریپتی بزرگ به ما اجازه میده خیلی بهتر بتونیم پروژه خودمون رو که صدها فایل مختلف داره مدیریت کنیم و اپیکیشن ما خیلی بهینه تر به مرورگر ارائه بشه.
نصب webpack در ری اکت
برای نصب وب پک در React ما ابتدا باید Node و NPM رو نصب کرده باشیم تا بتونیم ابتدا یک پروژه ری اکتی بسازیم ( ما فرض میکنیم که Node و NPM رو روی سیستم خودمون نصب کردیم )
حالا وارد یک Code Editor مثل VS Code میشیم و توی ترمینال دستور زیر رو وارد میکنیم :
$ npm init -y
با انجام دستور بالا یک فایل package.json برای ما ایجاد میشه. حالا باید یک پروژه ری اکتی بسازیم. با دستور زیر ری اکت و پیش نیاز های ری اکت برای ما نصب میشن :
npm i react react-dom --save
حالا ما باید Webpack رو نصب کنیم + پیش نیاز هایی که از وب پک لازم داریم:
npm i webpack webpack-dev-server webpack-cli --save--dev
انتهای دستور بالا از dev استفاده کردیم، یعنی به ری اکت اطلاع دادیم که این dependencies فقط در زمان توسعه ( development ) استفاده بشه.
حالا که webpack و ری اکت برای ما نصب شدن، میتونیم بریم سراع اعمال کانفیگ و تنظیمات وب پک در ریکت.
ساختار فایل های پروژه ما باید بصورت زیر باشه :
فایل index.html ما بصورت زیر هست :
سلاام - FrontEndi.com
و فایل index.js ما بصورت زیر :
import React from "react";
import ReactDOM from "react-dom";
import App from "./App"; ReactDOM.render( , document.getElementById("app"));
...
import React from "react";
export default function App() {
return سلام 🙂
;
}
اپیکیشن ما صرفا یک متن ساده در مرورگر نمایش میده اما این برای تست عملکرد وب پک در ری اکت کافیه 🙂
تنظیم Loaders در اپیکیشن ری اکتی :
تو این مقاله درمورد اهمیت Loaders در وب پک صحبت کردیم و گفتیم که Loaders های خیلی زیادی وجود داره مثل babel-loader که برای تبدیل JSX به جاوااسکریپت کاربرد داره.
برای استفاده از babel-loader میتونیم از دستور زیر استفاده کنیم:
npm i -D @babel/core @babel/preset-env @babel/preset-react babel-loader
حالا باید به وب پک بگیم که از Babel برای باندل کردن استفاده کن:
const path = require("path");
module.exports = {
entry: "/src/index.js",
output: { path: path.resolve(__dirname, "dist") },
module: {
rules: [
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
use: {
loader: "babel-loader",
options: {
presets: ["@babel/preset-env", "@babel/preset-react"],
},
},
},
],
},
};
باندل کردن اپیکیشن ری اکتی :
ما به کمک یک دستور میتونیم اپیکیشن ری اکتی خودمون رو به کمک Webpack باندل کنیم اما بهتره که این دستور رو دستی وارد نکنیم. ما میخوایم این دستور همیشه در زمان Build اپیکیشن اجرا بشه. پس به فایل package.json میریم و در بخش اسکریپت دستور webpack رو قرار میدیم :
{
"name": "tutorial-react-webpack",
"version": "1.0.0",
"description": "Configuring webpack for React",
"main": "index.js",
"scripts": {
"build": "webpack"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
"@babel/core": "^7.13.16",
"@babel/preset-env": "^7.13.15",
"@babel/preset-react": "^7.13.13",
"babel-loader": "^8.2.2",
"webpack": "^5.35.1",
"webpack-cli": "^4.6.0"
}
}
حالا اگه دستور npm run build رو در ترمینال وارد کنیم، پروژه ما به کمک webpack بیلد میشه و خروجی که یک فایل با نام main.js در پوشه dist هست ایجاد میشه.
حالا باید این فایل main.js که باندل وب پک ما هست رو به فایل index.html ضمیمه کنیم تا برای کاربر دانلود بشه.
پس به فایل index.html میریم و این اسکریپت رو بهش اضافه میکنیم:
React with Webpack
با انجام اینکار، اپیکیشن ما در مرورگر نمایش داده میشه 🙂
البته ما اینکار رو بصورت دستی انجام دادیم.
پلاگین HtmlWebpackPlugin :
کاری که ما بالاتر انجام دادیم ( رفتیم سراغ فایل html و آدرس فایل main.js رو دستی بصورت اسکریپت داخلش قرار دادیم ) خیلی مسخره و خسته کنندس!
ما نمیخوایم اینکار رو بصورت دستی انجام بدیم و میخوایم هر اسکریپت بصورت خودکار داخل فایل html ما قرار بگیره.
برای اینکار باید از افزونه HtmlWebpackPlugin استفاده کنیم، پس دستور زیر رو برای نصب این پلاگین در ترمینال وارد میکنیم:
npm i -D HTML-webpack-plugin
پس از نصب این پلاگین، باید به فایل تنظیمات وب پک در ری اکت بریم و این پلاگین رو در بخش plugins اضافه کنیم:
const path = require("path");
const HtmlWebPackPlugin = require("html-webpack-plugin");
module.exports = {
entry: "/src/index.js",
output: {
path: path.resolve(__dirname, "dist"),
},
module: {
rules: [
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
use: {
loader: "babel-loader",
options: {
presets: ["@babel/preset-env", "@babel/preset-react"],
},
},
},
],
},
plugins: [
new HtmlWebPackPlugin({
template: "./src/index.html",
}),
],
};
پس از نصب این پلاگین، فایل اسکریپت بصورت خودکار داخل فایل index.html لینک میشه و دیگه نیازی نیست بصورت دستی این کار رو انجام بدیم.
استفاده از webpack در react ضروریه ؟
وب پک یک ماژول باندلر ( module bundler ) برای اپیکیشن های جاوااسکریپتی به حساب میاد و مزایا و معایب خاص خودش رو داره.
وب پک برای باندل کردن ( بسته بندی ) و بهینه سازی فایلهای پروژه ما خیلی مفیده.
در جریان باشیم که هیچ اجباری برای استفاده از webpack در react وجود نداره و ما میتونیم از ابزار های مشابه دیگه ای مثل Browserify، Brunch یا Parsel هم بهره ببریم.
اما با توجه به جامعه آماری قوی که وب پک داره، پیشنهاد میکنیم حتما از وب پک در ری اکت یا هر اپیکیشن جاوااسکریپتی دیگه ای استفاده کنید.
مرورگر ها درکی از کد های JSX یا ES ندارن !
ما میدونیم که مرورگر ها هیچ درک و فهمی از کدهای JSX یا ES که در ری اکت مینویسیم، ندارن! این وب پک هست که کد های JSX و ES رو به جاوااسکریپت ترجمه میکنه و به مرورگر ها کمک میکنه کد های ما رو متوجه بشن. ( به کمک Babel )
مزایای webpack در ری اکت چیست ؟
- توسعه اپیکیشن های SPA ( تک صفحه ای ) رو راحت میکنه.
- تمام فایلهای پروژه مارو به یک فایل واحد باندل میکنه ( هرچی html,css,js,image,font داریم به یک فایل تبدیل میکنه تا مرورگر با یک درخواست کل موارد مورد نیاز رو دریافت کنه )
- وب پک در ری اکت کد های بلااستفاده رو حذف میکنه و حتی کدهای مارو بهینه میکنه تا حجم نهایی فایل bundle.js کم بشه. ( باعث میشه سرعت لود سایت بهینه بشه )
- وب پک در react یک عالمه پلاگین و ابزار داره که هرکدوم کلی مزیت به اپیکیشن ری اکتی ما اضافه میکنن.
- از import و require توی کد پشتیبانی میکنه.
- webpack در ری اکت کدهای مارو به فایلهای جداگانه تقسیم میکنه و این باعث میشه هر کاربر فقط تیکه کد مورد نیاز خودش رو دانلود کنه ( نه کد هایی که بهش نیاز نداره )
- وب پک جامعه آماری خیلی بزرگی داره و تقریبا به هر مشکلی بر بخوریم، راه حلش از قبل مشخص شده.
- webpack سازگاری خیلی خوبی با کتابخانه ها و فریمورک های جاوااسکریپتی مثل React، Vue و Angular داره.
- ویژگی Hot Reload رو فعال میکنه.
- محبوب ترین ابزار ساخت ( Build ) به حساب میاد.
معایب webpack در ری اکت چیست ؟
از مهمترین معایب وب پک میشه به موارد زیر اشاره کرد؟
- وب پک تنظیمات و کانفیگ سختی داره ( البته میتونیم از کانفیگ های آماده استفاده کنیم )
- یادگیری وب پک خیلی پیچیدس و منابع آموزشی خوبی نداره ( مخصوصا برای تازه وارد ها )
- وب پک برای پروژه های کوچیک و متوسط عالی عمل میکنه اما برای پروژه های خیلی بزرگ، زمان Build رو خیلی افزایش میده.
- ارور های وب پک واضح نیستن و خیلی گیج کننده هستن!
- یکسره آپدیت میده و این کمی اذیت کننده و گیج کنندس!
وب پک یا vite ؟
به عنوان یک Front-End Developer باید یک ابزار ساخت خوب و مناسب برای توسعه اپیکیشن های تحت وب خودمون انتخاب کنیم.
ابزار Vite و Webpack اهداف مشابهی دارن.
ما تو مقاله ابزار Vite حسابی این ابزار قدرتمند رو بررسی کردیم ( اگه با Vite آشنا نیستید، مقاله رو مطالعه کنید )
اما اگه بخوایم بین این 2 ابزار یکی رو انتخاب کنیم، کدوم بهتره ؟
صادقانه اگه بخوایم بین Vite و Webpack یکی رو انتخاب کنیم، باید به نیاز پروژه خودمون نگاه کنیم چون این 2 ابزار امکانات مشابهی دارن.
پس لطفا مزایا و معایب Webpack که تو این مقاله مطرح کردیم + مزایا و معایب Vite که لینکش در پاراگراف بالا موجوده رو در نظر بگیرید و یکی رو انتخاب کنید.
بطور کل ابزار Vite نسبت به Webpack این مزیت هارو داره :
- برای پروژه های جدید بهتره.
- سرعتش خیلی بیشتره.
- یادگیری و پیکربندیش خیلی آسونه.
- از Rollup استفاده میکنه که باعث شده خروجی اپیکیشن خیلی بهینه باشه.
و webpack نسبت به Vite این مزیت هارو داره :
- جامعه آماری خیلی بزرگی داره.
- تنظیمات پیچیده برای نیاز های پیچیده داره.
- پلاگین و Loaders های خیلی زیادی داره.
جمع بندی
ما تو این مقاله webpack در ری اکت رو بررسی کردیم و دیدیم که چه مزایا و معایبی داره و چطور میشه از وب پک در ری اکت استفاده کرد 🙂
همچنین درمورد پلاگین ها و ویژگی های اصلی webpack و مقایسه وب پک با vite صحبت کردیم.
با توجه به مزایای خیلی خیلی زیادی که webpack داره پیشنهاد میکنم از webpack یا Vite در ری اکت استفاده کنید.
وب پک یک ماژول باندلر ( module bundler ) برای اپیکیشن های پیشرفته جاوااسکریپتی به حساب میاد که وظیفه مدیریت assets های پروژه ( فایلهای js,css,html,images,font و .. رو به عهده داره ) همچنین به بهینه تر شدن پروژه کمک میکنه و با مزایای خودش باعث شده فرآیند توسعه اپیکیشن ساده تر باشه.
هرکدوم مزایا و معایب خاص خودشون رو دارن.
ابزار Vite نسبت به Webpack این مزیت هارو داره :
- برای پروژه های جدید بهتره.
- سرعتش خیلی بیشتره.
- یادگیری و پیکربندیش خیلی آسونه.
- از Rollup استفاده میکنه که باعث شده خروجی اپیکیشن خیلی بهینه باشه.
webpack نسبت به Vite این مزیت هارو داره :
- جامعه آماری خیلی بزرگی داره.
- تنظیمات پیچیده برای نیاز های پیچیده داره.
- پلاگین و Loaders های خیلی زیادی داره.
درباره احمد احمدنژاد
من یه برنامه نویس و توسعه دهنده وب هستم که عاشق دنیای صفر و یکم❤️
نوشتههای بیشتر از احمد احمدنژاد
دیدگاهتان را بنویسید