Advertisement
  1. Web Design
  2. Middleman

Trabajando con datos, activos y plantillas en Middleman

Scroll to top
Read Time: 12 min
This post is part of a series called Building Static Websites with Middleman.
How to Set Up a Static Website With Middleman
Project: Build a Complete Website With Middleman

Spanish (Español) translation by Elías Nicolás (you can also view the original English article)

Este segundo tutorial sobre la creación de sitios web estáticos con Middleman profundiza un poco más en el marco. Al final, debe saber lo suficiente como para construir su propio proyecto desde cero. Cubriremos temas como archivos de datos, URL bonitas, plantillas de proyectos y la canalización de activos, ¡así que estancados!

Archivos de información

Por lo tanto, después de haber seguido el primer tutorial, ya habrá aprendido a jugar con los datos; Materia frontal almacenada en las secciones delimitadas por tres guiones de páginas individuales. También puede escribir archivos de datos separados en YAML o JSON y colocarlos en un directorio "/ data". Esto es útil si tiene sitios más complejos con datos que rara vez cambian, y donde no desea mantener esos datos directamente en su HTML.

Digamos que tienes los derechos para vender todas las películas de James Bond. Podríamos poner una lista de ellos en un archivo de datos e iterarlos en nuestra vista. Si necesitaríamos cambiar o actualizar esos datos cuando haya una nueva película disponible, solo tendría que aplicar ese cambio en su archivo de datos .yaml o .json. No recomendaría hacerlo para datos que sean complejos de alguna manera; es factible, pero se siente muy dudoso y equivocado.

Por ejemplo, aquí está el aspecto que podría tener un archivo /data/bond.yaml:

1
movies:

2
- title: "Dr. No"
3
  year:  "1962"
4
  text:  "John Strangways, the British Intelligence (SIS) Station Chief in Jamaica, is killed. In response, British agent James Bond—also known as 007—is sent to Jamaica to investigate the circumstances. During his investigation Bond meets Quarrel, a Cayman fisherman, who had been working with Strangways around the nearby islands to collect mineral samples. One of the islands was Crab Key, home to the reclusive Dr. No."
5
  image: "bond_movie_01.png"
6
- title: "From Russia with Love"
7
  year:  "1963"
8
  text:  "SPECTRE's expert planner Kronsteen devises a plot to steal a Lektor cryptographic device from the Soviets and sell it back to them while exacting revenge on Bond for killing their agent Dr. No; ex-SMERSH operative Rosa Klebb is in charge of the mission. She recruits Donald "Red" Grant as an assassin and Tatiana Romanova, a cipher clerk at the Soviet consulate in Istanbul, as the unwitting bait."
9
  image: "bond_movie_02.png"
10
- title: "Goldfinger"
11
  year:  "1964"
12
  text:  "Bond is ordered to observe bullion dealer Auric Goldfinger: he sees Goldfinger cheating at cards and stops him by distracting his employee, who is subsequently killed by Goldfinger's Korean manservant Oddjob. Bond is then instructed to investigate Goldfinger's gold smuggling and he follows the dealer to Switzerland. Bond is captured when he reconnoitres Goldfinger's plant and is drugged; he is taken to Goldfinger's Kentucky stud farm and is imprisoned. He escapes briefly to witness Goldfinger's meeting with U.S. mafiosi, who have brought the materials he needs for an operation to rob Fort Knox."
13
  image: "bond_movie_03.png"
14
...

Luego muestre como está en source/bond-movies.html.erb:

1
<h2>Bond movies</h2>
2
<ol>
3
<% data.bond.movies.each do |movie| %>
4
  <li>
5
  <%= image_tag movie.image %>
6
    <h3><%= movie.title %></h3>
7
    <h6><%= movie.year %></h6>
8
    <p> <%= movie.text %></p>
9
  </li>
10
<% end %>
11
</ol>

Una de las ventajas de estos archivos de datos es que son seguros. Aún mejor, su directorio /data con todos los datos YAML o JSON no se enviará a su servidor en linea. Durante la fase de compilación, sus datos se inyectan en sus plantillas localmente antes de que se implementen. Después de eso, los datos en tus vistas son simplemente HTML estático. ¡Genial!

Convenciones de nombres

