{"id":2338,"date":"2023-11-30T14:57:13","date_gmt":"2023-11-30T14:57:13","guid":{"rendered":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/?p=2338"},"modified":"2023-11-30T14:57:13","modified_gmt":"2023-11-30T14:57:13","slug":"compila-una-vez-despliega-donde-quieras","status":"publish","type":"post","link":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/compila-una-vez-despliega-donde-quieras\/","title":{"rendered":"Compila una vez, despliega donde quieras"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2374\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/SPA.jpg\" alt=\"\" width=\"816\" height=\"537\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/SPA.jpg 816w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/SPA-300x197.jpg 300w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/SPA-768x505.jpg 768w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/SPA-610x401.jpg 610w\" sizes=\"auto, (max-width: 816px) 100vw, 816px\" \/><\/p>\n<p>En este art\u00edculo os cuento una estrategia eficiente para desplegar una SPA con Azure Static Web Apps. Utilizando servicios como App Configuration y Azure Function Apps, esta propuesta os permite compilar la aplicaci\u00f3n una vez y desplegarla en varios entornos sin necesidad de recompilaci\u00f3n \ud83d\ude09<\/p>\n<p><!--more--><\/p>\n<p>Dentro del ciclo de despliegue de una SPA, el escenario habitual para llevar nuestra aplicaci\u00f3n a los diferentes entornos suele ser este:<\/p>\n<p><img decoding=\"async\" class=\"size-full wp-image-2339 aligncenter\" style=\"font-size: 16px;\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/build-once-deploy-everywhere-many-buids.svg\" alt=\"\" \/><\/p>\n<p>Contamos con un n\u00famero N de entornos y una configuraci\u00f3n espec\u00edfica para cada entorno. En el proceso de despliegue de nuestra aplicaci\u00f3n, realizamos un proceso de compilaci\u00f3n o \u201cbuild\u201d, en el cual, adecuamos las configuraciones de la aplicaci\u00f3n al entorno en el que deseamos desplegar el c\u00f3digo.<\/p>\n<p>Este enfoque tiene unos cuantos contras, como, por ejemplo, \u00bfqu\u00e9 pasa si en mi proceso de despliegue he configurado mal alg\u00fan valor? estoy obligado a recompilar de nuevo toda mi aplicaci\u00f3n para poder arreglar el error, o \u00bfpor qu\u00e9 deber\u00eda estar compilando m\u00e1s de una vez la misma versi\u00f3n de la aplicaci\u00f3n? teniendo que compilar la aplicaci\u00f3n por cada entorno estoy a\u00f1adiendo tiempo de espera al proceso de entrega de valor y gastando tiempo de ejecuci\u00f3n en la m\u00e1quina que tiene que compilar mi c\u00f3digo.<\/p>\n<p>En este art\u00edculo veremos una manera de hacer que la configuraci\u00f3n de nuestra aplicaci\u00f3n sea prove\u00edda por el mismo entorno en el que estamos desplegando durante el arranque de la aplicaci\u00f3n, de tal manera que solamente vamos a necesitar compilar una vez para poder desplegar donde queramos. <strong>Build once, deploy everywhere<\/strong><\/p>\n<p><a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/build-once-deploy-everywhere-one-build.svg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-2348\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/build-once-deploy-everywhere-one-build.svg\" alt=\"\" width=\"1\" height=\"1\" \/><\/a><a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/build-once-deploy-everywhere-one-build.svg\"><img decoding=\"async\" class=\"size-full wp-image-2348 aligncenter\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/build-once-deploy-everywhere-one-build.svg\" alt=\"\" \/><\/a><\/p>\n<p>Para alcanzar este escenario nos vamos a apoyar en unos cuantos servicios de Azure.<\/p>\n<h2>App Configuration<\/h2>\n<p>Es el servicio que nos va a servir como almac\u00e9n de configuraciones. Aqu\u00ed daremos de alta nuestras configuraciones, las etiquetaremos por entorno y ser\u00e1 el lugar desde donde las consumamos.<\/p>\n<h2>Static Web Apps<\/h2>\n<p>Es el servicio en el que nos apoyaremos para realizar gran parte de la magia que vamos a necesitar. Ideal para desplegar nuestras aplicaciones de javascript.<\/p>\n<p>De entre muchas de sus features, destaca que pone a nuestra disposici\u00f3n un proyecto de Azure Functions para invocar desde nuestra aplicaci\u00f3n, como si fuese una especie de \u201cback-end\u201d al que podemos atacar a trav\u00e9s del extremo \u201c\/api\u201d desde el c\u00f3digo de js.<\/p>\n<p>El servicio de Static Web Apps cuenta con tiers:<\/p>\n<ul>\n<li>El tier Free, que establece las functions en modo \u201cmanaged\u201d y nos obliga a desarrollar el c\u00f3digo dentro del mismo repositorio que el de la aplicaci\u00f3n SPA.<\/li>\n<li>El tier Standart, que, costando 9 d\u00f3lares al mes, adem\u00e1s nos permite vincular cualquier proyecto de functions a nuestra web, sin necesidad de compartir repositorio o proceso de despliegue con el resto de la aplicaci\u00f3n.<\/li>\n<\/ul>\n<h2>Functions Apps<\/h2>\n<p>Es el servicio que nos va a permitir ejecutar peque\u00f1as l\u00f3gicas en base a eventos, como, por ejemplo, llamadas HTTP, la subida de un archivo a un storage o una expresi\u00f3n cron.<\/p>\n<p>Con las azure functions haremos la puerta de enlace entre nuestro App Configuration y nuestra Static Web App, permitiendo acceder al c\u00f3digo de javascript a los valores de la configuraci\u00f3n del entorno.<\/p>\n<h2>\u00bfQu\u00e9 vamos a necesitar?<\/h2>\n<p>Para conseguir el escenario deseado haremos uso de:<\/p>\n<ul>\n<li>Al menos un App Configuration<\/li>\n<li>Tantas Static Web Apps como entornos en los que deseemos desplegar nuestro c\u00f3digo<\/li>\n<li>Tantas Azure Function Apps como Static Web Apps tengamos<\/li>\n<\/ul>\n<h2>Consideraciones de esta soluci\u00f3n<\/h2>\n<p>A fecha de la escritura de este art\u00edculo, la posibilidad de conectar nuestras functions con App Configuration no est\u00e1 soportada por las functions de tipo \u201cmanaged\u201d lo cual nos obliga a establecer todas nuestras Static Web Apps en el plan Standart, y de esa manera poder vincular una Function App externa.<\/p>\n<p>Tambi\u00e9n, actualmente Static Web Apps solo permite enlazar un proyecto de functions a un \u00fanico environment de la Static Web App, a\u00fan que quiz\u00e1s esto cambie en un futuro nos limita:<\/p>\n<ul>\n<li>El poder reutilizar el mismo proyecto de functions para todas nuestras Static Web Apps.<\/li>\n<li>La capacidad de levantar environment secundarios, ya que, si nuestra configuraci\u00f3n es necesaria para el arranque de la aplicaci\u00f3n, no tenemos acceso a ella desde otro environment que no sea el de Producci\u00f3n.<\/li>\n<\/ul>\n<h2>Hora de hacer la magia<\/h2>\n<p>Partimos del escenario en el que tenemos los recursos:<\/p>\n<p>Un App Configuration<\/p>\n<p><a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/app-conf.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2343 size-full\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/app-conf.png\" alt=\"\" width=\"429\" height=\"63\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/app-conf.png 429w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/app-conf-300x44.png 300w\" sizes=\"auto, (max-width: 429px) 100vw, 429px\" \/><\/a><\/p>\n<p>Un par de proyectos de functions<\/p>\n<p><a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/function-projects.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2354 size-full\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/function-projects.png\" alt=\"\" width=\"522\" height=\"120\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/function-projects.png 522w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/function-projects-300x69.png 300w\" sizes=\"auto, (max-width: 522px) 100vw, 522px\" \/><\/a><\/p>\n<p>Para el ejemplo voy a partir de una aplicaci\u00f3n de React generada con vite, en la que consultaremos con una llamada al inicio de la aplicaci\u00f3n el valor de una configuraci\u00f3n y se pintar\u00e1 por pantalla. Esta app esta subida a un repositorio de Github.<\/p>\n<p>Toca crear unas Static Web Apps. Nos dirigimos al portal de azure e iniciamos el proceso de crear el recurso. En este punto es importante fijarnos en dos detalles.<\/p>\n<ol>\n<li>El tier del recurso. Nosotros lo necesitamos en la capa standart<\/li>\n<li>La ruta de la API. Como vamos a hacer uso de la capacidad de \u201cbring you own function\u201d, dejaremos ese campo vac\u00edo<a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/create_swa_1-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2362 size-full\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/create_swa_1-1.png\" alt=\"\" width=\"755\" height=\"879\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/create_swa_1-1.png 755w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/create_swa_1-1-258x300.png 258w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/create_swa_1-1-610x710.png 610w\" sizes=\"auto, (max-width: 755px) 100vw, 755px\" \/><\/a><a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/create_swa_1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2349 size-full\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/create_swa_1.png\" alt=\"\" width=\"755\" height=\"879\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/create_swa_1.png 755w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/create_swa_1-258x300.png 258w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/create_swa_1-610x710.png 610w\" sizes=\"auto, (max-width: 755px) 100vw, 755px\" \/><\/a><\/li>\n<\/ol>\n<p>Yo voy a enlazar el recurso con el repositorio de mi cuenta de GitHub para aprovechar que autom\u00e1ticamente se genera una Github Action que maneja el proceso de CI\/CD de la aplicaci\u00f3n.<\/p>\n<h2>Nuestra function<\/h2>\n<p>En la aplicaci\u00f3n de React vamos a crear una nueva carpeta bajo \u201c<em>src\u201d<\/em> llamada <strong>api<\/strong>, en esta ruta es donde voy a dejar el c\u00f3digo de mi function.<\/p>\n<p>Al estar en el modelo de \u201cbring you own function\u201d, el c\u00f3digo de nuestra function podr\u00eda estar en cualquier lado, incluso en otro repositorio, nosotros nos encargamos de desarrollar, mantener y desplegar ese c\u00f3digo por nuestra cuenta. El motivo por el que lo dejamos aqu\u00ed es por comodidad.<\/p>\n<p>Vamos a generar una function en NET 6 en modo Isolated. Para hacer esto nos podemos apoyar del scaffold que hace Visual Studio de un proyecto de functions.<\/p>\n<p>Habiendo hecho todo esto nos quedar\u00e1 una estructura muy parecida a esta.<\/p>\n<p><a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/folder-structure.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2351 size-full\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/folder-structure.png\" alt=\"\" width=\"301\" height=\"666\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/folder-structure.png 301w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/folder-structure-136x300.png 136w\" sizes=\"auto, (max-width: 301px) 100vw, 301px\" \/><\/a><\/p>\n<p>En el Program.cs del proyecto de functions vamos a configurar la conexi\u00f3n a nuestro App Configuration. Para ello vamos a necesitar los nugets:<\/p>\n<ul>\n<li>Azure.AppConfiguration.Functions.Worker<\/li>\n<li>Extensions.Configuration.AzureAppConfiguration<\/li>\n<\/ul>\n<p>Y configuraremos el c\u00f3digo de esta manera<\/p>\n<p><a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/Function-program-cs.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2353 size-full\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/Function-program-cs.png\" alt=\"\" width=\"1682\" height=\"1902\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/Function-program-cs.png 1682w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/Function-program-cs-265x300.png 265w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/Function-program-cs-906x1024.png 906w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/Function-program-cs-768x868.png 768w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/Function-program-cs-1358x1536.png 1358w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/Function-program-cs-610x690.png 610w\" sizes=\"auto, (max-width: 1682px) 100vw, 1682px\" \/><\/a><\/p>\n<p>En funci\u00f3n de la variable de entorno en el que se despliegue nuestro c\u00f3digo, consumiremos un conjunto de configuraciones u otro.<\/p>\n<p>Si nos damos cuenta, estamos preparando la function para que sea sensible a reconocer los cambios en la configuraci\u00f3n en tiempo de ejecuci\u00f3n, escuchando el valor de \u201cSentinel\u201d. En este otro <a href=\"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/app-configuration-con-refresco-dinamico-de-settings\/\">art\u00edculo<\/a> explico de forma detallada c\u00f3mo funciona este mecanismo, as\u00ed que te recomend\u00f3 echarle un vistazo.<\/p>\n<p>Ahora solo nos falta crear una function que consulte la configuraci\u00f3n y la sirva como respuesta a una petici\u00f3n HTTP<\/p>\n<h2><a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/function.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2352 size-full\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/function.png\" alt=\"\" width=\"1936\" height=\"1678\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/function.png 1936w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/function-300x260.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/function-1024x888.png 1024w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/function-768x666.png 768w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/function-1536x1331.png 1536w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/function-610x529.png 610w\" sizes=\"auto, (max-width: 1936px) 100vw, 1936px\" \/><\/a><\/h2>\n<h2>Nuestra React App<\/h2>\n<p>Ahora, vamos a preparar nuestra app de React para llamar a nuestra function en el arranque y que obtenga la configuraci\u00f3n.<\/p>\n<p>Vamos a crear un fichero environment.ts, que nos servir\u00e1 para almacenar la informaci\u00f3n de la configuraci\u00f3n.<\/p>\n<p><a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/settings-environment.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2340 size-full\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/settings-environment.png\" alt=\"\" width=\"1228\" height=\"822\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/settings-environment.png 1228w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/settings-environment-300x201.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/settings-environment-1024x685.png 1024w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/settings-environment-768x514.png 768w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/settings-environment-610x408.png 610w\" sizes=\"auto, (max-width: 1228px) 100vw, 1228px\" \/><\/a><\/p>\n<p>En el main.ts, vamos a hacer una llamada fetch al endpoint \u201c\/api\/settings\u201d. La ventaja de este modelo es que al ser nuestra function el \u201cback-end\u201d en la Static Web App, con invocar la ruta \u201c\/api\u201d ya tenemos acceso a nuestras functions sin necesidad de conocer ninguna URL.<\/p>\n<p><a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/render-react-app.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2357 size-full\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/render-react-app.png\" alt=\"\" width=\"1614\" height=\"1538\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/render-react-app.png 1614w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/render-react-app-300x286.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/render-react-app-1024x976.png 1024w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/render-react-app-768x732.png 768w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/render-react-app-1536x1464.png 1536w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/render-react-app-610x581.png 610w\" sizes=\"auto, (max-width: 1614px) 100vw, 1614px\" \/><\/a><\/p>\n<p>Y para hacer la prueba, voy a pintar un valor de la configuraci\u00f3n en el componente principal de la aplicaci\u00f3n que nos saluda con un amigable \u201cHello world!\u201d.<\/p>\n<h2><a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/render-app-component.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2356 size-large\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/render-app-component-840x1024.png\" alt=\"\" width=\"840\" height=\"1024\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/render-app-component-840x1024.png 840w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/render-app-component-246x300.png 246w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/render-app-component-768x936.png 768w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/render-app-component-1260x1536.png 1260w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/render-app-component-610x744.png 610w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/render-app-component.png 1498w\" sizes=\"auto, (max-width: 840px) 100vw, 840px\" \/><\/a><\/h2>\n<h2>En el portal de Azure<\/h2>\n<p>Para finalizar solo nos queda enlazar nuestra Static Web App con nuestra function, para que nos funcione como nuestro \u201cback-end\u201d.<\/p>\n<p>Para hacer esto tenemos dos opciones, usar la interfaz del portal de azure o hacerlo mediante el Azure CLI. Yo personalmente recomiendo hacerlo mediante el CLI, ya que parece dar menos problemas. Se hace a trav\u00e9s del comando<\/p>\n<p><a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/az-cli-link.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2345 size-large\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/az-cli-link-1024x206.png\" alt=\"\" width=\"1024\" height=\"206\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/az-cli-link-1024x206.png 1024w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/az-cli-link-300x60.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/az-cli-link-768x155.png 768w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/az-cli-link-1536x309.png 1536w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/az-cli-link-610x123.png 610w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/az-cli-link.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p>\n<p>Y con esto, ya deber\u00eda aparecer enlazado nuestro proyecto de functions a la Static Web App<\/p>\n<p><a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/linked-funcion-backend.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2355 size-full\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/linked-funcion-backend.png\" alt=\"\" width=\"1440\" height=\"170\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/linked-funcion-backend.png 1440w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/linked-funcion-backend-300x35.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/linked-funcion-backend-1024x121.png 1024w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/linked-funcion-backend-768x91.png 768w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/linked-funcion-backend-610x72.png 610w\" sizes=\"auto, (max-width: 1440px) 100vw, 1440px\" \/><\/a><\/p>\n<h2>A probar<\/h2>\n<p>Con todo el c\u00f3digo desarrollado, la app de React junto al proyecto de functions desplegado y nuestros recursos vinculados ya podemos ver si todo esto funciona<\/p>\n<p>Tenemos estos valores registrados en nuestro App Configuration, los cuales consumiremos en nuestras dos SPAs<\/p>\n<p><a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/app-conf-settings.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2344 size-full\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/app-conf-settings.png\" alt=\"\" width=\"730\" height=\"144\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/app-conf-settings.png 730w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/app-conf-settings-300x59.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/app-conf-settings-610x120.png 610w\" sizes=\"auto, (max-width: 730px) 100vw, 730px\" \/><\/a><\/p>\n<p>Nos dirigimos a nuestra Static Web App para el entorno de DEV y vemos que tenemos un fant\u00e1stico \u201cHello world from development!\u201d que coincide con los valores de DEV de nuestra configuraci\u00f3n.<\/p>\n<p><a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/swa-dev.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2341 size-full\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/swa-dev.png\" alt=\"\" width=\"723\" height=\"668\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/swa-dev.png 723w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/swa-dev-300x277.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/swa-dev-610x564.png 610w\" sizes=\"auto, (max-width: 723px) 100vw, 723px\" \/><\/a><\/p>\n<p>Y ahora, si nos vamos a la Static Web App de PRO vemos que tenemos la misma p\u00e1gina, pero con los valores correspondientes de ese entorno.<\/p>\n<p><a href=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/swa-pro.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2342 size-full\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/swa-pro.png\" alt=\"\" width=\"552\" height=\"614\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/swa-pro.png 552w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/swa-pro-270x300.png 270w\" sizes=\"auto, (max-width: 552px) 100vw, 552px\" \/><\/a><\/p>\n<p>\u00a1Lo hemos conseguido! \u00a1Nuestras SPAs est\u00e1n tomando la configuraci\u00f3n del entorno en el que est\u00e1n desplegadas sin necesidad de ser compiladas cada vez!<\/p>\n<p>Por \u00faltimo, veamos que pros y contras tiene esta aproximaci\u00f3n<\/p>\n<h2>Pros y contras<\/h2>\n<p>PROS<\/p>\n<ol>\n<li>No tenemos que mantener la configuraci\u00f3n de la aplicaci\u00f3n en el c\u00f3digo, las podemos tener en un repositorio com\u00fan que est\u00e1 especializado en guardar ese tipo de informaci\u00f3n.<\/li>\n<li>No tenemos la necesidad de recompilar y desplegar cada vez que queramos cambiar la configuraci\u00f3n, con modificar el App Configuration ya tenemos la aplicaci\u00f3n lista casi al instante.<\/li>\n<\/ol>\n<p>CONTRAS<\/p>\n<ol>\n<li>Al menos, hasta hoy d\u00eda, perdemos la capacidad de levantar entornos secundarios en la Static Web App, ya que la configuraci\u00f3n es necesaria para el arranque y no se puede tener vinculada la function a entornos secundarios.<\/li>\n<\/ol>\n<p>Os dejo en este enlace el <a href=\"https:\/\/github.com\/AndresSanRo\/azure-swa-build-once-deplot-everywhere\">repositorio de GitHub<\/a> con el c\u00f3digo que he desarrollado para el art\u00edculo. Espero que lo hayas encontrado de utilidad.<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content --><span class=\"et_bloom_bottom_trigger\"><\/span>","protected":false},"excerpt":{"rendered":"<p>En este art\u00edculo os cuento una estrategia eficiente para desplegar una SPA con Azure Static Web Apps. Utilizando servicios como App Configuration y Azure Function Apps, esta propuesta os permite compilar la aplicaci\u00f3n una vez y desplegarla en varios entornos &hellip; <a href=\"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/compila-una-vez-despliega-donde-quieras\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":193,"featured_media":2374,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[144,98],"tags":[],"class_list":["post-2338","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-azure","category-reactjs"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v18.2.1 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Compila una vez, despliega donde quieras - Piensa en software, desarrolla en colores<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/compila-una-vez-despliega-donde-quieras\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Compila una vez, despliega donde quieras\" \/>\n<meta property=\"og:description\" content=\"En este art\u00edculo os cuento una estrategia eficiente para desplegar una SPA con Azure Static Web Apps. Utilizando servicios como App Configuration y Azure Function Apps, esta propuesta os permite compilar la aplicaci\u00f3n una vez y desplegarla en varios entornos &hellip; Continue reading &rarr;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/compila-una-vez-despliega-donde-quieras\/\" \/>\n<meta property=\"og:site_name\" content=\"Piensa en software, desarrolla en colores\" \/>\n<meta property=\"article:published_time\" content=\"2023-11-30T14:57:13+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/SPA.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"816\" \/>\n\t<meta property=\"og:image:height\" content=\"537\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Andr\u00e9s S\u00e1nchez Roble\u00f1o\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9s S\u00e1nchez Roble\u00f1o\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/compila-una-vez-despliega-donde-quieras\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/compila-una-vez-despliega-donde-quieras\\\/\"},\"author\":{\"name\":\"Andr\u00e9s S\u00e1nchez Roble\u00f1o\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#\\\/schema\\\/person\\\/b4177badafd61061e939c45e3e2c6d72\"},\"headline\":\"Compila una vez, despliega donde quieras\",\"datePublished\":\"2023-11-30T14:57:13+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/compila-una-vez-despliega-donde-quieras\\\/\"},\"wordCount\":1639,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/compila-una-vez-despliega-donde-quieras\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/wp-content\\\/uploads\\\/sites\\\/21\\\/2023\\\/11\\\/SPA.jpg\",\"articleSection\":[\"AZure\",\"ReactJS\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/compila-una-vez-despliega-donde-quieras\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/compila-una-vez-despliega-donde-quieras\\\/\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/compila-una-vez-despliega-donde-quieras\\\/\",\"name\":\"Compila una vez, despliega donde quieras - Piensa en software, desarrolla en colores\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/compila-una-vez-despliega-donde-quieras\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/compila-una-vez-despliega-donde-quieras\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/wp-content\\\/uploads\\\/sites\\\/21\\\/2023\\\/11\\\/SPA.jpg\",\"datePublished\":\"2023-11-30T14:57:13+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#\\\/schema\\\/person\\\/b4177badafd61061e939c45e3e2c6d72\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/compila-una-vez-despliega-donde-quieras\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/compila-una-vez-despliega-donde-quieras\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/wp-content\\\/uploads\\\/sites\\\/21\\\/2023\\\/11\\\/SPA.jpg\",\"contentUrl\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/wp-content\\\/uploads\\\/sites\\\/21\\\/2023\\\/11\\\/SPA.jpg\",\"width\":816,\"height\":537},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#website\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/\",\"name\":\"Piensa en software, desarrolla en colores\",\"description\":\"Las ventajas que te ofrece Microsoft Azure y el mundo.NET\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#\\\/schema\\\/person\\\/b4177badafd61061e939c45e3e2c6d72\",\"name\":\"Andr\u00e9s S\u00e1nchez Roble\u00f1o\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0bdd170031df5f8351199d72b038ebfc632f9ca40078f4246923b0ed5517d996?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0bdd170031df5f8351199d72b038ebfc632f9ca40078f4246923b0ed5517d996?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0bdd170031df5f8351199d72b038ebfc632f9ca40078f4246923b0ed5517d996?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9s S\u00e1nchez Roble\u00f1o\"},\"description\":\"T\u00e9cnico superior en desarrollo de aplicaciones web y Microsoft Certified Solutions Developer. Apasionado de las tecnolog\u00edas y de como usarlas para dar soluciones a problemas complejos. Disfruta de aprender cada d\u00eda algo nuevo y de aportar todo su valor en su actual puesto como Cloud Solutions Developer en ENCAMINA. Dando pasos de beb\u00e9 para luego poder dar pasos de gigante.\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/author\\\/asanchez\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Compila una vez, despliega donde quieras - Piensa en software, desarrolla en colores","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/compila-una-vez-despliega-donde-quieras\/","og_locale":"es_ES","og_type":"article","og_title":"Compila una vez, despliega donde quieras","og_description":"En este art\u00edculo os cuento una estrategia eficiente para desplegar una SPA con Azure Static Web Apps. Utilizando servicios como App Configuration y Azure Function Apps, esta propuesta os permite compilar la aplicaci\u00f3n una vez y desplegarla en varios entornos &hellip; Continue reading &rarr;","og_url":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/compila-una-vez-despliega-donde-quieras\/","og_site_name":"Piensa en software, desarrolla en colores","article_published_time":"2023-11-30T14:57:13+00:00","og_image":[{"width":816,"height":537,"url":"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/SPA.jpg","type":"image\/jpeg"}],"author":"Andr\u00e9s S\u00e1nchez Roble\u00f1o","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"Andr\u00e9s S\u00e1nchez Roble\u00f1o","Tiempo de lectura":"11 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/compila-una-vez-despliega-donde-quieras\/#article","isPartOf":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/compila-una-vez-despliega-donde-quieras\/"},"author":{"name":"Andr\u00e9s S\u00e1nchez Roble\u00f1o","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#\/schema\/person\/b4177badafd61061e939c45e3e2c6d72"},"headline":"Compila una vez, despliega donde quieras","datePublished":"2023-11-30T14:57:13+00:00","mainEntityOfPage":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/compila-una-vez-despliega-donde-quieras\/"},"wordCount":1639,"commentCount":0,"image":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/compila-una-vez-despliega-donde-quieras\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/SPA.jpg","articleSection":["AZure","ReactJS"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/compila-una-vez-despliega-donde-quieras\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/compila-una-vez-despliega-donde-quieras\/","url":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/compila-una-vez-despliega-donde-quieras\/","name":"Compila una vez, despliega donde quieras - Piensa en software, desarrolla en colores","isPartOf":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/compila-una-vez-despliega-donde-quieras\/#primaryimage"},"image":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/compila-una-vez-despliega-donde-quieras\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/SPA.jpg","datePublished":"2023-11-30T14:57:13+00:00","author":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#\/schema\/person\/b4177badafd61061e939c45e3e2c6d72"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/compila-una-vez-despliega-donde-quieras\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/compila-una-vez-despliega-donde-quieras\/#primaryimage","url":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/SPA.jpg","contentUrl":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2023\/11\/SPA.jpg","width":816,"height":537},{"@type":"WebSite","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#website","url":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/","name":"Piensa en software, desarrolla en colores","description":"Las ventajas que te ofrece Microsoft Azure y el mundo.NET","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Person","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#\/schema\/person\/b4177badafd61061e939c45e3e2c6d72","name":"Andr\u00e9s S\u00e1nchez Roble\u00f1o","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/0bdd170031df5f8351199d72b038ebfc632f9ca40078f4246923b0ed5517d996?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/0bdd170031df5f8351199d72b038ebfc632f9ca40078f4246923b0ed5517d996?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0bdd170031df5f8351199d72b038ebfc632f9ca40078f4246923b0ed5517d996?s=96&d=mm&r=g","caption":"Andr\u00e9s S\u00e1nchez Roble\u00f1o"},"description":"T\u00e9cnico superior en desarrollo de aplicaciones web y Microsoft Certified Solutions Developer. Apasionado de las tecnolog\u00edas y de como usarlas para dar soluciones a problemas complejos. Disfruta de aprender cada d\u00eda algo nuevo y de aportar todo su valor en su actual puesto como Cloud Solutions Developer en ENCAMINA. Dando pasos de beb\u00e9 para luego poder dar pasos de gigante.","url":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/author\/asanchez\/"}]}},"_links":{"self":[{"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/posts\/2338","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/users\/193"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/comments?post=2338"}],"version-history":[{"count":0,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/posts\/2338\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/media\/2374"}],"wp:attachment":[{"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/media?parent=2338"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/categories?post=2338"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/tags?post=2338"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}