Cum se creează o extensie Magento PWA Studio

Publicat: 2021-01-06

Cuprins

În mod normal, ați dori să faceți modificări direct în proiectul pwa-studio , dar această abordare este, totuși, departe de a fi ideală dacă doriți să construiți extensii. Pentru extensii, doriți să le puteți dezactiva cu ușurință sau să puteți importa mai multe extensii într-un proiect cu ușurință.

Pentru a face acest lucru, putem crea un pachet în interiorul proiectului creat și importam înapoi din fișierul JSON . Acest proces a fost, din fericire, simplificat pentru noi cu ajutorul unui pachet npm lansat de Lars Roettig, un întreținător Magento: https://www.npmjs.com/package/@larsroettig/create-pwa-extension

În acest tutorial, vom încerca să folosim acest pachet pentru a crea o extensie PWA Studio.

1. Instalați Magento PWA Studio

Mai întâi trebuie să instalăm un proiect PWA Studio. Acest lucru este destul de ușor dacă urmați ghidul nostru de aici: Cum să setați Magento 2 PWA Studio

*Notă : la pasul întrebărilor, pentru această întrebare „ Instalați dependențe de pachete cu fire după crearea proiectului ” trebuie să selectați Nu în loc de Da, ca în tutorialul nostru de configurare.

2. Creați o rută nouă

cd în directorul de proiect.

Rulați această comandă:

 yarn create @larsroettig/pwa-extension

Va solicita mai multe informații despre extensie:

Din nou, nu uitați să selectați Nu la întrebarea „ Instalați dependențe de pachet cu fire după crearea proiectului ”.

Deschideți directorul creat.

Deschideți directorul creat

Acum putem vedea că fișierul intercept.js a fost creat și include deja overridemapping .

Acum să încercăm să creăm o nouă rută în testextension/src/intercept.js

 /**
 * Fișier de interceptare personalizat pentru extensie
 * În mod implicit, puteți utiliza doar ținta @magento/pwa-buildpack.
 *
 * Dacă doriți să extindeți @magento/peregrine sau @magento/venia-ui
 * ar trebui să le adăugați la peerDependencies la pachetul dumneavoastră.json
 *
 * Dacă doriți să adăugați suprascrieri pentru componentele @magento/venia-ui, puteți utiliza
 * moduleOverrideWebpackPlugin și componentOverrideMapping
 **/
module.exports = targets => {
    targets.of('@magento/pwa-buildpack').specialFeatures.tap(flags => {
        /**
         * Trebuie să activăm esModules și cssModules pentru a permite pachetului de compilare să încarce extensia noastră
         * {@link https://magento.github.io/pwa-studio/pwa-buildpack/reference/configure-webpack/#special-flags}.
         */
        flags[targets.name] = { esModule: true, cssModules: true };
    });
    targets.of('@magento/venia-ui').routes.tap(
        routesArray => {
            routesArray.push({
                nume: „Pagina SimiCart”,
                model: '/simicart',
                cale: „@simicart/testextension/src/components/page1”
            });

            retur ruteArray;
        });
};

Creați o componentă pentru noua rută în testextension/src/components/page1/index.js :

 import React din 'react';
import {mergeClasses} din „@magento/venia-ui/lib/classify”;
import {shape, string} din 'prop-types';
 
import defaultClasses din „./index.css”;
 
const Pagina 1 = props => {
    const classes = mergeClasses(defaultClasses, props.classes);
    return (<div className={classes.root}>SimiCart</div>);
}

Page1.propTypes = {
    clase: formă({rădăcină: șir})
};
Page1.defaultProps = {};
export implicit Pagina 1;

Modificați package.json pentru a importa pachetul:

Modificați package.json pentru a importa pachetul
 „dependențe”: {
    "@magento/pwa-buildpack": "~7.0.0",
    „@simicart/testextension”: „link:./@simicart/testextension”
  },

După care, instalați și urmăriți pentru a verifica dacă noua rută funcționează.

 instalarea firelor
ceas de fire

3. Suplimentarea componentelor

