|
| 1 | +--- |
| 2 | +title: recursos |
| 3 | +description: El directorio de `assets` (recursos), contiene recursos sin compilar, como imágenes, fuentes de texto o archivos de Sass y Stylus. |
| 4 | +position: 2 |
| 5 | +category: directory-structure |
| 6 | +csb_link: https://codesandbox.io/embed/github/nuxt-academy/guides-examples/tree/master/04_directory_structure/02_assets?fontsize=14&hidenavigation=1&theme=dark |
| 7 | +videoScript: |
| 8 | + - assets-video.md |
| 9 | +questions: |
| 10 | + - question: ¿Qué directorios contienen los archivos sin compilar, Stylus o Sass, imágenes, o fuentes? |
| 11 | + answers: |
| 12 | + - static |
| 13 | + - assets |
| 14 | + - pages |
| 15 | + correctAnswer: assets |
| 16 | + - question: ¿Cómo puedes referenciar el directorio de recursos (`assets`) dentro de los Vue templates? |
| 17 | + answers: |
| 18 | + - '/assets/tu_imagen.png' |
| 19 | + - '@assets/tu_imagen.png' |
| 20 | + - '@/assets/tu_imagen.png' |
| 21 | + correctAnswer: '@/assets/tu_imagen.png' |
| 22 | + - question: ¿Cómo puedes referenciar el directorio de recursos dentro (`assets`) de archivos CSS? |
| 23 | + answers: |
| 24 | + - url("@assets/banner.svg") |
| 25 | + - url("assets/banner.svg") |
| 26 | + - url("@/assets/banner.svg") |
| 27 | + correctAnswer: url("@assets/banner.svg") |
| 28 | + - question: ¿Dónde se incluyen estilos css globales? |
| 29 | + answers: |
| 30 | + - En tu archivo index.vue |
| 31 | + - En el archivo nuxt.config.js |
| 32 | + - En el archivo de `layout` por defecto |
| 33 | + correctAnswer: En el archivo nuxt.config.js |
| 34 | + - question: ¿Qué propiedad css se usa para importar fuentes globales? |
| 35 | + answers: |
| 36 | + - font |
| 37 | + - head |
| 38 | + - css |
| 39 | + correctAnswer: head |
| 40 | + - question: ¿Cuál loader te permite añadir un archivo como base-64 data URL? |
| 41 | + answers: |
| 42 | + - file-loader |
| 43 | + - url-loader |
| 44 | + - image-loader |
| 45 | + correctAnswer: url-loader |
| 46 | + - question: ¿Cuáles son los aliases para el directorio del source (srcDir)? |
| 47 | + answers: |
| 48 | + - '@' |
| 49 | + - '@@' |
| 50 | + - '^' |
| 51 | + correctAnswer: '@' |
| 52 | + - question: ¿Cuáles son los aliases para el directorio del root (rootDir)? |
| 53 | + answers: |
| 54 | + - '@' |
| 55 | + - '@@' |
| 56 | + - '@root' |
| 57 | + correctAnswer: '@@' |
| 58 | +--- |
| 59 | + |
| 60 | +El directorio de `assets` (recursos), contiene recursos sin compilar, como imágenes, fuentes de texto o archivos de Sass y Stylus. |
| 61 | + |
| 62 | +## Imágenes |
| 63 | + |
| 64 | +Si deseas incluir algún recurso dentro del directorio de `assets` en los templates de `vue` puedes hacerlo usando `~/assets/tu_imagen.png` con una barra antes de `assets`. |
| 65 | + |
| 66 | +```html |
| 67 | +<template> |
| 68 | + <img src="~/assets/tu_imagen.png" /> |
| 69 | +</template> |
| 70 | +``` |
| 71 | + |
| 72 | +Si necesitar referir algún recurso dentro de `assets` en tu css, puedes hacerlo asi: `~assets/tu_imagen.png` (sin una barra antes de la palabra `assets`). |
| 73 | + |
| 74 | +```css |
| 75 | +background: url('~assets/banner.svg'); |
| 76 | +``` |
| 77 | + |
| 78 | +Si deseas trabajar con imágenes dinámicas, tienes que usar `require`. |
| 79 | + |
| 80 | +```html |
| 81 | +<img :src="require(`~/assets/img/${imagen}.jpg`)" /> |
| 82 | +``` |
| 83 | + |
| 84 | +<base-alert type="next"> |
| 85 | + |
| 86 | +Conoce más sobre [webpack Assets](/guides/directory-structure/assets#webpack-assets) |
| 87 | + |
| 88 | +</base-alert> |
| 89 | + |
| 90 | +## Estilos |
| 91 | + |
| 92 | +Nuxt.js te permite definir cualquier archivo css, módulos, o librerías que desees configurar globalmente (incluido en cada página). Puedes añadir tus estilos fácilmente desde el `nuxt.config` |
| 93 | + |
| 94 | +```js{}[nuxt.config.js] |
| 95 | +export default { |
| 96 | + css: [ |
| 97 | + // Carga un módulo de Node.js directamente (en este caso es un archivo de Sass) |
| 98 | + 'bulma', |
| 99 | + // Un archivo css dentro del proyecto |
| 100 | + '~/assets/css/main.css', |
| 101 | + // Un archivo SCSS dentro del proyecto |
| 102 | + '~/assets/css/main.scss' |
| 103 | + ] |
| 104 | +} |
| 105 | +``` |
| 106 | + |
| 107 | +<base-alert type="info"> |
| 108 | + |
| 109 | +Si deseas usar `sass` asegúrate de que tengas los paquetes de `node-sass` y `sass-loader` instalados. |
| 110 | + |
| 111 | +</base-alert> |
| 112 | + |
| 113 | +<code-group> |
| 114 | + <code-block label="Yarn" active> |
| 115 | + |
| 116 | +```bash |
| 117 | +yarn add -D node-sass sass-loader |
| 118 | +``` |
| 119 | + |
| 120 | + </code-block> |
| 121 | + <code-block label="NPM"> |
| 122 | + |
| 123 | +```bash |
| 124 | +npm install --save-dev node-sass sass-loader |
| 125 | +``` |
| 126 | + |
| 127 | + </code-block> |
| 128 | +</code-group> |
| 129 | + |
| 130 | +Nuxt.js va a saber automáticamente que tipo de archivo tienes y usará el pre-procesador apropiado de webpack. Comoquiera tendrás que instalar los loaders requeridos si quieres usarlos. |
| 131 | + |
| 132 | +## Fuentes |
| 133 | + |
| 134 | +Puedes usar las fuentes locales si las añades dentro del directorio de `assets`. Cuando ya las hayas añadido, puedes usarlas en tu css con `@font-face`. |
| 135 | + |
| 136 | +``` |
| 137 | +-| assets |
| 138 | +----| fonts |
| 139 | +------| DMSans-Regular.ttf |
| 140 | +------| DMSans-Bold.ttf |
| 141 | +``` |
| 142 | + |
| 143 | +```css{}[assets/main.css] |
| 144 | +@font-face { |
| 145 | + font-family: 'DM Sans'; |
| 146 | + font-style: normal; |
| 147 | + font-weight: 400; |
| 148 | + font-display: swap; |
| 149 | + /* Accesando el archivo de fuentes dentro del directorio de assets */ |
| 150 | + src: url('~assets/fonts/DMSans-Regular.ttf') format('truetype'); |
| 151 | +} |
| 152 | +
|
| 153 | +@font-face { |
| 154 | + font-family: 'DM Sans'; |
| 155 | + font-style: normal; |
| 156 | + font-weight: 700; |
| 157 | + font-display: swap; |
| 158 | + src: url('~assets/fonts/DMSans-Bold.ttf') format('truetype'); |
| 159 | +} |
| 160 | +``` |
| 161 | + |
| 162 | +<base-alert type="next"> |
| 163 | + |
| 164 | +Aprende cómo añadir fuentes externas (como las fuentes de Google Fonts), en el [capítulo de Meta Tags y SEO](/guides/features/meta-tags-seo#external-resources) |
| 165 | + |
| 166 | +</base-alert> |
| 167 | + |
| 168 | +## Recursos de Webpack |
| 169 | + |
| 170 | +Nuxt usa `vue-loader`, `file-loader` y `url-loader` por defecto para servir los recursos del proyecto. También puedes usar el directorio de `static` para recursos que no deberían correr con Webpack. |
| 171 | + |
| 172 | +## Webpack |
| 173 | + |
| 174 | +[vue-loader](http://vue-loader.vuejs.org/) procesa automáticamente los archivos de estilos y templates con `css-loader` y el compilador de Vue template sin ningun tipo de configuración adicional. En este proceso de compilación, todos los URLs de los recursos, `<img src="...">`, `background: url(...)`y CSS `@import` se resuelven como dependencias de módulos. |
| 175 | + |
| 176 | +Por ejemplo, tenemos este arbol de archivos: |
| 177 | + |
| 178 | +``` |
| 179 | +-| assets/ |
| 180 | +----| imagen.png |
| 181 | +-| pages/ |
| 182 | +----| index.vue |
| 183 | +``` |
| 184 | + |
| 185 | +Si usas `url('~assets/imagen.png')` dentro de tu CSS, se traducirá automaticamente a `require('~/assets/imagen.png')`. |
| 186 | + |
| 187 | +<base-alert> |
| 188 | + |
| 189 | +Importante notar que el alias de `~/` no será resuelto correctamente dentro de tu CSS. Tienes que usar `~assets` (**sin la barra**) en el `url` o referencias en el CSS, ejemplo: `background: url("~assets/banner.svg")` |
| 190 | + |
| 191 | +</base-alert> |
| 192 | + |
| 193 | +Si referencias esa imagen en `pages/index.vue`: |
| 194 | + |
| 195 | +```html{}[pages/index.vue] |
| 196 | +<template> |
| 197 | + <img src="~/assets/imagen.png" /> |
| 198 | +</template> |
| 199 | +``` |
| 200 | + |
| 201 | +Será compilada a: |
| 202 | + |
| 203 | +```js |
| 204 | +createElement('img', { attrs: { src: require('~/assets/imagen.png') } }) |
| 205 | +``` |
| 206 | + |
| 207 | +Nuxt sabe que `.png` no es un archivo de Javascript, automáticamente configura webpack para que use [file-loader](https://github.com/webpack/file-loader) y [url-loader](https://github.com/webpack/url-loader) y los maneje por ti. |
| 208 | + |
| 209 | +Los beneficios de estos loaders son: |
| 210 | + |
| 211 | +`file-loader` te permite determinar donde deberia copiar y pegar el archivo, y como se debería nombrar usando hash de version para mejor manejo del cache. En producción, esto te permitirá usar long-term caching por defecto. |
| 212 | + |
| 213 | +`url-loader` te permite incluir un recurso como base-64 data URL si son más pequeños que el límite provisto. Esto reduce significativamente el número de solicitudes HTTP para archivos triviales. Si el archivo es mayor que el límite, automáticamente vuelve a usar `file-loader`. |
| 214 | + |
| 215 | +La configuración inicial para estos loaders es la siguiente: |
| 216 | + |
| 217 | +```js |
| 218 | +// https://github.com/nuxt/nuxt.js/blob/dev/packages/webpack/src/config/base.js#L297-L316 |
| 219 | +;[ |
| 220 | + { |
| 221 | + test: /\.(png|jpe?g|gif|svg|webp)$/, |
| 222 | + loader: 'url-loader', |
| 223 | + query: { |
| 224 | + limit: 1000, // 1kB |
| 225 | + name: 'img/[name].[hash:7].[ext]' |
| 226 | + } |
| 227 | + }, |
| 228 | + { |
| 229 | + test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, |
| 230 | + loader: 'url-loader', |
| 231 | + query: { |
| 232 | + limit: 1000, // 1kB |
| 233 | + name: 'fonts/[name].[hash:7].[ext]' |
| 234 | + } |
| 235 | + } |
| 236 | +] |
| 237 | +``` |
| 238 | + |
| 239 | +Esto significa que cada archivo con menos de 1KB va a ser incluido como base-64 data URL. De lo contrario, la imagen o fuente, será copiada en el directorio correspondiente (dentro del directorio de `.nuxt`) con un nombre que contiene la versión para el cache. |
| 240 | + |
| 241 | +Cuando publiques tu aplicación con `nuxt` el template dentro de `pages/index.vue`: |
| 242 | + |
| 243 | +```html{}[pages/index.vue] |
| 244 | +<template> |
| 245 | + <img src="@/assets/ut_imagen.png" /> |
| 246 | +</template> |
| 247 | +``` |
| 248 | + |
| 249 | +Será transformado en: |
| 250 | + |
| 251 | +```html |
| 252 | +<img src="/_nuxt/img/tu_imagen.0c61159.png" /> |
| 253 | +``` |
| 254 | + |
| 255 | +Si quieres cambiar las configuraciones del loader, puedes usar [build.extend](/guides/configuration-glossary/configuration-build#extend) |
| 256 | + |
| 257 | +<app-modal> |
| 258 | + <code-sandbox :src="csb_link"></code-sandbox> |
| 259 | +</app-modal> |
| 260 | + |
| 261 | +## Aliases |
| 262 | + |
| 263 | +Por defecto el directorio de fuente (srcDir) y el directorio del proyecto (rootDir) son lo mismo. Puedes usar el alias de `~` para el directorio fuente. En vez de escribir direcciones relativas como `../assets/tu_imagen.png` puedes usar `~/assets/tu_imagen.png`. |
| 264 | + |
| 265 | +Ambos resultan en lo mismo. |
| 266 | + |
| 267 | +```html{}[components/Avatar.vue] |
| 268 | +<template> |
| 269 | + <div> |
| 270 | + <img src="../assets/tu_imagen.png" /> |
| 271 | + <img src="~/assets/tu_imagen.png" /> |
| 272 | + </div> |
| 273 | +</template> |
| 274 | +``` |
| 275 | + |
| 276 | +Recomendamos que uses `~` como alias. `@` se puede usar pero no funcionará en todos los casos, casos como imágenes de background dentro del css por ejemplo. |
| 277 | + |
| 278 | +Puedes usar el alias de `~~` o `@@` para accesar el directorio del proyecto (rootDir). |
| 279 | + |
| 280 | +<base-alert type="info"> |
| 281 | + |
| 282 | +Tip: en un teclado español puedes accesar `~` with (`Option` + `ñ`) en Mac OS |
| 283 | + |
| 284 | +</base-alert> |
| 285 | + |
| 286 | +<quiz :questions="questions"></quiz> |
0 commit comments