วิธีสร้างส่วนขยาย 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 ลงในไดเร็กทอรีโครงการของคุณ

เรียกใช้คำสั่งนี้:
เส้นด้าย create @larsroettig/pwa-extension
จะขอข้อมูลเพิ่มเติมเกี่ยวกับส่วนขยาย:

อย่าลืมเลือก No ที่คำถาม " ติดตั้งการพึ่งพาแพ็คเกจด้วยไหมพรม หลังจากสร้างโครงการ "
เปิดไดเร็กทอรีที่สร้างขึ้น

ตอนนี้เราเห็นว่าไฟล์ 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 = เป้าหมาย => {
targets.of ('@magento/pwa-buildpack').specialFeatures.tap (แฟล็ก => {
/**
* Wee จำเป็นต้องเปิดใช้งาน esModules และ cssModules เพื่อให้ build pack โหลดส่วนขยายของเราได้
* {@link https://magento.github.io/pwa-studio/pwa-buildpack/reference/configure-webpack/#special-flags}
*/
แฟล็ก[targets.name] = { esModules: true, cssModules: true };
});
targets.of('@magento/venia-ui').routes.tap(
routeArray => {
routeArray.push({
ชื่อ: 'SimiCart เพจ'
รูปแบบ: '/simicart',
เส้นทาง: '@simicart/testtextension/src/components/page1'
});
กลับเส้นทางอาร์เรย์;
});
}; สร้างส่วนประกอบสำหรับเส้นทางใหม่ใน testextension/src/components/page1/index.js :
นำเข้า React จาก 'react';
นำเข้า {mergeClasses} จาก '@magento/venia-ui/lib/classify';
นำเข้า {shape, string} จาก 'prop-types';
นำเข้า defaultClasses จาก './index.css';
const Page1 = อุปกรณ์ประกอบฉาก => {
คลาส const = mergeClasses (defaultClasses, props.classes);
ส่งคืน (<div className={classes.root}>SimiCart</div>);
}
Page1.propTypes = {
คลาส: รูปร่าง ({ราก: สตริง})
};
Page1.defaultProps = {};
ส่งออกเริ่มต้น Page1;แก้ไข package.json เพื่อนำเข้าแพ็คเกจ:

