Importar archivos específicos de un paquete
Keep on Learning!
If you liked what you've learned so far, dive in! Subscribe to get access to this tutorial plus video, code and script downloads.
With a Subscription, click any sentence in the script to jump to that part of the video!
Login SubscribeA veces, en lugar de importar un paquete en sí, puedes querer importar sólo una parte de él: como un archivo concreto. Lodash es un buen ejemplo de ello.
Sin agitar el árbol en el navegador
Pero antes de llegar ahí, en lugar de importar todo desde lodash
, deberías poder decir import { camelCase } from 'lodash'
. Entonces, aquí abajo, utilizarías directamente camelCase
.
// ... line 1 | |
import { camelCase } from 'lodash'; | |
// ... lines 3 - 4 | |
console.log(camelCase(mix.describe())); |
Sin embargo, cuando nos desplazamos e intentamos esto... ¡error!
El módulo solicitado
lodash
no proporciona una exportación llamadacamelCase
.
Esto debería funcionar... y la razón por la que no lo hace es complicada. Básicamente, debido a la forma en que esta biblioteca específica empaqueta su módulo, no puedes importar funciones específicas como ésta. Sin embargo, funcionará con la mayoría de los demás paquetes.
Por ejemplo, si dices import { Modal }
from 'bootstrap' (si utilizas Bootstrap), funcionará. Bootstrap empaqueta sus archivos correctamente.
Sin embargo, utilizar esta sintaxis no siempre es lo ideal con AssetMapper.
El problema es el siguiente. Si pasáramos este código por Encore, Encore haría algo llamado "sacudir el árbol". Vería que sólo estamos importandocamelCase
desde lodash
. Y así, en el JavaScript final, sólo nos daría el código de camelCase
, no todo el paquete lodash
.
En un entorno de navegador, si importas import
de lodash
, obtendrás todo lodash
... aunque sólo estés importando una parte de él. Ahora bien, puede que no sea para tanto. La compilación completa de lodash
sigue siendo de sólo 24 kilobytes. Pero, ¿y si estamos utilizando un paquete grande... pero sólo necesitamos importar una cosa concreta?
Importar un archivo concreto
Muchas veces, hay un archivo específico que podemos importar, como /camelCase
. Normalmente encontrarás detalles sobre estos archivos en la documentación... aunque también puedes ir a buscarlos. Vuelve a JSDelivr... y aquí abajo, busca "lodash". A continuación, haz clic en "Archivos" para ver todos los archivos que forman parte de este paquete.
Para lodash
, es una lista enorme... porque se trata de una biblioteca enorme. Uno de ellos es camelCase.js
.
¡Vale! Así que vamos a intentar importar lodash/camelCase
.
// ... line 1 | |
import camelCase from 'lodash/camelCase'; | |
// ... lines 3 - 6 |
No voy a incluir el .js
... pero de todas formas no va a funcionar. Observa: cuando actualizamos... ¡error!
Error al resolver el especificador de módulo
lodash/camelCase
. Las referencias relativas deben empezar por "/", "./" o "../"
Este error significa que estamos importando algo mediante una importación "desnuda", y no se encontró en el importmap
. Si "Vemos la fuente de la página", sí tenemos un importmap
para lodash
, pero no lodash/camelCase
. Sí, esa coincidencia se hace exactamente. Vale, hay una forma de hacer una coincidencia, más o menos, "difusa" - lodash/*
- pero yo no la uso.
La cuestión es: si quieres utilizar lodash/camelCase
, debes añadirlo a tu mapa de importación, no lodash
.
Ejecuta: busca tu terminal y ejecuta:
php bin/console importmap:remove lodash
Eso eliminará lodash
de importmap.php
y borrará el archivo deassets/vendor/
.
// ... lines 1 - 15 | |
return [ | |
'app' => [ | |
'path' => 'app.js', | |
'preload' => true, | |
], | |
]; |
¡Qué bien! Ahora ejecuta ./bin/console importmap:require
con el nombre del paquete / la ruta que quieras: lodash/camelCase.js
.
php bin/console importmap:require lodash/camelCase.js
camelCase.js
es el nombre del archivo en la CDN. Pero te darás cuenta de que, muchas veces en los documentos, se hace referencia a lodash/camelCase
sin el .js
. Y en este caso, puedes dejar el .js
: tú decides. Eso funciona porque jsDelivr es amigable y hace que funcionen ambas versiones de la URL.
¿El resultado del comando? El mismo que antes Obtenemos una nueva entrada enimportmap.php
que coincide con lo que queremos importar y establecer en una URL.
// ... lines 1 - 15 | |
return [ | |
// ... lines 17 - 20 | |
'lodash/camelCase' => [ | |
'url' => 'https://cdn.jsdelivr.net/npm/lodash@4.17.21/camelCase/+esm', | |
], | |
]; |
Copia esa URL para que podamos verla. ¡Ya está! Es el código de sólo camelCase.js
.
Y cuando probamos la página... ¡funciona!
Estas son las conclusiones: si necesitas importar un archivo concreto de un paquete, puedes hacerlo: sólo tienes que pasar el nombre del paquete + la ruta del archivo a importmap:require
.
A continuación, ¡añadamos Stimulus a nuestra aplicación!
Hi,
I have trouble getting run a specific library. It is vis-timeline that can be accessed via jsdelivr.com.
Here is what I did:
First I installed vis-timeline via
php/bin importmap:require vis-timeline
which gives me 3 items:So that seemed to be successful.
Now I want to use the libraries in one of my stimulus controllers:
However I run into errors:
So whats missing or what do I wrong?
Thanks for any help here.
Oliver