كيفية إنشاء ملحق Magento PWA Studio
نشرت: 2021-01-06جدول المحتويات
عادة ، قد ترغب في إجراء تغييرات مباشرة على مشروع pwa-studio
ولكن هذا النهج بعيد كل البعد عن المثالية إذا كنت ترغب في إنشاء ملحقات. بالنسبة للإضافات ، تريد أن تكون قادرًا على تعطيلها بسهولة ، أو أن تكون قادرًا على استيراد امتدادات متعددة إلى مشروع بسهولة.
للقيام بذلك ، يمكننا إنشاء حزمة داخل المشروع الذي تم إنشاؤه واستيرادها مرة أخرى من ملف JSON
. لحسن الحظ ، تم تبسيط هذه العملية بالنسبة لنا بمساعدة حزمة npm
تم إصدارها بواسطة Lars Roettig ، مشرف صيانة Magento: https://www.npmjs.com/package/@larsroettig/create-pwa-extension
في هذا البرنامج التعليمي ، سنحاول استخدام هذه الحزمة لإنشاء امتداد PWA Studio.
1. تثبيت Magento PWA Studio
نحتاج أولاً إلى تثبيت مشروع PWA Studio. هذا سهل إلى حد ما إذا اتبعت دليلنا هنا: كيفية إعداد Magento 2 PWA Studio
* ملاحظة : في خطوة الأسئلة ، بالنسبة لهذا السؤال " تثبيت تبعيات الحزمة مع الغزل بعد إنشاء المشروع " ، تحتاج إلى تحديد " لا " بدلاً من "نعم" كما هو الحال في برنامج الإعداد التعليمي الخاص بنا.
2. إنشاء طريق جديد
cd
في دليل المشروع الخاص بك.
قم بتشغيل هذا الأمر:
إنشاء الغزل @ larsroettig / pwa-extension
سيطلب المزيد من المعلومات بخصوص الامتداد:
مرة أخرى ، تذكر تحديد " لا " عند السؤال " تثبيت تبعيات الحزمة باستخدام الغزل بعد إنشاء المشروع ".
افتح الدليل الذي تم إنشاؤه.
يمكننا الآن أن نرى أن ملف intercept.js قد تم إنشاؤه ، وهو يتضمن بالفعل overridemapping
.
لنحاول الآن إنشاء مسار جديد في testextension/src/intercept.js
/ ** * ملف اعتراض مخصص للتمديد * بشكل افتراضي ، يمكنك فقط استخدام هدف @ magento / pwa-buildpack. * * إذا كنت تريد تمديد @ magento / peregrine أو @ magento / venia-ui * يجب عليك إضافتها إلى peerDependencies إلى package.json الخاص بك * * إذا كنت ترغب في إضافة عمليات الكتابة فوق مكونات @ magento / venia-ui التي يمكنك استخدامها * moduleOverrideWebpackPlugin و componentOverrideMapping ** / module.exports = الأهداف => { target.of ('@ magento / pwa-buildpack'). specialFeatures.tap (flags => { / ** * نحتاج إلى تنشيط esModules و cssModules للسماح بإنشاء حزمة لتحميل الامتداد الخاص بنا * {@ link https://magento.github.io/pwa-studio/pwa-buildpack/reference/configure-webpack/#special-flags}. * / flags [target.name] = {esModules: true، cssModules: true}؛ }) ؛ target.of ('@ magento / venia-ui'). routeArray => { routeArray.push ({ الاسم: "صفحة SimiCart" ، نمط: '/ simicart' ، المسار: "@ simicart / testextension / src / element / page1" }) ؛ مسارات العودة }) ؛ } ؛
قم بإنشاء مكون للمسار الجديد في testextension/src/components/page1/index.js
:
استيراد رد فعل من "رد فعل" ؛ استيراد {mergeClasses} من "@ magento / venia-ui / lib / classify" ؛ استيراد {شكل ، سلسلة} من "أنواع العناصر" ؛ استيراد الفئات الافتراضية من "./index.css" ؛ const Page1 = props => { فئات const = mergeClasses (defaultClasses ، props.classes) ؛ return (<div className = {class.root}> SimiCart </div>) ؛ } Page1.propTypes = { الفئات: الشكل ({root: string}) } ؛ Page1.defaultProps = {} ، تصدير الصفحة 1 الافتراضية ؛
عدل package.json لاستيراد الحزمة:
"التبعيات": { "@ magento / pwa-buildpack": "~ 7.0.0"، "@ simicart / testextension": "الرابط: ./simicart / testextension" } ،
بعد ذلك ، قم بالتثبيت والمشاهدة للتحقق مما إذا كان المسار الجديد يعمل.
تثبيت الغزل مشاهدة الغزل
3. تجاوز المكونات
بعد الجزء السابق ، سيكون هذا الجزء حول تجاوز طرق العرض الحالية لمشروعك.
من المشروع الذي تم إنشاؤه في الخطوة السابقة ، نضيف تجاوزنا في testextension/src/componentOverrideMapping.js
:
/ ** * تعيينات للكتابة فوق * مثال: ["@ magento / venia-ui / lib / مكونات / Main / main.js`]: './lib/components/Main/main.js' * / module.exports = componentOverride = { ["@ magento / venia-ui / lib / مكونات / Header / header.js`]:" @ simicart / testextension / src / override / header.js " } ؛
ثم اطلب رمز التجاوز هذا في require
testextension/src/intercept.js
:
/ ** * ملف اعتراض مخصص للتمديد * بشكل افتراضي ، يمكنك فقط استخدام هدف @ magento / pwa-buildpack. * * إذا كنت تريد تمديد @ magento / peregrine أو @ magento / venia-ui * يجب عليك إضافتها إلى peerDependencies إلى package.json الخاص بك * * إذا كنت ترغب في إضافة عمليات الكتابة فوق مكونات @ magento / venia-ui التي يمكنك استخدامها * moduleOverrideWebpackPlugin و componentOverrideMapping * / const moduleOverrideWebpackPlugin = تتطلب ('./ moduleOverrideWebpackPlugin') ؛ const componentOverrideMapping = يتطلب ('./ componentOverrideMapping') module.exports = الأهداف => { target.of ('@ magento / pwa-buildpack'). specialFeatures.tap (flags => { / ** * نحتاج إلى تنشيط esModules و cssModules للسماح بإنشاء حزمة لتحميل الامتداد الخاص بنا * {@ link https://magento.github.io/pwa-studio/pwa-buildpack/reference/configure-webpack/#special-flags}. * / flags [target.name] = {esModules: true، cssModules: true}؛ }) ؛ console.log (target.of ('@ magento / pwa-buildpack')) ؛ target.of ('@ magento / venia-ui'). routeArray => { routeArray.push ({ الاسم: "SimiCartPage" ، نمط: '/ simicart' ، المسار: "@ simicart / testextension / src / element / page1" }) ؛ مسارات العودة }) ؛ target.of ('@ magento / pwa-buildpack'). webpackCompiler.tap (مترجم => { moduleOverrideWebpackPlugin الجديد (componentOverrideMapping) .apply (مترجم) ؛ }) } ؛
بعد ذلك ، من مجلد venia-ui ، انسخ مكون الرأس إلى المكون الجديد الذي سنتجاوزه. ثم أضف عرضًا آخر في الرأس قمنا بنسخه للتو:
استيراد SimiCartIcon من "./simicartIcon" ؛ . . . <SimiCartIcon />
الكود الكامل في testextension/src/override/header.js
:
استيراد React ، {Suspense} من "رد فعل" ؛ استيراد {شكل ، سلسلة} من "أنواع العناصر" ؛ استيراد الشعار من "@ magento / venia-ui / lib / Components / Logo" ؛ استيراد ResourceUrl من "@ magento / peregrine / lib / util / makeUrl" ؛ استيراد {Link، Route} من 'React-router-dom'؛ استيراد AccountTigger من "@ magento / venia-ui / lib / Components / Header / accountTrigger" ؛ استيراد CartTrigger من "@ magento / venia-ui / lib / Components / Header / cartTrigger" ؛ استيراد NavTrigger من "@ magento / venia-ui / lib / Components / Header / navTrigger" ؛ استيراد SearchTrigger من "@ magento / venia-ui / lib / element / Header / searchTrigger" ؛ استيراد OnlineIndicator من "@ magento / venia-ui / lib / المكونات / Header / onlineIndicator" ؛ استيراد {useHeader} من '@ magento / peregrine / lib / talons / Header / useHeader'؛ استيراد {mergeClasses} من "@ magento / venia-ui / lib / classify" ؛ استيراد defaultClasses من "@ magento / venia-ui / lib / component / Header / header.css" ؛ استيراد PageLoadingIndicator من "@ magento / venia-ui / lib / component / PageLoadingIndicator" ؛ استيراد SimiCartIcon من "./simicartIcon" ؛ const SearchBar = React.lazy (() => استيراد ('@ magento / venia-ui / lib / المكونات / SearchBar')) ؛ رأس const = props => { مقدار ثابت { انقر فوق الزر hasBeenOffline ، متصل، البحث isPageLoading } = useHeader () ، فئات const = mergeClasses (defaultClasses ، props.classes) ؛ const rootClass = searchOpen؟ class.open: classes.closed const searchBarFallback = ( <div className = {class.searchFallback}> <div className = {class.input}> <div className = {class.loader} /> </div> </div> ) ؛ const searchBar = searchOpen؟ ( <احتياطي التشويق = {searchBarFallback}> <المسار> <SearchBar isOpen = {searchOpen} /> </Route> </Suspense> ) : لا شيء؛ const pageLoadingIndicator = isPageLoading؟ ( <PageLoadingIndicator /> ) : لا شيء؛ إرجاع ( <header className = {rootClass}> <div className = {classes.toolbar}> <div className = {class.primaryActions}> <NavTrigger /> </div> {pageLoadingIndicator} <OnlineIndicator hasBeenOffline = {hasBeenOffline} isOnline = {isOnline} /> <ارتباط إلى = {ResourceUrl ('/')}> <Logo class = {{logo: classes.logo}} /> </Link> <div className = {class.secondaryActions}> <محرك البحث نشط = {searchOpen} onClick = {handleSearchTriggerClick} /> <AccountTigger /> <SimiCartIcon /> <CartTrigger /> </div> </div> {شريط البحث} </header> ) ؛ } ؛ Header.propTypes = { الفئات: الشكل ({ مغلق: سلسلة ، الشعار: سلسلة ، فتح: سلسلة ، الإجراءات الأولية: سلسلة ، الإجراءات الثانوية: سلسلة ، شريط الأدوات: سلسلة }) } ؛ تصدير رأس افتراضي ؛
لنقم بإنشاء هذا العرض في testextension/src/override/SimiCartIcon.js
:
استيراد رد فعل من "رد فعل" ؛ استيراد أيقونة من "@ magento / venia-ui / lib / element / Icon" ؛ استيراد {FastForward} من "ريشة رد الفعل" ؛ استيراد ResourceUrl من "@ magento / peregrine / lib / util / makeUrl" ؛ استيراد {useHistory} من "رد فعل جهاز التوجيه-dom" ؛ استيراد {شكل ، سلسلة} من "أنواع العناصر" ؛ استيراد defaultClasses من "./SimiCartIcon.css" ؛ استيراد {FormattedMessage، useIntl} من 'رد فعل intl'؛ const SimiCartIcon = props => { فئات const = defaultClasses ؛ const {formatMessage} = useIntl () ، تاريخ const = useHistory () ؛ إرجاع ( <زر aria-label = {formatMessage ({ المعرّف: `blog.bloglabel` ، defaultMessage: "مدونة" })} className = {class.root} onClick = {() => history.push (ResourceUrl ('/ simicart'))} > <Icon src = {FastForward} /> <span className = {class.label}> <FormattedMessage id = {`Blog`} /> </ span> </button> ) ؛ } SimiCartIcon.propTypes = { الفئات: الشكل ({root: string}) } ؛ SimiCartIcon.defaultProps = {} ، تصدير SimiCartIcon الافتراضي ؛
ثم صممها:
.جذر { محاذاة العناصر: مركز ؛ المؤشر: المؤشر. عرض: مضمنة المرن ؛ تبرير المحتوى: مركز ؛ ارتفاع الخط: 1 ؛ أحداث المؤشر: تلقائي ؛ محاذاة النص: مركز ؛ مسافة بيضاء: نوراراب. خاصية الانتقال: اللون ؛ مدة الانتقال: 224 مللي ثانية ؛ وظيفة توقيت الانتقال: مكعب بيزير (0 ، 0 ، 0.2 ، 1) ؛ الارتفاع: 3 ريم. العرض: 3ريم ؛ } .ضع الكلمة المناسبة { عرض لا شيء؛؛ } media (الحد الأدنى للعرض: 641 بكسل) { .جذر { العرض: تلقائي ؛ } .ضع الكلمة المناسبة { العرض: الأولي ؛ هامش مضمنة البداية: 0.25rem ؛ } }
النتائج:
وهذا يختتم برنامجنا التعليمي. لا تتردد في طرح أي سؤال علينا إذا كان هناك أي جزء محير ، وإذا كنت تعتقد أن هذا البرنامج التعليمي مفيد ، فلا تنسَ تقييمه على أنه مفيد!
بالإضافة إلى ذلك ، إذا كنت ترغب في تجربة امتداد Magento PWA Studio ، فلدينا وحدات إضافية مجانية ومفتوحة المصدر يمكنك تثبيتها أعلى موقع Magento PWA Studio على الويب.
اقرأ أكثر:
Magento PWA Studio: روابط وموارد مفيدة