{"id":28813,"date":"2023-05-30T11:00:19","date_gmt":"2023-05-30T09:00:19","guid":{"rendered":"https:\/\/www.hiberus.com\/crecemos-contigo\/?p=28813"},"modified":"2024-01-25T10:34:30","modified_gmt":"2024-01-25T09:34:30","slug":"spartacus-para-reducir-la-carga-de-peticiones-a-servidores","status":"publish","type":"post","link":"https:\/\/www.hiberus.com\/crecemos-contigo\/spartacus-para-reducir-la-carga-de-peticiones-a-servidores\/","title":{"rendered":"Spartacus para reducir la carga de peticiones a servidores"},"content":{"rendered":"<p><a href=\"https:\/\/www.hiberus.com\/crecemos-contigo\/sap-commerce-cloud-y-spartacus-el-frontal-de-tu-e-commerce-seo-friendly-con-angular\/\" target=\"_blank\" rel=\"noopener\">SAP Commerce Cloud y Spartacus<\/a> ofrecen numerosas ventajas frente a otras tecnolog\u00edas en el <strong>desarrollo de frontales desacoplados basados en Angular<\/strong>. SAP Commerce recomienda el uso de esta librer\u00eda hasta el punto de apostar por ella y ofrecerla como una soluci\u00f3n oficial, renombr\u00e1ndola a partir de su quinta versi\u00f3n como <strong>SAP Composable Storefront<\/strong>. Adem\u00e1s puedes emplear Spartacus para reducir la carga de peticiones a servidores.<\/p>\n<p>Todo desarrollador de p\u00e1ginas web experimentado conoce los beneficios de <strong>reducir la carga de peticiones<\/strong>, ya sea para <strong>disminuir los tiempos de carga<\/strong> (y por tanto incrementar la retenci\u00f3n de usuarios en la p\u00e1gina) o para <strong>aumentar el <a href=\"https:\/\/www.hiberus.com\/crecemos-contigo\/posicionamiento-seo\/\" target=\"_blank\" rel=\"noopener\">posicionamiento SEO<\/a><\/strong> y ascender en el listado de resultados de los motores de b\u00fasqueda. Algunos de los m\u00e9todos habituales, como la minificaci\u00f3n de JS y CSS, la compresi\u00f3n de im\u00e1genes y la implementaci\u00f3n de una cach\u00e9, intentan reducir el tama\u00f1o de los datos o distribuir la carga para ser capaces de responder en el menor tiempo posible. Estos m\u00e9todos permiten responder m\u00e1s r\u00e1pido, pero no reducen la carga que el servidor tendr\u00e1 que procesar. En este sentido, <strong>Spartacus<\/strong> va un paso m\u00e1s all\u00e1 y usa una estrategia para reducir la informaci\u00f3n que se solicita a los servidores.<\/p>\n<h2><strong>NGRX y Field Level Optimization<\/strong><\/h2>\n<p>Antes de explicar la estrategia de Spartacus, es necesario mencionar <strong>NGRX<\/strong>, es decir, la implementaci\u00f3n de Redux en Angular. Esta librer\u00eda permite la creaci\u00f3n de un objeto JavaScript llamado \u2018Store\u2019 que est\u00e1 disponible en toda la aplicaci\u00f3n, y que proporciona un patr\u00f3n de dise\u00f1o para acceder a \u00e9l. Este objeto tiene una vida muy corta, dado que <strong>se crea cuando se carga la p\u00e1gina y se borra cuando se cierra o cuando se refresca<\/strong>. Adem\u00e1s, su valor es diferente en cada pesta\u00f1a del navegador.<\/p>\n<p>Spartacus trata la Store como una cach\u00e9 almacenada en el propio frontal. As\u00ed, en un primer lugar, puede parecer que a\u00f1adir una segunda cach\u00e9 no sea de mucha utilidad. Sin embargo, si se combina con el uso del \u2018Field level customization\u2019 de SAP Commerce, permite <strong>reducir al m\u00ednimo la carga sobre el servidor<\/strong>.<\/p>\n<p>En lugar de llamar a un endpoint que recupera toda la informaci\u00f3n de un componente o un pedido, SAP Commerce env\u00eda un par\u00e1metro \u2018fields\u2019 en el que se especifican los campos que se desean recuperar. Del mismo modo, Spartacus define varios \u2018scopes\u2019 al hacer peticiones, lo que permite atacar al mismo endpoint variando la lista de par\u00e1metros que solicita seg\u00fan el uso que se le vaya a dar a la informaci\u00f3n.<\/p>\n<p>Por ejemplo, en el caso de la p\u00e1gina de detalles de producto (PDP), Spartacus realiza una carga completa de la informaci\u00f3n del producto, pero puede recuperar \u00fanicamente el stock o el precio cuando sea necesario. Una vez que se ha recuperado la informaci\u00f3n, \u00e9sta se almacena en la Store. En cuanto a la caducidad de los datos, desde la propia configuraci\u00f3n se puede definir por cu\u00e1nto tiempo se considera v\u00e1lida la informaci\u00f3n. Si se supera ese tiempo, se lanzar\u00e1 una petici\u00f3n, aunque ya se hubiese hecho anteriormente.<\/p>\n<p>Adem\u00e1s de los beneficios mencionados, agregar una cach\u00e9 en el lado del cliente implica que, si una pieza de informaci\u00f3n ya ha sido almacenada, no ser\u00e1 necesario hacer una solicitud al servidor para recuperarla, <strong>reduciendo significativamente el tiempo de espera y haciendo la carga de la informaci\u00f3n m\u00e1s r\u00e1pida<\/strong>. De hecho, en algunos casos es pr\u00e1cticamente instant\u00e1nea.<\/p>\n<h2><strong>\u00bfC\u00f3mo funciona la estrategia de Spartacus para reducir la carga de peticiones a servidores?<\/strong><\/h2>\n<p>En las aplicaciones de <a href=\"https:\/\/www.hiberus.com\/crecemos-contigo\/que-es-angular-y-para-que-sirve\/\" target=\"_blank\" rel=\"noopener\">Angular<\/a>, con o sin Spartacus, se usan los servicios para acceder a los datos, normalmente a trav\u00e9s de peticiones. Para explicar todo el flujo tomaremos como ejemplo una petici\u00f3n de detalle de producto, pero antes de continuar debemos comprender las piezas de la Store:<\/p>\n<ul>\n<li><strong>Estado<\/strong>: es el valor de la aplicaci\u00f3n, el objeto JavaScript como tal.<\/li>\n<li><strong>Selectores<\/strong>: son funciones que devuelven el estado de la Store. Tienen la capacidad de filtrar y mutar los valores sin alterar el estado original, qued\u00e1ndose con partes m\u00e1s peque\u00f1as.<\/li>\n<li><strong>Acciones<\/strong>: son eventos capaces de llevar informaci\u00f3n. Los efectos y los reductores est\u00e1n esperando a que se lance una acci\u00f3n para actuar.<\/li>\n<li><strong>Reductores<\/strong>: mutan el estado utilizando la informaci\u00f3n que llevan las acciones. Son los \u00fanicos capaces de alterar la Store.<\/li>\n<li><strong>Efectos<\/strong>: responden a una acci\u00f3n y son capaces de a\u00f1adir l\u00f3gica al proceso. Se usan para hacer peticiones y emitir nuevas acciones en funci\u00f3n de la informaci\u00f3n recibida.<\/li>\n<\/ul>\n<p>Ahora que comprendemos estos conceptos, continuemos. Todo empieza <strong>accediendo al servicio<\/strong>. Llamamos a la funci\u00f3n get(), indic\u00e1ndole (o no) el Scope que queremos obtener (por defecto usa &#8216;default&#8217;). Internamente usa EntityLoaders para <strong>comprobar si la Store contiene informaci\u00f3n de ese producto<\/strong>, lo cual trataremos m\u00e1s en profundidad en otro art\u00edculo. Si est\u00e1 vac\u00eda, lanza una acci\u00f3n para <strong>iniciar el flujo de carga de datos<\/strong>.<\/p>\n<p>Acto seguido (tenga o no informaci\u00f3n) <strong>usa un selector y devuelve un Observable<\/strong>. Los observables forman parte de la programaci\u00f3n reactiva (rxjs), y act\u00faan como un flujo de datos que cada vez que hay un cambio en la informaci\u00f3n emite un valor, como la cinta transportadora que reparte maletas en un aeropuerto. Aqu\u00ed acaba el trabajo del servicio, que ha devuelto la informaci\u00f3n que ped\u00edamos mediante una \u00abreferencia\u00bb que se actualizar\u00e1 de forma as\u00edncrona en cuanto los datos est\u00e9n disponibles.<\/p>\n<p>Recordemos que, en caso de no tener la informaci\u00f3n, <strong>el servicio lanza una acci\u00f3n para obtener los datos<\/strong>. <strong>El efecto recoge esa acci\u00f3n y lanza una petici\u00f3n a backend a trav\u00e9s de un Connector<\/strong>, tambi\u00e9n tema para otro futuro art\u00edculo. En resumidas cuentas, <strong>recupera la informaci\u00f3n y la trata para ajustarla a sus interfaces<\/strong>.<\/p>\n<p>Si todo va bien y es capaz de obtenerla emitir\u00e1 una <strong>acci\u00f3n \u2018Success\u2019<\/strong> y el reductor se har\u00e1 cargo de ella. Este reductor <strong>formatea la informaci\u00f3n para ajustarla a la estructura de la Store y la enriquecer\u00e1<\/strong> para que los EntityLoaders funcionen correctamente. En este momento, la informaci\u00f3n pasa a formar parte de la Store y <strong>todas las suscripciones al Observable devuelto por el servicio<\/strong> (las personas que andan buscando su maleta) <strong>recibir\u00e1n la informaci\u00f3n<\/strong>. Si la petici\u00f3n efectuada desde el efecto fallase, este manejar\u00e1 el error y emitir\u00e1 una acci\u00f3n \u2018Fail\u2019, que OOTB no recibe ning\u00fan uso.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-28843 size-full\" src=\"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2023\/05\/MicrosoftTeams-image-9.png\" alt=\"Spartacus para reducir la carga de peticiones a servidores\" width=\"751\" height=\"346\" srcset=\"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2023\/05\/MicrosoftTeams-image-9.png 751w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2023\/05\/MicrosoftTeams-image-9-300x138.png 300w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2023\/05\/MicrosoftTeams-image-9-360x166.png 360w\" sizes=\"auto, (max-width: 751px) 100vw, 751px\" \/><\/p>\n<h2><strong>Conclusi\u00f3n<\/strong><\/h2>\n<p>Spartacus es una tecnolog\u00eda que ofrece diversas ventajas para el <strong>desarrollo de frontales desacoplados basados en Angular<\/strong>. Una de sus principales estrategias para optimizar la carga de peticiones se basa en la<strong> implementaci\u00f3n de la librer\u00eda NGRX<\/strong>. Mediante la utilizaci\u00f3n de una cach\u00e9 en el frontal y la especificaci\u00f3n de los campos que se desean recuperar en las peticiones, Spartacus es capaz de minimizar la carga sobre los servidores y reducir significativamente los tiempos de carga de la p\u00e1gina, con todos los beneficios adicionales que esto supone. Adem\u00e1s, al almacenar la informaci\u00f3n en la Store, es posible evitar hacer peticiones innecesarias al servidor, eliminando en su totalidad el tiempo de espera.<\/p>\n<p>En\u00a0<a href=\"https:\/\/www.hiberus.com\/agencia-digital\" target=\"_blank\" rel=\"noopener\"><strong>Hiberus Digital<\/strong><\/a>\u00a0hacemos realidad la transformaci\u00f3n digital de tu compa\u00f1\u00eda. Disponemos de un equipo multidisciplinar, expertos en todos los \u00e1mbitos de acci\u00f3n de los negocios digitales. Si est\u00e1s pensando en\u00a0<strong>implantar esta soluci\u00f3n o migrar tu soluci\u00f3n SAP a la nube<\/strong>, no dudes en contactar con nosotros. Nuestros <strong><a href=\"https:\/\/www.hiberus.com\/ecommerce\/sap\" target=\"_blank\" rel=\"noopener\">expertos en SAP<\/a><\/strong> estar\u00e1n encantados de ayudarte.<\/p>\n        <div class=\"row\">\n            <div class=\"block-cta-form\" style=\"background-color: #003664;\">\n                <div class=\"content-cta-form\">\n                    <div class=\"text-cta-form\">\n                        <p class=\"title-cta-form\">\u00bfQuieres m\u00e1s informaci\u00f3n sobre nuestros servicios de SAP CX?<\/p>\n                        <p>Contacta con nuestro equipo de SAP CX<\/p>\n                    <\/div>\n                    <div class=\"form-fields\">\n                        \n<div class=\"wpcf7 no-js\" id=\"wpcf7-f33973-o1\" lang=\"es-ES\" dir=\"ltr\" data-wpcf7-id=\"33973\">\n<div class=\"screen-reader-response\"><p role=\"status\" aria-live=\"polite\" aria-atomic=\"true\"><\/p> <ul><\/ul><\/div>\n<form action=\"\/crecemos-contigo\/wp-json\/wp\/v2\/posts\/28813#wpcf7-f33973-o1\" method=\"post\" class=\"wpcf7-form init\" aria-label=\"Formulario de contacto\" novalidate=\"novalidate\" data-status=\"init\">\n<fieldset class=\"hidden-fields-container\"><input type=\"hidden\" name=\"_wpcf7\" value=\"33973\" \/><input type=\"hidden\" name=\"_wpcf7_version\" value=\"6.1.5\" \/><input type=\"hidden\" name=\"_wpcf7_locale\" value=\"es_ES\" \/><input type=\"hidden\" name=\"_wpcf7_unit_tag\" value=\"wpcf7-f33973-o1\" \/><input type=\"hidden\" name=\"_wpcf7_container_post\" value=\"0\" \/><input type=\"hidden\" name=\"_wpcf7_posted_data_hash\" value=\"\" \/><input type=\"hidden\" name=\"_wpcf7_recaptcha_response\" value=\"\" \/>\n<\/fieldset>\n<div id=\"responsive-form\" class=\"clearfix\">\n\t<div class=\"form-row\">\n\t\t<div class=\"column-half\">\n\t\t\t<p><span class=\"wpcf7-form-control-wrap\" data-name=\"nombre\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text wpcf7-validates-as-required\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"Nombre *\" value=\"\" type=\"text\" name=\"nombre\" \/><\/span>\n\t\t\t<\/p>\n\t\t<\/div>\n\t\t<div class=\"column-half\">\n\t\t\t<p><span class=\"wpcf7-form-control-wrap\" data-name=\"apellido\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text wpcf7-validates-as-required\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"Apellido *\" value=\"\" type=\"text\" name=\"apellido\" \/><\/span>\n\t\t\t<\/p>\n\t\t<\/div>\n\t<\/div>\n\t<div class=\"form-row\">\n\t\t<div class=\"column-half\">\n\t\t\t<p><span class=\"wpcf7-form-control-wrap\" data-name=\"correo\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-email wpcf7-validates-as-required wpcf7-text wpcf7-validates-as-email\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"Correo corporativo *\" value=\"\" type=\"email\" name=\"correo\" \/><\/span>\n\t\t\t<\/p>\n\t\t<\/div>\n\t\t<div class=\"column-half\">\n\t\t\t<p><span class=\"wpcf7-form-control-wrap\" data-name=\"telf-contacto\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-tel wpcf7-validates-as-required wpcf7-text wpcf7-validates-as-tel\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"Tel\u00e9fono *\" value=\"\" type=\"tel\" name=\"telf-contacto\" \/><\/span>\n\t\t\t<\/p>\n\t\t<\/div>\n\t<\/div>\n\t<div class=\"form-row\">\n\t\t<div class=\"column-half\">\n\t\t\t<p><span class=\"wpcf7-form-control-wrap\" data-name=\"compania\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text wpcf7-validates-as-required\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"Compa\u00f1ia *\" value=\"\" type=\"text\" name=\"compania\" \/><\/span>\n\t\t\t<\/p>\n\t\t<\/div>\n\t<\/div>\n\t<div class=\"form-row\">\n\t\t<div class=\"column-full\">\n\t\t\t<p><span class=\"wpcf7-form-control-wrap\" data-name=\"mensaje\"><textarea cols=\"40\" rows=\"10\" maxlength=\"2000\" class=\"wpcf7-form-control wpcf7-textarea wpcf7-validates-as-required\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"Mensaje *\" name=\"mensaje\"><\/textarea><\/span>\n\t\t\t<\/p>\n\t\t<\/div>\n\t<\/div>\n\t<div class=\"form-row\">\n\t\t<div class=\"column-full color-acceptance\">\n\t\t\t<p><span class=\"wpcf7-form-control-wrap\" data-name=\"politica\"><span class=\"wpcf7-form-control wpcf7-acceptance\"><span class=\"wpcf7-list-item\"><label><input type=\"checkbox\" name=\"politica\" value=\"1\" aria-invalid=\"false\" \/><span class=\"wpcf7-list-item-label\">He le\u00eddo y acepto la <a href=\"https:\/\/www.hiberus.com\/politica\" target=\"_blank\"><u>Pol\u00edtica de privacidad<\/u><\/a><\/span><\/label><\/span><\/span><\/span>\n\t\t\t<\/p>\n\t\t<\/div>\n\t<\/div>\n\t<div class=\"form-row\">\n\t\t<div class=\"column-full color-acceptance\">\n\t\t\t<p><span class=\"wpcf7-form-control-wrap\" data-name=\"marketing\"><span class=\"wpcf7-form-control wpcf7-acceptance optional\"><span class=\"wpcf7-list-item\"><label><input type=\"checkbox\" name=\"marketing\" value=\"1\" aria-invalid=\"false\" \/><span class=\"wpcf7-list-item-label\">Me gustar\u00eda recibir comunicaciones de marketing de Hiberus y sobre sus productos, servicios y eventos.<\/span><\/label><\/span><\/span><\/span>\n\t\t\t<\/p>\n\t\t<\/div>\n\t<\/div>\n\t<div class=\"form-row\">\n\t\t<div class=\"column-half\">\n\t\t\t<p><input class=\"wpcf7-form-control wpcf7-submit has-spinner\" type=\"submit\" value=\"Contacta con nosotros\" \/>\n\t\t\t<\/p>\n\t\t<\/div>\n\t<\/div>\n\t<div class=\"form-row\">\n\t\t<div id=\"campos_ocultos\" class=\"hidden\">\n\t\t\t<p><span class=\"wpcf7-form-control-wrap\" data-name=\"oculto_analitica_new1\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text\" id=\"oculto_analitica_new1\" aria-invalid=\"false\" value=\"\" type=\"text\" name=\"oculto_analitica_new1\" \/><\/span><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"oculto_analitica_new2\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text\" id=\"oculto_analitica_new2\" aria-invalid=\"false\" value=\"\" type=\"text\" name=\"oculto_analitica_new2\" \/><\/span><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"oculto_analitica_new3\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text\" id=\"oculto_analitica_new3\" aria-invalid=\"false\" value=\"\" type=\"text\" name=\"oculto_analitica_new3\" \/><\/span><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"oculto_analitica_new4\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text\" id=\"oculto_analitica_new4\" aria-invalid=\"false\" value=\"\" type=\"text\" name=\"oculto_analitica_new4\" \/><\/span><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"oculto_analitica_new_p\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text\" id=\"oculto_analitica_new_p\" aria-invalid=\"false\" value=\"\" type=\"text\" name=\"oculto_analitica_new_p\" \/><\/span>\n\t\t\t<\/p>\n\t\t<\/div>\n\t<\/div>\n<\/div>\n\n<!--end responsive-form--><div class=\"wpcf7-response-output\" aria-hidden=\"true\"><\/div>\n<\/form>\n<\/div>\n                    <\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n        \n","protected":false},"excerpt":{"rendered":"<p>SAP Commerce Cloud y Spartacus ofrecen numerosas ventajas frente a otras tecnolog\u00edas en el desarrollo de frontales desacoplados basados en Angular. SAP&#8230;<\/p>\n","protected":false},"author":302,"featured_media":28816,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_ayudawp_aiss_exclude":false,"footnotes":""},"categories":[3,233],"tags":[177,68,83],"class_list":{"0":"post-28813","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-negocio-electronico","8":"category-tecnologias-ecommmerce","9":"tag-sap-c-4hana","10":"tag-sap-hybris","11":"tag-software-sap"},"acf":[],"_links":{"self":[{"href":"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-json\/wp\/v2\/posts\/28813","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-json\/wp\/v2\/users\/302"}],"replies":[{"embeddable":true,"href":"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-json\/wp\/v2\/comments?post=28813"}],"version-history":[{"count":9,"href":"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-json\/wp\/v2\/posts\/28813\/revisions"}],"predecessor-version":[{"id":40117,"href":"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-json\/wp\/v2\/posts\/28813\/revisions\/40117"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-json\/wp\/v2\/media\/28816"}],"wp:attachment":[{"href":"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-json\/wp\/v2\/media?parent=28813"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-json\/wp\/v2\/categories?post=28813"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-json\/wp\/v2\/tags?post=28813"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}