Una palabra sobre convenciones de nombres aquí. Cuando tiene archivos de datos en un directorio de "datos", obtiene acceso a un objeto data. Middleman luego crea "objetos" para cada archivo .yml, .yaml o .json a los que puede acceder a través del objeto data iniciales encadenándolo. A continuación, tendrá acceso a los atributos que ha almacenado. En nuestro caso, tenemos un “objeto” movies YAML con los atributos title, year, text y image.

1
<%= data.data_file_name.yaml_or_json_object.attribute %>
2
3
<%= data.bond.movies.image %>
4
<%= data.bond.movies.title %>
5
<%= data.bond.movies.year %>
6
<%= data.bond.movies.text %>

Si tiene subdirectorios, solo tiene que pegarlos. Supongamos que tiene el archivo de datos de sus películas bond en un directorio spy_movies (por ejemplo: /data/spy_movies/bond.yaml) Ahora debería acceder a él de la siguiente manera:

1
<%= data.spy_movies.bond.movies.title %>

Por último, debo agregar que el almacenamiento en JSON podría ser preferible a algunas personas, pero todas las comas, corchetes y llaves en exceso me desaniman para ser honesto. No solo en los archivos de datos sino también en las secciones frontales. Depende de usted lo que más le convenga, por supuesto, vealo usted mismo:

some_file.yaml:

1
bond_girls:
2
- Strawberry Fields 
3
- Jill Masterson
4
- Tiffany Case

some_file.json:

1
{
2
  "bond_girls": [
3
    "Strawberry Fields",
4
    "Jill Masterson",
5
    "Tiffany Case"
6
  ]
7
}

URL bonitas

Si tiene un archivo como source/bond-movies.html.erb, terminará como https://appname.com/bond-movies.html. Durante el proceso de compilación perdemos la extensión de archivo ".erb" y terminamos con la versión final ".html" de esa página, que se refleja en la URL. Eso está bien, cosas normales. Para URLs más sofisticadas como http://appname.com/bond-movies tenemos que trabajar un poco.

Debe activar la extensión Directory Indexes en su config.rb. Esto crea una carpeta para cada archivo .html. Durante middleman build, la página terminada termina como el archivo de índice de esa carpeta, lo que significa que, como archivo de índice, su extensión no tendrá que aparecer en la URL. Si prestó atención, es posible que ya haya visto esto en funcionamiento con el archivo index.html estándar que se crea para cada proyecto de Middleman como una página de destino. Enciende tu servidor y compruébalo por ti mismo.

En config.rb:

1
activate :directory_indexes

Veamos qué sucedió después de middleman build en tu archivo bond-movies.html.erb si has activado esa extensión. Middleman habrá creado una carpeta de "build/bond-movies" y su nombre de archivo original habrá sido cambiado a index.html (build/bond-movies/index.html).

Aquí está la salida de Shell:

1
create  build/bond-movies/index.html

Sin embargo, hay una pequeña advertencia. Antes de activar URL bonitas, puede confiar en el uso de la ruta de los activos. Ahora, con los índices de directorio en su lugar, debe suministrar activos con su ruta completa y absoluta. Por lo tanto, llamar a una imagen solo por su nombre, por ejemplo, ya no funcionara.

Si, por algún motivo, desea anular el comportamiento de esa extensión para un archivo en particular, puede hacerlo.

En config.rb:

1
page "/bond-movies.html", :directory_index => false

Aquí está la salida de Shell si la cambia de nuevo para bond-movies.html.erb:

1
create  build/bond-movies.html
2
remove  build/bond-movies/index.html
3
remove  build/bond-movies

