วิธีสร้างส่วนขยาย 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 เพื่อนำเข้าแพ็คเกจ:

แก้ไข package.json เพื่อนำเข้า package
 "การพึ่งพา": {
    "@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;
    }
}

ผลลัพธ์:

การสาธิตส่วนขยายแบบกำหนดเองของ PWA Studio

และนั่นเป็นการสรุปบทช่วยสอนของเรา อย่าลังเลที่จะถามคำถามใด ๆ หากมีส่วนที่สับสน และถ้าคุณคิดว่าบทช่วยสอนนี้มีประโยชน์ อย่าลืมให้คะแนนว่าเป็นประโยชน์!

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

ตัวสร้างเพจ Magento PWA Studio

อ่านเพิ่มเติม:

Magento PWA Studio: ลิงค์และแหล่งข้อมูลที่เป็นประโยชน์