Como criar uma extensão Magento PWA Studio
Publicados: 2021-01-06Índice
Normalmente, você deseja fazer alterações diretamente no projeto pwa-studio
, mas essa abordagem está, no entanto, longe de ser ideal se você deseja criar extensões. Para extensões, você deseja desativá-las facilmente ou importar várias extensões em um projeto com facilidade.
Para isso, podemos criar um pacote dentro do projeto criado e importar de volta do arquivo JSON
. Este processo foi, felizmente, simplificado para nós com a ajuda de um pacote npm
lançado por Lars Roettig, um mantenedor do Magento: https://www.npmjs.com/package/@larsroettig/create-pwa-extension
Neste tutorial, tentaremos usar este pacote para criar uma extensão do PWA Studio.
1. Instale o Magento PWA Studio
Primeiro precisamos instalar um projeto PWA Studio. Isso é bastante fácil se você seguir nosso guia aqui: Como configurar o Magento 2 PWA Studio
*Observação : na etapa de perguntas, para esta pergunta “ Instalar dependências de pacotes com yarn após a criação do projeto ” você precisa selecionar Não em vez de Sim como em nosso tutorial de configuração.
2. Crie uma nova rota
cd
em seu diretório de projeto.

Execute este comando:
fios criam @larsroettig/pwa-extension
Ele solicitará mais informações sobre a extensão:

Novamente, lembre-se de selecionar Não na pergunta “ Instalar dependências do pacote com fio após criar o projeto ”.
Abra o diretório criado.

Agora podemos ver que o arquivo intercept.js foi criado e já inclui overridemapping
.
Agora vamos tentar criar uma nova rota em testextension/src/intercept.js
/** * Arquivo de interceptação personalizado para a extensão * Por padrão, você só pode usar o destino de @magento/pwa-buildpack. * * Se quiser estender @magento/peregrine ou @magento/venia-ui * você deve adicioná-los ao peerDependencies ao seu package.json * * Se você deseja adicionar substituições para componentes @magento/venia-ui, você pode usar * moduleOverrideWebpackPlugin e componentOverrideMapping **/ module.exports = destinos => { targets.of('@magento/pwa-buildpack').specialFeatures.tap(flags => { /** * Precisamos ativar esModules e cssModules para permitir que o pacote de compilação carregue nossa extensão * {@link https://magento.github.io/pwa-studio/pwa-buildpack/reference/configure-webpack/#special-flags}. */ flags[targets.name] = { esModules: true, cssModules: true }; }); targets.of('@magento/venia-ui').routes.tap( rotasArray => { rotasArray.push({ nome: 'Página SimiCart', padrão: '/simicart', caminho: '@simicart/testextension/src/components/page1' }); return rotasArray; }); };
Crie um componente para a nova rota em testextension/src/components/page1/index.js
:
importe React de 'react'; importe {mergeClasses} de '@magento/venia-ui/lib/classify'; import {forma, string} de 'prop-types'; importar defaultClasses de './index.css'; const Page1 = adereços => { classes const = mergeClasses(defaultClasses, props.classes); return (<div className={classes.root}>SimiCart</div>); } Page1.propTypes = { classes: forma({raiz: string}) }; Page1.defaultProps = {}; exportar a página1 padrão;
Modifique package.json para importar o pacote:

"dependências": { "@magento/pwa-buildpack": "~7.0.0", "@simicart/testextension": "link:./@simicart/testextension" },
Depois disso, instale e assista para verificar se a nova rota está funcionando.
instalação de fios relógio de fio
3. Substituindo componentes
Seguindo a parte anterior, esta parte será sobre a substituição das visualizações existentes do seu projeto.
Do projeto criado na etapa anterior, adicionamos nossa substituição em testextension/src/componentOverrideMapping.js
:
/** * Mapeamentos para substituições * exemplo: [`@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' };
Em seguida, require
este código de substituição em testextension/src/intercept.js
:
/** * Arquivo de interceptação personalizado para a extensão * Por padrão, você só pode usar o destino de @magento/pwa-buildpack. * * Se quiser estender @magento/peregrine ou @magento/venia-ui * você deve adicioná-los ao peerDependencies ao seu package.json * * Se você deseja adicionar substituições para componentes @magento/venia-ui, você pode usar * moduleOverrideWebpackPlugin e componentOverrideMapping */ const moduleOverrideWebpackPlugin = require('./moduleOverrideWebpackPlugin'); const componentOverrideMapping = require('./componentOverrideMapping') module.exports = destinos => { targets.of('@magento/pwa-buildpack').specialFeatures.tap(flags => { /** * Precisamos ativar esModules e cssModules para permitir que o pacote de compilação carregue nossa extensão * {@link https://magento.github.io/pwa-studio/pwa-buildpack/reference/configure-webpack/#special-flags}. */ flags[targets.name] = { esModules: true, cssModules: true }; }); console.log(targets.of('@magento/pwa-buildpack')); targets.of('@magento/venia-ui').routes.tap( rotasArray => { rotasArray.push({ nome: 'SimiCartPage', padrão: '/simicart', caminho: '@simicart/testextension/src/components/page1' }); return rotasArray; }); targets.of('@magento/pwa-buildpack').webpackCompiler.tap(compiler => { new moduleOverrideWebpackPlugin(componentOverrideMapping).apply(compilador); }) };
Em seguida, da pasta venia-ui , copie o componente de cabeçalho para o novo componente que substituiremos. Em seguida, adicione mais uma visualização ao cabeçalho que acabamos de copiar:

