{"id":11,"date":"2016-03-14T01:15:46","date_gmt":"2016-03-14T01:15:46","guid":{"rendered":"http:\/\/multimedia.uoc.edu\/blogs\/frontend\/?p=11"},"modified":"2016-03-14T01:20:51","modified_gmt":"2016-03-14T01:20:51","slug":"uso-basico-de-gulp","status":"publish","type":"post","link":"http:\/\/multimedia.uoc.edu\/blogs\/frontend\/2016\/03\/14\/uso-basico-de-gulp\/","title":{"rendered":"Uso b\u00e1sico de gulp"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-72\" src=\"http:\/\/multimedia.uoc.edu\/blogs\/frontend\/files\/2016\/03\/gulp-build-system.png\" alt=\"gulp-build-system\" width=\"784\" height=\"379\" style=\"width:100%;height:auto\" srcset=\"http:\/\/multimedia.uoc.edu\/blogs\/frontend\/files\/2016\/03\/gulp-build-system.png 784w, http:\/\/multimedia.uoc.edu\/blogs\/frontend\/files\/2016\/03\/gulp-build-system-300x145.png 300w, http:\/\/multimedia.uoc.edu\/blogs\/frontend\/files\/2016\/03\/gulp-build-system-768x371.png 768w\" sizes=\"auto, (max-width: 784px) 100vw, 784px\" \/><\/p>\n<p><b><\/b><span style=\"font-weight: 400\">A continuaci\u00f3n mostramos el flujo de trabajo habitual con <a href=\"http:\/\/gulpjs.com\/\" target=\"_blank\">Gulp<\/a>, para la creaci\u00f3n y configuraci\u00f3n de un proyecto, y posterior trabajo sobre los ficheros del mismo.<\/span><\/p>\n<blockquote style=\"border-left: 5px solid #ddd;padding: 5px 5px 5px 30px;font-style: italic\"><p>Dado que el fichero gulpfile.js hace uso de la API incluida en <a href=\"http:\/\/gulpjs.com\/\" target=\"_blank\">Gulp<\/a>, es importante revisar el material de la asignatura en el punto 3.4.4 Build Systems, y m\u00e1s concretamente la parte destinada a Gulp, adem\u00e1s de la propia <a href=\"https:\/\/github.com\/gulpjs\/gulp\/blob\/master\/docs\/API.md\" target=\"_blank\">documentaci\u00f3n sobre la API de comandos b\u00e1sicos<\/a>.<\/p><\/blockquote>\n<p>Partimos de un escenario en el que ya se encuentra disponible una instalaci\u00f3n de <a href=\"https:\/\/nodejs.org\/en\/\" target=\"_blank\">nodeJS<\/a> y de <a href=\"https:\/\/www.npmjs.com\/\" target=\"_blank\">npm<\/a> en nuestro equipo y tenemos una carpeta dentro del directorio de trabajo del servidor web (en caso de XAMPP por defecto en la carpeta htdocs, aunque es algo que se puede cambiar en el\u00a0fichero httpd.conf de apache modificando la ruta asignada a DocumentRoot) que en su interior contiene la estructura de carpetas que muestra la imagen:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-61\" style=\"width: 100%;height: auto\" src=\"http:\/\/multimedia.uoc.edu\/blogs\/frontend\/files\/2016\/03\/Captura-de-pantalla-2016-03-12-a-las-11.11.50.png\" alt=\"Estructura proyecto web b\u00e1sico\" width=\"510\" height=\"174\" srcset=\"http:\/\/multimedia.uoc.edu\/blogs\/frontend\/files\/2016\/03\/Captura-de-pantalla-2016-03-12-a-las-11.11.50.png 510w, http:\/\/multimedia.uoc.edu\/blogs\/frontend\/files\/2016\/03\/Captura-de-pantalla-2016-03-12-a-las-11.11.50-300x102.png 300w\" sizes=\"auto, (max-width: 510px) 100vw, 510px\" \/><\/p>\n<h3>1) Instalaci\u00f3n del CLI de Gulp de forma global<\/h3>\n<p><span style=\"font-weight: 400\">El siguiente paso es acceder a la consola de comandos o al terminal para instalar \u00abCLI\u00bb (Command Line Interface) de\u00a0<a href=\"http:\/\/gulpjs.com\/\" target=\"_blank\">Gulp<\/a>\u00a0de forma global. Esto lo logramos a trav\u00e9s de npm, con el comando habitual de instalaci\u00f3n de un paquete:<\/span><\/p>\n<pre class=\"theme:powershell lang:sh decode:true\">npm install --global gulp-cli<\/pre>\n<p>En el caso de realizar la instalaci\u00f3n en OSX, puede ser que nos de arroje errores\u00a0de permisos, en cuyo caso habr\u00eda que lanzar esa misma linea precedida de <strong>sudo<\/strong>.<\/p>\n<h3>2) Instalaci\u00f3n de Gulp en el proyecto local<\/h3>\n<p>Una vez tenemos el CLI instalado, podemos instalar ahora\u00a0Gulp como dependencia del proyecto con el que queremos trabajar, de manera que adem\u00e1s quede registrado\u00a0en el fichero\u00a0package.json que previamente hemos creado.<\/p>\n<pre class=\"theme:powershell lang:sh decode:true\">npm install gulp --save-dev<\/pre>\n<p>Con este paso en nuestro proyecto se nos ha generado una carpeta <strong>node_modules<\/strong> que guarda los paquetes necesarios para los plugins que iremos a\u00f1adiendo al entorno de trabajo, y que NO deber\u00eda formar parte del repositorio (por lo tanto se deber\u00eda excluir con git ignore)<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-62\" style=\"width: 100%;height: auto\" src=\"http:\/\/multimedia.uoc.edu\/blogs\/frontend\/files\/2016\/03\/Captura-de-pantalla-2016-03-12-a-las-11.11.07.png\" alt=\"Estructura de carpetas con gulp ya incluido\" width=\"464\" height=\"195\" srcset=\"http:\/\/multimedia.uoc.edu\/blogs\/frontend\/files\/2016\/03\/Captura-de-pantalla-2016-03-12-a-las-11.11.07.png 464w, http:\/\/multimedia.uoc.edu\/blogs\/frontend\/files\/2016\/03\/Captura-de-pantalla-2016-03-12-a-las-11.11.07-300x126.png 300w\" sizes=\"auto, (max-width: 464px) 100vw, 464px\" \/><\/p>\n<h3>3) Instalaci\u00f3n de plugins<\/h3>\n<p>A continuaci\u00f3n, instalamos todos los plugins\u00a0que deseemos usar en nuestro proyecto. Esto podemos\u00a0lograrlo instalando cada uno de ellos desde l\u00ednea de comandos (3A) o bien editando el fichero\u00a0package.json que ten\u00edamos creado en la carpeta ra\u00edz de nuestro proyecto, para que \u00e9ste se use como base para la instalaci\u00f3n completa de todas las dependencias que indica en su interior (3B).<\/p>\n<p>Los plugins que vamos a usar en este tutorial son:<\/p>\n<ul>\n<li><strong><a href=\"https:\/\/www.npmjs.com\/package\/del\" target=\"_blank\">del<\/a>:<\/strong>\u00a0utilidad para borrar ficheros.<\/li>\n<li><strong><a href=\"https:\/\/www.npmjs.com\/package\/gulp-sass\" target=\"_blank\">gulp-sass<\/a>:\u00a0<\/strong>para el trabajo con el preprocesador CSS\u00a0Sass.<\/li>\n<li><strong><a href=\"https:\/\/www.npmjs.com\/package\/gulp-jshint\" target=\"_blank\">gulp-jshint<\/a>:<\/strong>\u00a0para evaluaci\u00f3n de c\u00f3digo JavaScript.<\/li>\n<li><strong><a href=\"https:\/\/www.npmjs.com\/package\/jshint-stylish\" target=\"_blank\">jshint-stylish<\/a>:<\/strong> para estilizar los mensajes de JSHint.<\/li>\n<li><strong><a href=\"https:\/\/www.npmjs.com\/package\/gulp-concat\" target=\"_blank\">gulp-concat<\/a>:<\/strong> para concatenar ficheros.<\/li>\n<li><strong><a href=\"https:\/\/www.npmjs.com\/package\/gulp-uglify\" target=\"_blank\">gulp-uglify<\/a>:<\/strong> para compactar ficheros.<\/li>\n<li><strong><a href=\"https:\/\/www.npmjs.com\/package\/gulp-uglify\" target=\"_blank\">gulp-sourcemaps<\/a>:<\/strong> para poder depurar en el navegador en los fuentes a partir de los compilados o minificados.<\/li>\n<li><strong><a href=\"https:\/\/www.npmjs.com\/package\/gulp-imagemin\" target=\"_blank\">gulp-imagemin<\/a>:<\/strong> para comprimir im\u00e1genes.<\/li>\n<li><strong><a href=\"https:\/\/www.npmjs.com\/package\/browser-sync\" target=\"_blank\">browser-sync<\/a>:<\/strong> para testeo en navegador y dispositivos de forma sincronizada.<\/li>\n<\/ul>\n<h4>3A) Instalaci\u00f3n individual de plugins<\/h4>\n<blockquote><p>Hacemos uso repetido del comando npm install nombre-plugin &#8211;save-dev que adem\u00e1s de instalar el paquete del plugin correspondiente actualiza el fichero package.json (se le indica con el &#8211;save-dev).<\/p><\/blockquote>\n<p>Por ejemplo en el caso de gulp-sass escribir\u00edamos:<\/p>\n<pre class=\"theme:powershell lang:sh decode:true\">npm install gulp-sass --save-dev<\/pre>\n<p>Una forma de agilizar este proceso, que en el caso de este tutorial se tendr\u00eda que repetir 6 veces (una por cada plugin) es hacer la instalaci\u00f3n en una sola l\u00ednea, que ser\u00eda totalmente equivalente a esto:<\/p>\n<pre class=\"theme:powershell lang:sh decode:true\">npm install gulp del gulp-sass gulp-jshint jshint-stylish gulp-concat gulp-uglify gulp-sourcemaps gulp-imagemin browser-sync --save-dev<\/pre>\n<h4>3B) Instalaci\u00f3n a trav\u00e9s de package.json<\/h4>\n<p>La alternativa a\u00a0la instalaci\u00f3n individual\u00a0ser\u00eda contar con la identificaci\u00f3n como dependencias del proyecto\u00a0de los paquetes que queremos en el fichero package.json, del cual tenemos <a href=\"http:\/\/browsenpm.org\/package.json\" target=\"_blank\">un recurso en la red muy ilustrativo sobre la anatom\u00eda de dicho fichero<\/a>.<\/p>\n<p>En nuestro caso\u00a0tendr\u00edamos:<\/p>\n<pre class=\"theme:sublime-text lang:js decode:true\">{\r\n \"name\": \"gulp-basics\",\r\n \"version\": \"0.0.1\",\r\n \"description\": \"Ejemplo b\u00e1sico de entorno de desarrollo front-end con Gulp\",\r\n \"author\": \"Marcos Gonzalez &lt;mgonzalezsancho@uoc.edu&gt;\",\r\n \"devDependencies\": {\r\n \"browser-sync\": \"^2.11.1\",\r\n \"del\": \"^2.2.0\",\r\n \"gulp\": \"^3.9.1\",\r\n \"gulp-concat\": \"^2.6.0\",\r\n \"gulp-imagemin\": \"^2.4.0\",\r\n \"gulp-jshint\": \"^2.0.0\",\r\n \"gulp-sass\": \"^2.2.0\",\r\n \"gulp-sourcemaps\": \"^1.6.0\",\r\n \"gulp-uglify\": \"^1.5.3\",\r\n \"jshint\": \"^2.9.1\",\r\n \"jshint-stylish\": \"^2.1.0\"\r\n }\r\n}<\/pre>\n<p><span style=\"font-weight: 400\">A partir del mismo se podr\u00edan i<\/span><span style=\"font-weight: 400\">nstalar todos los\u00a0plugins indicados como devDependencies en nuestro directorio de proyecto ejecutando la siguiente instrucci\u00f3n,\u00a0una vez nos encontramos dentro de\u00a0la carpeta ra\u00edz del proyecto, es decir al mismo nivel que el fichero package.json<\/span><span style=\"font-weight: 400\">:<\/span><\/p>\n<pre class=\"theme:powershell lang:sh decode:true\">npm install<\/pre>\n<p>Esta instrucci\u00f3n lanza un proceso secuencial que descarga todos los paquetes necesarios para contar con esos plugins en nuestro proyecto. Esta caracter\u00edstica es la que hace importante incluir este fichero en el repositorio, para que cualquier miembro del equipo o nosotros mismos descarg\u00e1ndonos el contenido del repositorio, estemos a un simple comando de obtener todos los paquetes necesarios.<\/p>\n<h3><span style=\"font-weight: 400\">4) A\u00f1adir plugins posteriormente<\/span><\/h3>\n<p><span style=\"font-weight: 400\">Si se quisiera a\u00f1adir alg\u00fan plugin adicional posteriormente y no se desea a\u00f1adirlo manualmente editando el fichero <\/span><span style=\"font-weight: 400\">package.json<\/span><span style=\"font-weight: 400\">, se pueden hacer la instalaci\u00f3n con el formato visto en el punto 3A.<\/span><\/p>\n<pre class=\"theme:powershell lang:sh decode:true\">npm install nombre-paquete --save-dev<\/pre>\n<p><span style=\"font-weight: 400\">Lo que instalar\u00e1 dicho paquete en nuestro proyecto (bajo la carpeta <\/span><span style=\"font-weight: 400\">node_modules<\/span><span style=\"font-weight: 400\">) y adem\u00e1s a\u00f1adir\u00e1 ese plugin <\/span><span style=\"font-weight: 400\">a las dependencias fichero package.json (al incluir el &#8211;save-dev)<\/span><\/p>\n<h3><span style=\"font-weight: 400\">5) Creaci\u00f3n del fichero gulpfile.js<\/span><\/h3>\n<p><span style=\"font-weight: 400\">El otro fichero clave para montar este entorno de trabajo es el denominado gulpfile<\/span><span style=\"font-weight: 400\">.js,\u00a0<\/span><span style=\"font-weight: 400\">que ser\u00e1 el que especifique c\u00f3mo queremos usar esos plugins en nuestro proyecto, nos permita crear las diferentes tareas, combinarlas, etc. El contenido\u00a0del\u00a0fichero gulpfile empleado en este tutorial\u00a0es:<\/span><\/p>\n<pre class=\"lang:js decode:true \">var gulp        = require('gulp'),\r\n    del         = require('del'),\r\n    browserSync = require('browser-sync').create(),\r\n    concat      = require('gulp-concat'),\r\n    imagemin    = require('gulp-imagemin'),\r\n    jshint      = require('gulp-jshint'),\r\n    stylish     = require('jshint-stylish'),\r\n    sass        = require('gulp-sass'),\r\n    sourcemaps  = require('gulp-sourcemaps'),\r\n    uglify      = require('gulp-uglify');\r\n\r\n\r\n\/\/ Definici\u00f3n de direcotrios origen\r\nvar srcPaths = {\r\n    images:   'src\/img\/',\r\n    scripts:  'src\/js\/',\r\n    styles:   'src\/sass\/',\r\n    files:    'src\/'\r\n};\r\n\r\n\r\n\/\/ Definici\u00f3n de directorios destino\r\nvar distPaths = {\r\n    images:   'dist\/img\/',\r\n    scripts:  'dist\/js\/',\r\n    styles:   'dist\/css\/',\r\n    files:    'dist\/'\r\n};\r\n\r\n\r\n\/\/ Limpieza del directorio dist\r\ngulp.task('clean', function(cb) {\r\n  del([ distPaths.files+'*.html', distPaths.images+'**\/*', distPaths.scripts+'*.js', distPaths.styles+'*.css'], cb);\r\n});\r\n\r\n\r\n\/\/ Copia de los cambios en los ficheros html en el directorio dist.\r\ngulp.task('html', function() {\r\n    return gulp.src([srcPaths.files+'*.html'])\r\n        .pipe(gulp.dest(distPaths.files))\r\n        .pipe(browserSync.stream());\r\n});\r\n\r\n\r\n\/* \r\n* Procesamiento de im\u00e1genes para comprimir \/ optimizar las mismas.\r\n*\/ \r\ngulp.task('imagemin', function() {\r\n    return gulp.src([srcPaths.images+'**\/*'])        \r\n        .pipe(imagemin({\r\n            progressive: true,\r\n            interlaced: true,\r\n            svgoPlugins: [{removeUnknownsAndDefaults: false}, {cleanupIDs: false}]\r\n        }))\r\n        .pipe(gulp.dest(distPaths.images))\r\n        .pipe(browserSync.stream());\r\n});\r\n\r\n\r\n\/* \r\n* Procesamiento de ficheros SCSS para la generaci\u00f3n de los ficheros\r\n* CSS correspondientes. Los sourcemaps en este caso se generan dentro \r\n* del propio fichero.\r\n*\/ \r\ngulp.task('css', function() {\r\n    return gulp.src([srcPaths.styles+'**\/*.scss'])\r\n        .pipe(sourcemaps.init())\r\n            .pipe(sass())\r\n        .pipe(sourcemaps.write())\r\n        .pipe(gulp.dest(distPaths.styles))\r\n        .pipe(browserSync.stream());\r\n});\r\n\r\n\r\n\/* \r\n* Procesamiento de ficheros JS mediante JSHint para detecci\u00f3n de errores.\r\n* Este proceso es previo al tratamiento de los ficheros JS para la \r\n* obtenci\u00f3n del fichero concatenado y minificado.\r\n*\/ \r\ngulp.task('lint', function() {\r\n  return gulp.src([srcPaths.scripts+'**\/*.js'])\r\n    .pipe(jshint())\r\n    .pipe(jshint.reporter(stylish));\r\n});\r\n\r\n\r\n\/* \r\n* Procesamiento de ficheros JS para la generaci\u00f3n de un fichero \r\n* final \u00fanico y minificado. Los sourcemaps se generan en una \r\n* carpeta independiente en vez de en el propio fichero.\r\n*\/ \r\ngulp.task('js', ['lint'], function() {\r\n    return gulp.src([srcPaths.scripts+'main.js', srcPaths.scripts+'extra.js'])                            \r\n        .pipe(sourcemaps.init())\r\n            .pipe(concat('all.min.js'))        \r\n            .pipe(uglify())\r\n        .pipe(sourcemaps.write('maps'))\r\n        .pipe(gulp.dest(distPaths.scripts))\r\n        .pipe(browserSync.stream());\r\n});\r\n\r\n\r\n\/*\r\n* Tarea para lanzar el proceso de servidor mediante BrowserSync.\r\n* Antes de comenzar la propia tarea ejecuta las tareas de las que tiene\r\n* dependencia: html, imagemin, css y js necesarias para disponer\r\n* del proyecto en dist, ya que cada vez que se lanza gulp, se hace una\r\n* limpieza de dicho directorio.\r\n*\r\n* En este caso se trabaja con un servidor local mediante un proxy\r\n* y se define la ruta de partida, as\u00ed como los navegadores a lanzar\r\n* en caso de estar disponibles en el equipo.\r\n*\r\n* Adicionalmente se crean los watchers para procesar los cambios que se\r\n* puedan producir en los archivos sensibles para el proyecto.\r\n*\/\r\ngulp.task('serve', ['html', 'imagemin', 'css', 'js'], function() {\r\n    browserSync.init({\r\n        logLevel: \"info\",\r\n        browser: [\"google chrome\", \"Firefox\"],\r\n        proxy: \"localhost:80\",\r\n        startPath: \"\/gulp-basics\/dist\/\"\r\n    });\r\n\r\n    gulp.watch(srcPaths.files+'*.html', ['html']);\r\n    gulp.watch(srcPaths.images+'**\/*', ['imagemin']);   \r\n    gulp.watch(srcPaths.styles+'**\/*.scss', ['css']);\r\n    gulp.watch(srcPaths.scripts+'**\/*.js', ['js']);\r\n});\r\n\r\n\/* \r\n* Definci\u00f3n de la tarea por defecto que en este caso limpia el directorio destino\r\n* y lanza la tarea de servidor.\r\n*\/\r\ngulp.task('default', ['clean', 'serve'], function() {});<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400\">Se puede apreciar en este fichero una de las mayores diferencias con respectoa Grunt, que es que en vez de tener que realizar importantes esfuerzos configurando cada plugin, en este caso se configuran tareas de una forma mucho m\u00e1s intuitiva mediante el encadenamiento de acciones sobre los ficheros procesados. <\/span><\/p>\n<p><span style=\"font-weight: 400\">Con Gulp podemos crear tantas tareas como queramos y combinarlas de forma compleja, incluso aplicando l\u00f3gica mediante JavaScript.<\/span><\/p>\n<h3><span style=\"font-weight: 400\">6)\u00a0Arranque y testeo<\/span><\/h3>\n<p><span style=\"font-weight: 400\">El \u00faltimo paso es lanzar Gulp para que el entorno empiece a funcionar, y podamos comprobar como editando un fichero sass, o un fichero js, o modificando el contenido HTML de nuestra p\u00e1gina podemos ver los cambios en el equipo de trabajo e incluso en otros equipos y dispositivos conectados a trav\u00e9s de browsersync.<\/span><\/p>\n<p>Para ello simplemente, en el terminal o l\u00ednea de comandos, una vez estemos en la carpeta del proyecto, ejecutamos la instrucci\u00f3n gulp indicando la acci\u00f3n\u00a0que queremos ejecutar&#8230; como en este caso hemos preparado la acci\u00f3n por defecto vincul\u00e1ndola a las tareas de limpieza y lanzamiento de BrowserSync junto con la monitorizaci\u00f3n de ficheros, nos valdr\u00eda con simplemente poner en la consola o terminal:<\/p>\n<pre class=\"theme:powershell lang:sh decode:true \">gulp<\/pre>\n<p>Con esto se mostrar\u00edan los correspondientes mensajes de ejecuci\u00f3n de las tareas y si todo va bien se lanzar\u00eda BrowserSync en los navegadores indicados con la p\u00e1gina de salida abierta, tras la ejecuci\u00f3n de todas las tareas asociadas a la ejecuci\u00f3n de la tarea \u00abserve\u00bb<\/p>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>A continuaci\u00f3n mostramos el flujo de trabajo habitual con Gulp, para la creaci\u00f3n y configuraci\u00f3n de un proyecto, y posterior trabajo sobre los ficheros del mismo. Dado que el fichero gulpfile.js hace uso de la API incluida en Gulp, es importante revisar el material de la asignatura en el punto 3.4.4 Build Systems, y m\u00e1s &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/multimedia.uoc.edu\/blogs\/frontend\/2016\/03\/14\/uso-basico-de-gulp\/\" class=\"more-link\">Seguir leyendo<span class=\"screen-reader-text\"> \u00abUso b\u00e1sico de gulp\u00bb<\/span><\/a><\/p>\n","protected":false},"author":49,"featured_media":72,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[9,6],"class_list":["post-11","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutoriales","tag-taskrunnners","tag-workflow","entry"],"_links":{"self":[{"href":"http:\/\/multimedia.uoc.edu\/blogs\/frontend\/wp-json\/wp\/v2\/posts\/11","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/multimedia.uoc.edu\/blogs\/frontend\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/multimedia.uoc.edu\/blogs\/frontend\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/multimedia.uoc.edu\/blogs\/frontend\/wp-json\/wp\/v2\/users\/49"}],"replies":[{"embeddable":true,"href":"http:\/\/multimedia.uoc.edu\/blogs\/frontend\/wp-json\/wp\/v2\/comments?post=11"}],"version-history":[{"count":31,"href":"http:\/\/multimedia.uoc.edu\/blogs\/frontend\/wp-json\/wp\/v2\/posts\/11\/revisions"}],"predecessor-version":[{"id":74,"href":"http:\/\/multimedia.uoc.edu\/blogs\/frontend\/wp-json\/wp\/v2\/posts\/11\/revisions\/74"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/multimedia.uoc.edu\/blogs\/frontend\/wp-json\/wp\/v2\/media\/72"}],"wp:attachment":[{"href":"http:\/\/multimedia.uoc.edu\/blogs\/frontend\/wp-json\/wp\/v2\/media?parent=11"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/multimedia.uoc.edu\/blogs\/frontend\/wp-json\/wp\/v2\/categories?post=11"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/multimedia.uoc.edu\/blogs\/frontend\/wp-json\/wp\/v2\/tags?post=11"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}