کامپایل دارایی (ترکیب)
- معرفی
- نصب و راه اندازی
- در حال اجرا مخلوط
- کار با Stylesheets
- کار با جاوا اسکریپت
- کپی کردن فایل ها و دایرکتوری ها
- نسخهسازی / حافظه پنهان
- مرورگر همگام سازی بارگذاری مجدد
- متغیرهای محیطی
- اطلاعیه
معرفی
Laravel Mix یک API روان برای تعریف مراحل ساخت Webpack برای برنامه Laravel شما با استفاده از چندین پیش پردازشگر CSS و جاوا اسکریپت رایج ارائه می دهد. از طریق روش زنجیره ای ساده، می توانید خط لوله دارایی خود را روان تعریف کنید. مثلا:
mix.js('resources/js/app.js', 'public/js') .sass('resources/sass/app.scss', 'public/css');
اگر تا به حال در مورد شروع کار با Webpack و کامپایل دارایی سردرگم و غرق شده اید، لاراول میکس را دوست خواهید داشت. با این حال، لازم نیست هنگام توسعه برنامه خود از آن استفاده کنید. شما آزاد هستید که از هر ابزار خط لوله دارایی که می خواهید یا حتی از هیچ کدام استفاده کنید.
نصب و راه اندازی
در حال نصب Node
قبل از راه اندازی Mix، ابتدا باید مطمئن شوید که Node.js و NPM روی دستگاه شما نصب شده اند.
node -vnpm -v
به طور پیش فرض، Laravel Homestead شامل همه چیزهایی است که شما نیاز دارید. با این حال، اگر از Vagrant استفاده نمی کنید، می توانید به راحتی آخرین نسخه Node و NPM را با استفاده از نصب کننده های گرافیکی ساده از صفحه دانلود آنها نصب کنید .
لاراول میکس
تنها مرحله باقی مانده نصب لاراول میکس است. در یک نصب جدید لاراول،
package.json
فایلی را در ریشه ساختار دایرکتوری خود خواهید یافت. فایل
پیش فرض
package.json
شامل همه چیزهایی است که برای شروع نیاز دارید. به این مانند
composer.json
فایل خود فکر کنید، با این تفاوت که به جای PHP، وابستگی Node را تعریف می کند. می توانید وابستگی هایی را که به آن ارجاع می دهد با اجرای زیر نصب کنید:
npm install
در حال اجرا مخلوط
Mix یک لایه پیکربندی در بالای
Webpack
است ، بنابراین برای اجرای وظایف Mix خود فقط باید یکی از اسکریپت های NPM را که با
package.json
فایل پیش فرض لاراول موجود است اجرا کنید:
// Run all Mix tasks...npm run dev // Run all Mix tasks and minify output...npm run production
تماشای دارایی ها برای تغییرات
این
npm run watch
دستور در ترمینال شما اجرا می شود و تمام فایل های مربوطه را برای تغییرات مشاهده می کند. وبپک پس از تشخیص تغییر، بهطور خودکار داراییهای شما را مجدداً کامپایل میکند:
npm run watch
ممکن است متوجه شوید که در محیطهای خاصی وقتی فایلهای شما تغییر میکند Webpack بهروزرسانی نمیشود. اگر در سیستم شما چنین است، از
watch-poll
دستور زیر استفاده کنید:
npm run watch-poll
کار با Stylesheets
فایل
webpack.mix.js
نقطه ورود شما برای جمع آوری تمام دارایی ها است. آن را به عنوان یک بسته بندی پیکربندی سبک در اطراف Webpack در نظر بگیرید. وظایف ترکیبی را میتوان به هم متصل کرد تا دقیقا مشخص شود که داراییهای شما چگونه باید کامپایل شوند.
کمتر
این
less
روش ممکن است برای کامپایل
Less
در CSS استفاده شود. بیایید
app.less
فایل اصلی خود را در کامپایل کنیم
public/css/app.css
.
mix.less('resources/less/app.less', 'public/css');
برای کامپایل کردن چندین فایل می توان از چند فراخوانی به
less
روش استفاده کرد:
mix.less('resources/less/app.less', 'public/css') .less('resources/less/admin.less', 'public/css');
اگر می خواهید نام فایل CSS کامپایل شده را سفارشی کنید، می توانید یک مسیر فایل کامل را به عنوان آرگومان دوم به متد ارسال کنید
less
:
mix.less('resources/less/app.less', 'public/stylesheets/styles.css');
اگر نیاز دارید که
گزینه های زیرین افزونه Less را
لغو کنید ، می توانید یک شی را به عنوان آرگومان سوم به
mix.less()
:
mix.less('resources/less/app.less', 'public/css', { strictMath: true});
ساس
این
sass
روش به شما اجازه می دهد تا
Sass را
در CSS کامپایل کنید. می توانید از این روش استفاده کنید:
mix.sass('resources/sass/app.scss', 'public/css');
دوباره، مانند
less
روش، میتوانید چندین فایل Sass را در فایلهای CSS مربوطه خود کامپایل کنید و حتی دایرکتوری خروجی CSS حاصل را سفارشی کنید:
mix.sass('resources/sass/app.sass', 'public/css') .sass('resources/sass/admin.sass', 'public/css/admin');
گزینههای افزونه Node-Sass اضافی ممکن است به عنوان آرگومان سوم ارائه شوند:
mix.sass('resources/sass/app.sass', 'public/css', { precision: 5});
قلم
مشابه Less و Sass، این
stylus
روش به شما اجازه می دهد تا
Stylus را
در CSS کامپایل کنید:
mix.stylus('resources/stylus/app.styl', 'public/css');
همچنین میتوانید افزونههای Stylus دیگری مانند
Rupture را
نصب کنید . ابتدا افزونه مورد نظر را از طریق NPM (
npm install rupture
) نصب کنید و سپس آن را در تماس خود به
mix.stylus()
:
mix.stylus('resources/stylus/app.styl', 'public/css', { use: [ require('rupture')() ]});
PostCSS
PostCSS
، یک ابزار قدرتمند برای تبدیل CSS شما، همراه با Laravel Mix خارج از جعبه گنجانده شده است. بهطور پیشفرض، Mix از افزونه محبوب
Autoprefixer
استفاده میکند تا بهطور خودکار تمام پیشوندهای سازنده CSS3 لازم را اعمال کند. با این حال، شما آزاد هستید که هر افزونه دیگری را که برای برنامه شما مناسب است اضافه کنید. ابتدا افزونه مورد نظر را از طریق NPM نصب کنید و سپس در
webpack.mix.js
فایل خود به آن مراجعه کنید:
mix.sass('resources/sass/app.scss', 'public/css') .options({ postCss: [ require('postcss-css-variables')() ] });
CSS ساده
اگر میخواهید چند شیت ساده CSS را در یک فایل به هم متصل کنید، میتوانید از این
styles
روش استفاده کنید.
mix.styles([ 'public/css/vendor/normalize.css', 'public/css/vendor/videojs.css'], 'public/css/all.css');
پردازش URL
از آنجایی که Laravel Mix بر روی Webpack ساخته شده است، درک چند مفهوم Webpack مهم است. برای کامپایل CSS، Webpack هر
url()
تماسی را در شیوه نامه شما
بازنویسی و بهینه می کند .
در حالی که این ممکن است در ابتدا عجیب به نظر برسد، اما یک عملکرد فوق العاده قدرتمند است. تصور کنید که میخواهیم Sass را کامپایل کنیم که شامل یک URL نسبی به یک تصویر است:
.example { background: url('../images/example.png');}
مسیرهای مطلق برای هر داده شده
url()
از بازنویسی URL مستثنی خواهند شد. به عنوان مثال،url('/images/thing.png')
یاurl('http://example.com/images/thing.png')
تغییر نخواهد کرد.
بهطور پیشفرض، Laravel Mix و Webpack آن را پیدا میکنند
example.png
، آن را در
public/images
پوشهتان کپی میکنند و سپس
url()
در استایل شیت ایجاد شدهتان بازنویسی میکنند. به این ترتیب، CSS کامپایل شده شما به صورت زیر خواهد بود:
.example { background: url(/images/example.png?d41d8cd98f00b204e9800998ecf8427e);}
همانطور که این ویژگی ممکن است مفید باشد، ممکن است ساختار پوشه موجود شما قبلاً به روشی که دوست دارید پیکربندی شده باشد. اگر چنین است، می توانید
url()
بازنویسی را غیرفعال کنید:
mix.sass('resources/app/app.scss', 'public/css') .options({ processCssUrls: false });
با افزودن این فایل به
webpack.mix.js
فایل شما، Mix دیگر با هیچ یک از دارایی ها مطابقت نمی کند
url()
یا در فهرست عمومی شما کپی نمی کند. به عبارت دیگر، CSS کامپایل شده دقیقاً شبیه نحوه تایپ اولیه شما خواهد بود:
.example { background: url("../images/thing.png");}
نقشه های منبع
اگرچه به طور پیش فرض غیرفعال است، نقشه های منبع ممکن است با فراخوانی
mix.sourceMaps()
روش موجود در
webpack.mix.js
فایل شما فعال شوند. اگرچه با هزینه کامپایل/عملکرد همراه است، اما هنگام استفاده از دارایی های کامپایل شده، اطلاعات رفع اشکال اضافی را در اختیار ابزارهای توسعه دهنده مرورگر شما قرار می دهد.
mix.js('resources/js/app.js', 'public/js') .sourceMaps();
سبک نقشه برداری منبع
Webpack انواع مختلفی از
سبک های نقشه برداری منبع
را ارائه می دهد . به طور پیش فرض، سبک نگاشت منبع Mix روی تنظیم شده است
eval-source-map
که زمان بازسازی سریع را فراهم می کند. اگر می خواهید سبک نقشه برداری را تغییر دهید، می توانید این کار را با استفاده از
sourceMaps
روش زیر انجام دهید:
let productionSourceMaps = false; mix.js('resources/js/app.js', 'public/js') .sourceMaps(productionSourceMaps, 'source-map');
کار با جاوا اسکریپت
Mix چندین ویژگی را برای کمک به شما در کار با فایلهای جاوا اسکریپت ارائه میکند، مانند کامپایل ECMAScript 2015، بستهبندی ماژول، کوچکسازی و الحاق فایلهای جاوا اسکریپت ساده. حتی بهتر از آن، این همه یکپارچه کار می کند، بدون نیاز به پیکربندی سفارشی:
mix.js('resources/js/app.js', 'public/js');
با این خط کد، اکنون می توانید از مزایای زیر استفاده کنید:
- نحو ES2015.
- ماژول ها
-
جمع آوری
.vue
فایل ها. - کوچک سازی برای محیط های تولید
استخراج فروشنده
یکی از نکات منفی بالقوه برای بستهبندی همه جاوا اسکریپت خاص برنامه با کتابخانههای فروشنده این است که کش طولانیمدت را دشوارتر میکند. به عنوان مثال، یک بهروزرسانی واحد در کد برنامه شما، مرورگر را مجبور میکند که همه کتابخانههای فروشنده شما را دوباره دانلود کند، حتی اگر تغییری نکرده باشند.
اگر قصد دارید بهروزرسانیهای مکرر جاوا اسکریپت برنامه خود را انجام دهید، باید تمام کتابخانههای فروشنده خود را در فایل خودشان استخراج کنید. به این ترتیب، تغییر در کد برنامه شما تأثیری بر ذخیره
vendor.js
فایل حجیم شما نخواهد داشت. روش
Mix
extract
باعث می شود این نسیم نسیمی باشد:
mix.js('resources/js/app.js', 'public/js') .extract(['vue'])
این
extract
روش آرایه ای از تمام کتابخانه ها یا ماژول هایی را که می خواهید در یک
vendor.js
فایل استخراج کنید، می پذیرد. با استفاده از قطعه بالا به عنوان مثال، Mix فایل های زیر را تولید می کند:
-
public/js/manifest.js
: زمان اجرا مانیفست Webpack -
public/js/vendor.js
: کتابخانه های فروشنده شما -
public/js/app.js
: کد درخواست شما
برای جلوگیری از خطاهای جاوا اسکریپت، حتما این فایل ها را به ترتیب مناسب بارگیری کنید:
<script src="/js/manifest.js"></script><script src="/js/vendor.js"></script><script src="/js/app.js"></script>
واکنش نشان دهید
Mix میتواند بهطور خودکار افزونههای Babel را که برای پشتیبانی از React لازم است نصب کند. برای شروع،
mix.js()
تماس خود را جایگزین کنید
mix.react()
:
mix.react('resources/js/app.jsx', 'public/js');
در پشت صحنه، Mix
babel-preset-react
افزونه مناسب Babel را دانلود کرده و شامل می شود.
وانیل جی اس
مشابه ترکیب شیتها با
mix.styles()
، میتوانید هر تعداد فایل جاوا اسکریپت را با
scripts()
روش ترکیب و کوچک کنید:
mix.scripts([ 'public/js/admin.js', 'public/js/dashboard.js'], 'public/js/all.js');
این گزینه به ویژه برای پروژه های قدیمی که در آنها نیازی به کامپایل Webpack برای جاوا اسکریپت خود ندارید مفید است.
یک تغییر جزئی از
mix.scripts()
استmix.babel()
. امضای روش آن باscripts
; با این حال، فایل الحاقی کامپایل Babel را دریافت می کند که هر کد ES2015 را به جاوا اسکریپت وانیلی ترجمه می کند که همه مرورگرها آن را درک می کنند.
پیکربندی بسته وب سفارشی
در پشت صحنه، Laravel Mix به یک
webpack.config.js
فایل از پیش پیکربندی شده اشاره می کند تا شما را در سریع ترین زمان ممکن راه اندازی کند. گاهی اوقات، ممکن است لازم باشد این فایل را به صورت دستی تغییر دهید. ممکن است لودر یا افزونه خاصی داشته باشید که باید به آن ارجاع داده شود، یا شاید ترجیح می دهید از Stylus به جای Sass استفاده کنید. در چنین مواردی، شما دو انتخاب دارید:
ادغام پیکربندی سفارشی
Mix روش مفیدی را ارائه می دهد
webpackConfig
که به شما امکان می دهد هر گونه تنظیمات کوتاه Webpack را با هم ادغام کنید. این یک انتخاب بسیار جذاب است، زیرا نیازی به کپی کردن و نگهداری کپی خود از فایل ندارد
webpack.config.js
. این
webpackConfig
روش یک شی را می پذیرد که باید شامل هر
پیکربندی خاص Webpack
باشد که می خواهید اعمال کنید.
mix.webpackConfig({ resolve: { modules: [ path.resolve(__dirname, 'vendor/laravel/spark/resources/assets/js') ] }});
فایل های پیکربندی سفارشی
اگر می خواهید پیکربندی Webpack خود را به طور کامل سفارشی کنید،
node_modules/laravel-mix/setup/webpack.config.js
فایل را در فهرست اصلی پروژه خود کپی کنید. سپس، تمام
--config
ارجاعات موجود در فایل خود
package.json
را به فایل پیکربندی کپی شده جدید اشاره کنید. اگر این رویکرد را برای سفارشیسازی انتخاب میکنید، هر بهروزرسانی جدید در Mix's
webpack.config.js
باید به صورت دستی در فایل سفارشیشده شما ادغام شود.
کپی کردن فایل ها و دایرکتوری ها
این
copy
روش ممکن است برای کپی فایل ها و دایرکتوری ها در مکان های جدید استفاده شود. این می تواند زمانی مفید باشد که یک دارایی خاص در
node_modules
فهرست شما باید به
public
پوشه شما منتقل شود.
mix.copy('node_modules/foo/bar.css', 'public/css/bar.css');
هنگام کپی کردن یک دایرکتوری، این
copy
روش ساختار دایرکتوری را صاف می کند. برای حفظ ساختار اصلی دایرکتوری، باید
copyDirectory
به جای آن از روش استفاده کنید:
mix.copyDirectory('resources/img', 'public/img');
نسخهسازی / حافظه پنهان
بسیاری از توسعه دهندگان دارایی های کامپایل شده خود را با یک مهر زمانی یا رمز منحصر به فرد پسوند می کنند تا مرورگرها را مجبور کنند به جای ارائه نسخه های قدیمی کد، دارایی های تازه را بارگیری کنند. میکس با استفاده از این روش می تواند این کار را برای شما انجام دهد
version
.
این
version
روش به طور خودکار یک هش منحصر به فرد را به نام فایلهای همه فایلهای کامپایل شده اضافه میکند و امکان تخریب حافظه پنهان را فراهم میکند:
mix.js('resources/js/app.js', 'public/js') .version();
پس از تولید فایل نسخه شده، نام دقیق فایل را نمی دانید. بنابراین، شما باید از تابع سراسری لاراول در
نماهای
mix
خود
برای بارگذاری دارایی هش شده مناسب استفاده کنید. این
تابع به طور خودکار نام فعلی فایل هش شده را تعیین می کند:
mix
<script src="{{ mix('/js/app.js') }}"></script>
از آنجایی که فایلهای نسخهسازی شده معمولاً در توسعه غیر ضروری هستند، میتوانید به فرآیند نسخهسازی دستور دهید فقط در طول
npm run production
:
mix.js('resources/js/app.js', 'public/js'); if (mix.inProduction()) { mix.version();}
URL های پایه ترکیبی سفارشی
اگر دارایی های کامپایل شده Mix شما در یک CDN جدا از برنامه شما مستقر شوند، باید URL پایه تولید شده توسط تابع را تغییر دهید
mix
. می توانید این کار را با افزودن یک
mix_url
گزینه پیکربندی به
config/app.php
فایل پیکربندی خود انجام دهید:
'mix_url' => env('MIX_ASSET_URL', null)
پس از پیکربندی Mix URL، این
mix
تابع هنگام ایجاد URL به دارایی ها، URL پیکربندی شده را پیشوند می کند:
https://cdn.example.com/js/app.js?id=1964becbdd96414518cd
مرورگر همگام سازی بارگذاری مجدد
BrowserSync
میتواند بهطور خودکار فایلهای شما را برای تغییرات نظارت کند و تغییرات شما را بدون نیاز به بازخوانی دستی به مرورگر تزریق کند. می توانید پشتیبانی را با فراخوانی
mix.browserSync()
روش فعال کنید:
mix.browserSync('my-domain.test'); // Or... // https://browsersync.io/docs/optionsmix.browserSync({ proxy: 'my-domain.test'});
شما می توانید یک رشته (پراکسی) یا یک شی (تنظیمات BrowserSync) را به این روش ارسال کنید. در مرحله بعد، سرور توسعه دهنده Webpack را با استفاده از
npm run watch
دستور راه اندازی کنید. اکنون، وقتی یک اسکریپت یا فایل PHP را تغییر میدهید، مشاهده کنید که مرورگر فوراً صفحه را بهروزرسانی میکند تا تغییرات شما را منعکس کند.
متغیرهای محیطی
.env
شما می توانید با قرار دادن یک کلید در فایل
خود با پیشوند، متغیرهای محیطی را به Mix تزریق کنید
MIX_
:
MIX_SENTRY_DSN_PUBLIC=http://example.com
بعد از اینکه متغیر در
.env
فایل شما تعریف شد، می توانید از طریق
process.env
شی به آن دسترسی داشته باشید. اگر در حین اجرای یک
watch
کار، مقدار تغییر کرد، باید کار را مجدداً راه اندازی کنید:
process.env.MIX_SENTRY_DSN_PUBLIC
اطلاعیه
وقتی در دسترس باشد، Mix به طور خودکار اعلانهای سیستم عامل را برای هر بسته نمایش میدهد. این به شما بازخورد فوری می دهد که آیا تلفیقی موفق بوده است یا خیر. با این حال، ممکن است مواردی وجود داشته باشد که ترجیح دهید این اعلانها را غیرفعال کنید. یکی از این نمونه ها ممکن است راه اندازی Mix در سرور تولید شما باشد. اعلان ها ممکن است از طریق روش غیرفعال شوند
disableNotifications
.
mix.disableNotifications();