Ahora su URL vuelve a la normalidad para ese archivo de nuevo. (http://appname.com/bond-movies.html)

Además, puede optar por excluirse del esquema de denominación de índice del directorio localmente en el frente de su página individual:

1
---
2
directory_index: false
3
---
4
5
<h1>Bond movies</h1>
6
...

Si quieres construir esa estructura con carpetas y sus respectivos archivos de índice, Middleman no te va a molestar. Funciona de la misma manera y los intermediarios los ignoran si se mezclan y combinan ese enfoque.

Pipleline del activo

Me gustaría ir al grano con este y solo mostrarte las piezas que creo que son realmente relevantes.

El "pipleline de activos" es la jerga de Rails importada a Middleman. Bajo el capó, una gema llamada Sprockets hace todo el trabajo pesado. Le ayuda a manejar la administración de dependencias, combinando y minimizando los activos, lo que ayuda a reducir significativamente sus activos. También se encuentran a su disposición algunos métodos de ayuda para hacer referencia de manera concisa a los activos. Más allá de eso, también se le proporcionan los medios para escribir código Sass y CoffeeScript, de manera inmediata.

Concatenación

La concatenación es una de las características más importantes de la línea de activos. En lugar de tener muchas solicitudes HTML separadas para cada archivo CSS y JS, puede reducirlas drásticamente concatenándolas en uno o en un puñado de archivos. Cuantas menos solicitudes hagas, más rápido se cargará tu aplicación.

Concatenacion de JavaScript

De forma predeterminada, Sprockets presionará todos los archivos JavaScript en un solo archivo .js. Después de middleman build, este archivo se encontrará en /build/javascripts/all.js. Lo mismo ocurre con tu CSS. Después del proceso de compilación, tendrá todos los archivos Sass concatenados juntos en la build/stylesheets/all.css.

Combina sus recursos de JavaScript utilizando parciales (cuyos nombres de archivo comienzan con un guión bajo) y luego require en la parte superior de su archivo source/javascripts/all.js. Los archivos con una extensión .coffee agregada funcionan exactamente igual. La orden sí importa para este proceso.

Aquí, por ejemplo, está la parte superior de source/javascript/all.js:

1
//= require "_jquery"

2
//= require "_lib_code"

3
//= require "_animations"

filefilefile

Cuando eche un vistazo a su nuevo directorio /build, solo encontrará un archivo .js en /javascripts.

filefilefile

Concatenación de CSS

Para su código Sass, la historia es básicamente la misma, pero debe usar la importación de Sass para @import sus parciales, en lugar de require de Sprockets. Nuevamente, coloque los archivos "requeridos" en la parte superior, esta vez prestando atención al pedido. A diferencia de requerir los parciales de JavaScript, deja fuera el guión bajo cuando importa parciales de Sass. Por ejemplo

1
@import 'normalize';
2
@import 'header';
3
@import 'navigation';
4
@import 'footer';
filefilefile
filefilefile

Compresión (minificación)

Otra característica interesante de las ruedas dentadas es la compresión, también llamada minificación. Este proceso reduce mucho la grasa, como deshacerse de espacios en blanco y comentarios innecesarios. La gente también llama a este proceso uglifying (y, por supuesto, hay una gema llamada uglifier que hace un hermoso trabajo). En comparación con la minificación de activos de JavaScript, la uglificación de CSS no es tan complicada.

Para comenzar, deberá agregar lo siguiente a su archivo config.rb:

1
configure :build do
2
  activate :minify_css
3
  activate :minify_javascript
4
end

En realidad, solo necesitas descomentar estas líneas debajo de tu :build block. La próxima vez que use middleman build, compile los recursos en su carpeta / build, todo estará uglificado y delgado. A continuación se muestran dos pequeños ejemplos de cómo este código termina apareciendo:

CSS reducido en /build/stylesheets/all.css:

1
body{background-color:#d0e4fe}h1{color:orange;text-align:center}p{font-family:"Times New Roman";font-size:20px}

JS reducido en /build/javascripts/all.js:

1
switch((new Date).getDay()){case 0:day="Sunday";break;case 1:day="Monday";break;case 2:day="Tuesday";break;case 3:day="Wednesday";break;case 4:day="Thursday";break;case 5:day="Friday";break;case 6:day="Saturday"}

Sin el pipeline de activos, tendría que configurar su propio objeto para escribir su JavaScript y CSS a través de lenguajes de nivel superior como CoffeeScript y Sass.

Ayudantes de tubería de activos

Para tus archivos Sass tienes cuatro ayudantes a tu disposición:

  • image_path()
  • font_path()
  • image_url()
  • font_url()

Como ha seguido las convenciones hasta el momento, puede usar estos ayudantes para anteponer la ruta de directorio correcta a sus activos.

En un archivo Sass, por ejemplo:

1
image_path('logo.png')
2
# => images/logo.png
3
4
image_path('nested_folder/some.png')
5
# => images/nested_folder/some.png

Ruta de importación

La canalización de activos utiliza rutas de importación a través de Sprockets para sus activos. Por defecto :js_dir y :css_dir ya están agregados a esa ruta. Eso significa que los archivos colocados en /source/javascripts y /source/stylesheets están disponibles e importados automáticamente. Por otro lado, si tiene recursos que desea conservar en otros directorios, también puede agregarlos a la ruta de importación editando config.rb:

1
sprockets.append_path '/some/other/assets_folder/'

En este ejemplo, otros activos en source/some/other/assets_folder/other.css también están a disposición de Middleman a través de esta ruta. Lo mismo ocurre con los archivos .js también.

Plantillas de proyectos

Middleman viene con un par de plantillas de proyectos útiles que al menos debes conocer. Estas plantillas le brindan un buen punto de partida cuando inicia una nueva aplicación Middleman. También puede agregar estas plantillas en cualquier momento más tarde:

  • Plantilla SMACSS
  • Plantilla Base de móviles
  • Plantilla Base HTML5
  • Plantilla Blog (necesita gema extra)

Puedes usarlos así, a través de la línea de comando:

1
middleman init your_fancy_app --template=smacss

La plantilla le proporcionará todos los archivos y carpetas que necesita. Si ya tiene una aplicación y desea agregar una plantilla, use el mismo comando sin mencionar el nombre de la aplicación. Lo mismo:

1
middleman init --template=smacss

Ahora viene mi parte favorita de Middleman. Es muy sencillo crear sus propias plantillas y reutilizarlas cuando lo desee. Comience por crear una carpeta ~/.middleman en su directorio raíz (no olvide el punto delante del nombre). Dentro de ese directorio creas nuevas carpetas para tus plantillas. Por ejemplo, /.middleman/podcast sería una plantilla podcast. Luego llene este directorio de podcasts con todos los archivos y carpetas que necesita. Por ejemplo, si desea tener disponibles hojas de estilo adicionales para su aplicación Middleman, entonces necesita simular la ruta de archivo de Middleman para que sea muy fácil de usar.

En la captura de pantalla a continuación, preparé un ejemplo ficticio que contiene un par de archivos que podría necesitar para cada proyecto ubicado en una carpeta "bourbon". Ahora tengo una plantilla de bourbon.

filefilefile

Desde que simulé la estructura de archivos de Middleman, estas hojas de estilo se mostrarán exactamente donde las necesito después de que inicie esa plantilla. Mis archivos ahora están en /source/stylesheets y también están listos para ser importados en mi /source/stylesheets/all.css.scss.

filefilefile

Como ya hice los parciales de mis estilos de plantilla, es como siempre. Aquí está mi source/stylesheets/all.css.scss:

1
@import 'bourbon_mixins/mixins';
2
@import 'bourbon_neat/grids';
3
@import 'bourbon_refills/cards';
4
...

¡Terminado! Sin embargo, debe tener cuidado con una cosa: cuando usamos middleman build para crear nuestro nuevo directorio build, all.css absorberá estos archivos y ninguna de las carpetas de plantillas  bourbon aparecerá allí. Sin embargo, si olvida tener un guión bajo en sus nombres de archivo para estos estilos, la carpeta completa se transferirá a /build, junto con los respectivos archivos .css. Las declaraciones de @import en all.css.scss tampoco harán una diferencia en ese caso.

Comprobación de plantillas

Si tiene un montón de plantillas y solo quiere buscar un nombre en la lista, puede usar el siguiente comando:

1
middleman init --help
2
3
# =>  # Use a project template: default, html5, mobile, smacss, bourbon

En caso de que quiera reinventar la rueda, eche un vistazo a estas plantillas de código abierto. Si nunca has jugado mucho con las plantillas, te recomiendo que inicies una aplicación ficticia y las pruebes. Vea qué archivos se crean o se sobrescriben. Juegue un poco. Luego, cree una carpeta ficticia con un par de archivos Sass para una plantilla en ~/.middleman y vea qué sucede cuando inicia esa plantilla. ¡Nada mejor que aprender haciendo estos pequeños experimentos en el camino!

Pensamientos finales

Creo que ahora estás más que listo para comenzar a construir una pequeña aplicación con Middleman. Te quedan algunas cosas por aprender por tu cuenta, pero te he presentado las piezas más importantes del rompecabezas.

Middleman es muy divertido y una buena opción en cuanto a tecnología. Es potente, fácil de usar y tiene una API sencilla y amigable para los principiantes; eso es todo lo que importa por ahora. ¡Que te diviertas!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Web Design tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.