"การพึ่งพา": {
"@magento/pwa-buildpack": "~7.0.0",
"@simicart/testtextension": "link:./@simicart/testtextension"
},หลังจากนั้น ติดตั้งและดูเพื่อตรวจสอบว่าเส้นทางใหม่ใช้งานได้หรือไม่
ติดตั้งเส้นด้าย นาฬิกาเส้นด้าย
3. การเอาชนะส่วนประกอบ
ต่อจากตอนที่แล้ว ส่วนนี้จะเกี่ยวกับการแทนที่มุมมองที่มีอยู่ของโปรเจ็กต์ของคุณ
จากโครงการที่สร้างในขั้นตอนก่อนหน้า เราเพิ่มการแทนที่ของเราใน testextension/src/componentOverrideMapping.js :
/**
* การแมปสำหรับเขียนทับ
* ตัวอย่าง: [`@magento/venia-ui/lib/components/Main/main.js`]: './lib/components/Main/main.js'
*/
module.exports = componentOverride = {
[`@magento/venia-ui/lib/components/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 = เป้าหมาย => {
targets.of ('@magento/pwa-buildpack').specialFeatures.tap (แฟล็ก => {
/**
* Wee จำเป็นต้องเปิดใช้งาน esModules และ cssModules เพื่อให้ build pack โหลดส่วนขยายของเราได้
* {@link https://magento.github.io/pwa-studio/pwa-buildpack/reference/configure-webpack/#special-flags}
*/
แฟล็ก[targets.name] = { esModules: true, cssModules: true };
});
console.log(targets.of('@magento/pwa-buildpack'));
targets.of('@magento/venia-ui').routes.tap(
routeArray => {
routeArray.push({
ชื่อ: 'SimiCartPage',
รูปแบบ: '/simicart',
เส้นทาง: '@simicart/testtextension/src/components/page1'
});
กลับเส้นทางอาร์เรย์;
});
targets.of ('@magento/pwa-buildpack').webpackCompiler.tap (คอมไพเลอร์ => {
ใหม่ moduleOverrideWebpackPlugin(componentOverrideMapping).apply(คอมไพเลอร์);
})
};จากนั้นจากโฟลเดอร์ venia-ui ให้คัดลอกองค์ประกอบ ส่วนหัว ไปยังองค์ประกอบใหม่ที่เราจะแทนที่ จากนั้นเพิ่มมุมมองเพิ่มเติมในส่วนหัวที่เราเพิ่งคัดลอก:

นำเข้า SimiCartIcon จาก './simicartIcon'; . . . <SimiCartIcon />
รหัสเต็มใน testextension/src/override/header.js :
นำเข้า React { Suspense } จาก 'react';
นำเข้า { รูปร่าง สตริง } จาก 'prop-types';
นำเข้าโลโก้จาก '@magento/venia-ui/lib/components/Logo';
นำเข้า resourceUrl จาก '@magento/peregrine/lib/util/makeUrl';
นำเข้า { ลิงก์ เส้นทาง } จาก 'react-router-dom';
นำเข้า AccountTrigger จาก '@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/components/Header/searchTrigger';
นำเข้า OnlineIndicator จาก '@magento/venia-ui/lib/components/Header/onlineIndicator';
นำเข้า { useHeader } จาก '@magento/peregrine/lib/talons/Header/useHeader';
นำเข้า { mergeClasses } จาก '@magento/venia-ui/lib/classify';
นำเข้า defaultClasses จาก '@magento/venia-ui/lib/components/Header/header.css';
นำเข้า PageLoadingIndicator จาก '@magento/venia-ui/lib/components/PageLoadingIndicator';
นำเข้า SimiCartIcon จาก './simicartIcon';
const SearchBar = React.lazy(() => การนำเข้า ('@magento/venia-ui/lib/components/SearchBar'));
const Header = อุปกรณ์ประกอบฉาก => {
const {
จัดการSearchTriggerClick,
hasBeenออฟไลน์,
ออนไลน์,
ค้นหาเปิด,
isPageLoading
} = useHeader();
คลาส const = mergeClasses (defaultClasses, props.classes);
const rootClass = searchOpen ? class.open : class.closed;
const searchBarFallback = (
<div className={classes.searchFallback}>
<div className={classes.input}>
<div className={classes.loader} />
</div>
</div>
);
const searchBar = ค้นหาเปิด ? (
<Suspense fallback={searchBarFallback}>
<เส้นทาง>
<SearchBar isOpen={searchOpen} />
</เส้นทาง>
</ใจจดใจจ่อ>
) : โมฆะ;
const pageLoadingIndicator = isPageLoading ? (
<PageLoadingIndicator />
) : โมฆะ;
กลับ (
<header className={rootClass}>
<div className={classes.toolbar}>
<div className={classes.primaryActions}>
<NavTrigger />
</div>
{pageLoadingIndicator}
<ตัวบ่งชี้ออนไลน์
hasBeenOffline={hasBeenOffline}
isOnline={isOnline}
/>
<Link to={resourceUrl('/')}>
<คลาสโลโก้={{ โลโก้: class.logo }} />
</Link>
<div className={classes.secondaryActions}>
<SearchTrigger
ใช้งานอยู่={ค้นหาเปิด}
onClick={จัดการSearchTriggerClick}
/>
<AccountTrigger />
<SimiCartIcon />
<CartTrigger />
</div>
</div>
{แถบค้นหา}
</header>
);
};
Header.propTypes = {
คลาส: รูปร่าง ({
ปิด: สตริง,
โลโก้: สตริง,
เปิด: สตริง,
การดำเนินการหลัก: สตริง,
SecondaryActions: สตริง,
แถบเครื่องมือ: string
})
};
ส่งออกส่วนหัวเริ่มต้น; มาสร้างมุมมองนี้ใน testextension/src/override/SimiCartIcon.js :
นำเข้า React จาก 'react';
นำเข้าไอคอนจาก '@magento/venia-ui/lib/components/Icon';
นำเข้า { FastForward } จาก 'react-feather';
นำเข้า resourceUrl จาก '@magento/peregrine/lib/util/makeUrl';
นำเข้า { useHistory } จาก 'react-router-dom';
นำเข้า { รูปร่าง สตริง } จาก 'prop-types';
นำเข้า defaultClasses จาก './SimiCartIcon.css';
นำเข้า { FormattedMessage, useIntl } จาก 'react-intl';
const SimiCartIcon = อุปกรณ์ประกอบฉาก => {
คลาส const = defaultClasses;
const { formatMessage } = useIntl ();
ประวัติ const = useHistory();
กลับ (
<ปุ่ม
aria-label={รูปแบบข้อความ({
id: `blog.bloglabel',
defaultMessage: 'บล็อก'
})}
className={classes.root}
onClick={() => history.push(resourceUrl('/simicart'))}
>
<ไอคอน src={กรอไปข้างหน้า} />
<span className={classes.label}>
<FormattedMessage id={`Blog`} />
</span>
</button>
);
}
SimiCartIcon.propTypes = {
คลาส: รูปร่าง ({ รูท: สตริง })
};
SimiCartIcon.defaultProps = {};
ส่งออกเริ่มต้น SimiCartIcon;จากนั้นจัดรูปแบบ:
.root {
จัดรายการ: ศูนย์;
เคอร์เซอร์: ตัวชี้;
จอแสดงผล: อินไลน์ดิ้น;
ปรับเนื้อหา: ศูนย์;
ความสูงของเส้น: 1;
ตัวชี้เหตุการณ์: อัตโนมัติ;
จัดข้อความ: ศูนย์;
พื้นที่สีขาว: nowrap;
คุณสมบัติการเปลี่ยนแปลง: สี;
ระยะเวลาการเปลี่ยนภาพ: 224ms;
การเปลี่ยนแปลงเวลาฟังก์ชั่น: ลูกบาศก์ bezier (0, 0, 0.2, 1);
ความสูง: 3rem;
ความกว้าง: 3rem;
}
.ฉลาก {
แสดง: ไม่มี;;
}
@media (ความกว้างต่ำสุด: 641px) {
.root {
ความกว้าง: อัตโนมัติ;
}
.ฉลาก {
แสดง: เริ่มต้น;
ระยะขอบอินไลน์เริ่มต้น: 0.25rem;
}
}ผลลัพธ์:

และนั่นเป็นการสรุปบทช่วยสอนของเรา อย่าลังเลที่จะถามคำถามใด ๆ หากมีส่วนที่สับสน และถ้าคุณคิดว่าบทช่วยสอนนี้มีประโยชน์ อย่าลืมให้คะแนนว่าเป็นประโยชน์!
นอกจากนี้ หากคุณรู้สึกอยากลองใช้ส่วนขยาย Magento PWA Studio เรามีโมดูลเสริมแบบโอเพนซอร์สฟรี ซึ่งคุณสามารถติดตั้งที่ด้านบนของเว็บไซต์ Magento PWA Studio ได้
อ่านเพิ่มเติม:
Magento PWA Studio: ลิงค์และแหล่งข้อมูลที่เป็นประโยชน์