Urmând partea anterioară, această parte va fi despre suprascrierea vederilor existente ale proiectului dumneavoastră.

Din proiectul creat în pasul anterior, adăugăm suprascrierea noastră în testextension/src/componentOverrideMapping.js :

 /**
 * Mapări pentru suprascrieri
 * exemplu: [`@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'
};

Apoi require acest cod de suprascriere în testextension/src/intercept.js :

 /**
 * Fișier de interceptare personalizat pentru extensie
 * În mod implicit, puteți utiliza doar ținta @magento/pwa-buildpack.
 *
 * Dacă doriți să extindeți @magento/peregrine sau @magento/venia-ui
 * ar trebui să le adăugați la peerDependencies la pachetul dumneavoastră.json
 *
 * Dacă doriți să adăugați suprascrieri pentru componentele @magento/venia-ui, puteți utiliza
 * moduleOverrideWebpackPlugin și componentOverrideMapping
 */
const moduleOverrideWebpackPlugin = require('./moduleOverrideWebpackPlugin');
const componentOverrideMapping = require('./componentOverrideMapping')

module.exports = targets => {
    targets.of('@magento/pwa-buildpack').specialFeatures.tap(flags => {
        /**
         * Trebuie să activăm esModules și cssModules pentru a permite pachetului de compilare să încarce extensia noastră
         * {@link https://magento.github.io/pwa-studio/pwa-buildpack/reference/configure-webpack/#special-flags}.
         */
        flags[targets.name] = { esModule: true, cssModules: true };
    });

    console.log(targets.of('@magento/pwa-buildpack'));
    targets.of('@magento/venia-ui').routes.tap(
        routesArray => {
            routesArray.push({
                nume: „SimiCartPage”,
                model: '/simicart',
                cale: „@simicart/testextension/src/components/page1”
            });

            retur ruteArray;
        });
    targets.of('@magento/pwa-buildpack').webpackCompiler.tap(compiler => {
        modul nouOverrideWebpackPlugin(componentOverrideMapping).aplica (compiler);
    })
};

Apoi, din folderul venia-ui , copiați componenta antet în noua componentă pe care o vom înlocui. Apoi adăugați încă o vizualizare în antetul pe care tocmai l-am copiat:

 importați SimiCartIcon din „./simicartIcon”;
.
.
.
<SimiCartIcon />

Cod complet în testextension/src/override/header.js :

 import React, { Suspans } din 'react';
import { shape, string } din 'prop-types';

import Logo din '@magento/venia-ui/lib/components/Logo';
importați resourceUrl din „@magento/peregrine/lib/util/makeUrl”;
import { Link, Route } din 'react-router-dom';

importați AccountTrigger din „@magento/venia-ui/lib/components/Header/accountTrigger”;
importați CartTrigger din „@magento/venia-ui/lib/components/Header/cartTrigger”;
importați NavTrigger din „@magento/venia-ui/lib/components/Header/navTrigger”;
importați SearchTrigger din „@magento/venia-ui/lib/components/Header/searchTrigger”;
import OnlineIndicator din „@magento/venia-ui/lib/components/Header/onlineIndicator”;
import { useHeader } din „@magento/peregrine/lib/talons/Header/useHeader”;

import { mergeClasses } din „@magento/venia-ui/lib/classify”;
importați defaultClasses din „@magento/venia-ui/lib/components/Header/header.css”;
importați PageLoadingIndicator din „@magento/venia-ui/lib/components/PageLoadingIndicator”;
importați SimiCartIcon din „./simicartIcon”;

const SearchBar = React.lazy(() => import('@magento/venia-ui/lib/components/SearchBar'));