importar SimiCartIcon de './simicartIcon'; . . . <SimiCartIcon />
Código completo em testextension/src/override/header.js
:
import React, { Suspense } from 'react'; import { shape, string } from 'prop-types'; importe o logotipo de '@magento/venia-ui/lib/components/Logo'; import resourceUrl de '@magento/peregrine/lib/util/makeUrl'; import { Link, Route } from 'react-router-dom'; importe AccountTrigger de '@magento/venia-ui/lib/components/Header/accountTrigger'; importe CartTrigger de '@magento/venia-ui/lib/components/Header/cartTrigger'; importe NavTrigger de '@magento/venia-ui/lib/components/Header/navTrigger'; importe SearchTrigger de '@magento/venia-ui/lib/components/Header/searchTrigger'; import OnlineIndicator de '@magento/venia-ui/lib/components/Header/onlineIndicator'; import { useHeader } de '@magento/peregrine/lib/talons/Header/useHeader'; importe {mergeClasses} de '@magento/venia-ui/lib/classify'; import defaultClasses de '@magento/venia-ui/lib/components/Header/header.css'; importe PageLoadingIndicator de '@magento/venia-ui/lib/components/PageLoadingIndicator'; importar SimiCartIcon de './simicartIcon'; const SearchBar = React.lazy(() => import('@magento/venia-ui/lib/components/SearchBar')); const Cabeçalho = adereços => { const { handleSearchTriggerClick, temEstadoOffline, está online, pesquisaAbrir, isPageLoading } = useCabeçalho(); classes const = mergeClasses(defaultClasses, props.classes); const rootClass = searchOpen ? classes.open : classes.closed; const searchBarFallback = ( <div className={classes.searchFallback}> <div className={classes.input}> <div className={classes.loader} /> </div> </div> ); const searchBar = searchOpen ? ( <Suspense fallback={searchBarFallback}> <Rota> <SearchBar isOpen={searchOpen} /> </Rota> </Suspense> ) : nulo; const pageLoadingIndicator = isPageLoading ? ( <PageLoadingIndicator /> ) : nulo; Retorna ( <header className={rootClass}> <div className={classes.toolbar}> <div className={classes.primaryActions}> <NavTrigger /> </div> {pageLoadingIndicator} <Indicador Online hasBeenOffline={hasBeenOffline} isOnline={isOnline} /> <Link to={resourceUrl('/')}> <Logo classes={{ logo: classes.logo }} /> </Link> <div className={classes.secondaryActions}> <SearchTrigger active={searchOpen} onClick={handleSearchTriggerClick} /> <AccountTrigger /> <SimiCartIcon /> <CartTrigger /> </div> </div> {Barra de pesquisa} </header> ); }; Header.propTypes = { classes: forma({ fechado: corda, logotipo: corda, aberto: corda, Ações primárias: string, Ações secundárias: string, barra de ferramentas: string }) }; exportar cabeçalho padrão;
Vamos criar esta visualização em testextension/src/override/SimiCartIcon.js
:
importe React de 'react'; importe o ícone de '@magento/venia-ui/lib/components/Icon'; import { FastForward } de 'react-feather'; import resourceUrl de '@magento/peregrine/lib/util/makeUrl'; import { useHistory } from 'react-router-dom'; import { shape, string } from 'prop-types'; importar defaultClasses de './SimiCartIcon.css'; import { FormattedMessage, useIntl } from 'react-intl'; const SimiCartIcon = adereços => { classes const = defaultClasses; const { formatMessage } = useIntl(); const histórico = useHistória(); Retorna ( <botão aria-label={formatMessage({ id: `blog.bloglabel`, mensagem padrão: 'Blog' })} className={classes.root} onClick={() => history.push(resourceUrl('/simicart'))} > <Icon src={FastForward} /> <span className={classes.label}> <FormattedMessage id={`Blog`} /> </span> </button> ); } SimiCartIcon.propTypes = { classes: forma({ raiz: string }) }; SimiCartIcon.defaultProps = {}; exportar padrão SimiCartIcon;
Então estilize:
.raiz { alinhar-itens: centro; cursor: ponteiro; exibição: inline-flex; justificar-conteúdo: centro; altura da linha: 1; eventos de ponteiro: auto; alinhamento de texto: centro; espaço em branco: nowrap; propriedade de transição: cor; duração da transição: 224ms; função de tempo de transição: cubic-bezier(0, 0, 0.2, 1); altura: 3rem; largura: 3rem; } .etiqueta { Mostrar nenhum;; } @media (largura mínima: 641px) { .raiz { largura: automático; } .etiqueta { exibição: inicial; margin-inline-start: 0.25rem; } }
O resultado:

E isso conclui nosso tutorial. Sinta-se à vontade para nos tirar qualquer dúvida se houver alguma parte confusa, e se você acha que este tutorial é útil, não se esqueça de classificá-lo como útil!
Além disso, se você quiser experimentar uma extensão do Magento PWA Studio, temos módulos complementares gratuitos e de código aberto que você pode instalar no site do Magento PWA Studio.
Consulte Mais informação:
Magento PWA Studio: links e recursos úteis