const Header = props => {
    const {
        handleSearchTriggerClick,
        a fost offline,
        e online,
        căutareDeschide,
        isPageLoading
    } = useHeader();

    const classes = mergeClasses(defaultClasses, props.classes);
    const rootClass = searchOpen ? clase.deschise : clase.închis;
     const searchBarFallback = (
        <div className={classes.searchFallback}>
            <div className={classes.input}>
                <div className={classes.loader} />
            </div>
        </div>
    );
    const searchBar = searchOpen ? (
        <Suspense fallback={searchBarFallback}>
            <Rută>
                <SearchBar isOpen={searchOpen} />
            </Route>
        </Suspans>
    ) : nul;
    const pageLoadingIndicator = isPageLoading ? (
        <PageLoadingIndicator />
    ) : nul;
 
    întoarcere (
        <header className={rootClass}>
            <div className={classes.toolbar}>
                <div className={classes.primaryActions}>
                    <NavTrigger />
                </div>
                {pageLoadingIndicator}
                <OnlineIndicator
                    hasBeenOffline={hasBeenOffline}
                    isOnline={isOnline}
                />
                <Link to={resourceUrl('/')}>
                    <Logo classes={{ logo: classes.logo }} />
                </Link>
                <div className={classes.secondaryActions}>
                    <SearchTrigger
                        activ={searchOpen}
                        onClick={handleSearchTriggerClick}
                    />
                    <AccountTrigger />
                    <SimiCartIcon />
                    <CartTrigger />
                </div>
            </div>
            {bara de căutare}
        </header>
    );
};

Header.propTypes = {
    clase: forma({
        închis: sfoară,
        logo: șir,
        deschis: șir,
        primaryActions: șir,
        Acțiuni secundare: șir,
        bara de instrumente: șir
    })
};
 
exportare antet implicit;

Să creăm această vizualizare în testextension/src/override/SimiCartIcon.js :

 import React din 'react';
importați pictograma din „@magento/venia-ui/lib/components/Icon”;
import { FastForward } din „react-feather”;
importați resourceUrl din „@magento/peregrine/lib/util/makeUrl”;
import { useHistory } din 'react-router-dom';
import { shape, string } din 'prop-types';

import defaultClasses din „./SimiCartIcon.css”;
import { FormattedMessage, useIntl } din 'react-intl';

const SimiCartIcon = props => {
    const classes = defaultClasses;
    const { formatMessage } = useIntl();
    const history = useHistory();

    întoarcere (
        <buton
            aria-label={formatMessage({
                id: `blog.bloglabel`,
                defaultMessage: „Blog”
            })}
            className={classes.root}
            onClick={() => history.push(resourceUrl('/simicart'))}
        >
            <Icon src={FastForward} />
            <span className={classes.label}>
                <FormattedMessage id={`Blog`} />
            </span>
        </button>
    );
}
 
SimiCartIcon.propTypes = {
    clase: formă({ rădăcină: șir })
};
SimiCartIcon.defaultProps = {};
export implicit SimiCartIcon;

Apoi stilați-l:

 .rădăcină {
    alinierea elementelor: centru;
    cursor: pointer;
    display: inline-flex;
    justificare-conținut: centru;
    înălțimea liniei: 1;
    pointer-evenimente: auto;
    text-align: centru;
    spatiu alb: nowrap;
    proprietate de tranziție: culoare;
    tranziție-durată: 224ms;
    tranziție-funcție-temporizare: cubic-bezier(0, 0, 0.2, 1);
    inaltime: 3rem;
    latime: 3rem;
}

.eticheta {
    afisare: nici unul;;
}

@media (lățime minimă: 641 px) {
    .rădăcină {
        latime: auto;
    }
    .eticheta {
        afisare: initiala;
        margin-inline-start: 0.25rem;
    }
}

Rezultatul:

Demonstrație de extensie personalizată PWA Studio

Și asta încheie tutorialul nostru. Simțiți-vă liber să ne trimiteți orice întrebare dacă există vreo parte confuză și, dacă credeți că acest tutorial este util, nu uitați să îl evaluați ca fiind util!

În plus, dacă doriți să încercați o extensie Magento PWA Studio, avem module suplimentare gratuite și open-source pe care le puteți instala pe site-ul dvs. Magento PWA Studio.

Magento PWA Studio Page Builder

Citeste mai mult:

Magento PWA Studio: Link-uri și resurse utile