Estou com problemas para usar importmap-rails
para gerenciar pacotes npm. Eu gostaria que ele funcionasse como o yarn, onde ele mantém o controle de versões, dependências e baixa tudo para você com um comando como yarn install
.
Mas parece que ele importmap-rails
só está configurado para usar um cdn quando você fixa algo. Isso é verdade? Ou ele pode baixar pacotes e suas dependências com um comando como o yarn?
Se não puder fazer isso, posso usar importmap-rails
o yarn como meu gerenciador de pacotes? Tentei isso com underscore.js e tive alguns problemas.
- Executei
yarn add underscore
, vi que foi baixado corretamente e então adicionadonode_modules
aos caminhos de ativos para quepropshaft
euimportmap-rails
soubesse como procurar lá:
config/application.rb
config.assets.paths << Rails.root.join('node_modules')
Em seguida, fixei a pasta sublinhada:
# config/importmap.rb
pin_all_from 'node_modules/underscore', under: 'underscore'
Em seguida, importei a funcionalidade que eu precisava:
// from a custom js file
import debounce from 'underscore/modules/debounce';
A execução ./bin/importmap json
mostrou que o arquivo debounce.js foi encontrado:
{
"imports": {
"application": "/assets/application-bd82d6ab.js",
"underscore/amd/_baseCreate": "/assets/underscore/amd/_baseCreate-7eccab16.js",
"underscore/amd/_baseIteratee": "/assets/underscore/amd/_baseIteratee-5f781255.js",
"underscore/amd/_cb": "/assets/underscore/amd/_cb-dd403ec6.js",
"underscore/amd/_chainResult": "/assets/underscore/amd/_chainResult-4b98e265.js",
"underscore/amd/_collectNonEnumProps": "/assets/underscore/amd/_collectNonEnumProps-ed4c206f.
...
"underscore/modules/debounce": "/assets/underscore/modules/debounce-decaec4e.js",
E no navegador não obtive nenhum erro para debounce.js, ele foi identificado e encontrado, mas dentro desse arquivo ele estava usando caminhos relativos para importar outras funções que causaram erros 404. Também havia uma solicitação get indo para cada arquivo em underscore, o que também não é bom.
15:41:34 web.1 | Completed 200 OK in 5482ms (Views: 2431.0ms | ActiveRecord: 557.1ms (24 queries, 6 cached) | GC: 368.1ms)
15:41:34 web.1 |
15:41:34 web.1 |
15:41:34 web.1 | Started GET "/assets/underscore/amd/_baseCreate-7eccab16.js" for ::1 at 2024-12-20 15:41:34 -0500
15:41:35 web.1 | Started GET "/assets/underscore/amd/_baseIteratee-5f781255.js" for ::1 at 2024-12-20 15:41:35 -0500
15:41:35 web.1 | Started GET "/assets/underscore/amd/_cb-dd403ec6.js" for ::1 at 2024-12-20 15:41:35 -0500
15:41:35 web.1 | Started GET "/assets/underscore/amd/_chainResult-4b98e265.js" for ::1 at 2024-12-20 15:41:35 -0500
15:41:35 web.1 | Started GET "/assets/underscore/amd/_collectNonEnumProps-ed4c206f.js" for ::1 at 2024-12-20 15:41:35 -0500
15:41:35 web.1 | Started GET "/assets/underscore/amd/_createAssigner-aa588b74.js" for ::1 at 2024-12-20 15:41:35 -0500
15:41:36 web.1 | Started GET "/assets/underscore/amd/_createEscaper-3ea6026c.js" for ::1 at 2024-12-20 15:41:36 -0500
15:41:36 web.1 | Started GET "/assets/underscore/amd/_createPredicateIndexFinder-f577fa32.js" for ::1 at 2024-12-20 15:41:36 -0500
...
debounce-decaec4e.js:1
GET http://localhost:3000/assets/underscore/modules/restArguments.js 404 (Not Found)
debounce-decaec4e.js:2
GET http://localhost:3000/assets/underscore/modules/now.js net::ERR_ABORTED 404 (Not Found)
debounce-decaec4e.js
import restArguments from './restArguments.js';
import now from './now.js';
Então, posso usar importmap-rails com o yarn ou em vez do yarn para pacotes npm?
Pesquisei no Google e examinei a documentação e só encontrei esta breve descrição: https://github.com/rails/importmap-rails/blob/main/README.md#using-npm-packages-via-javascript-cdns
Para contexto extra, acabei de atualizar nosso aplicativo rails 7 para rails 8, então fomos de sprockets, yarn, webpacker para propshaft com importmap-rails. Feliz por estar sem webpacker, mas sentindo falta da funcionalidade yarn.
Você pode usar
yarn
para obter os pacotes, mas precisa usar o pacote do módulo ES:Se você precisa de apenas uma função:
o que permitirá importações relativas:
Para esclarecer a parte relativa, as importações são relativas à URL, e você pode usar
./
e../
conforme necessário para corresponder ao importmap, desde que tenha a configuração de pin correta:Como dito acima, a primeira sugestão funcionou perfeitamente para mim. Permite que eu use o yarn para gerenciar dependências e então posso vinculá-las com importmap-rails.
Usar a versão esm foi o que foi necessário para corrigir o problema do caminho relativo que estava gerando erros 404 no arquivo underscore debounce.js.
Manteve o caminho do ativo adicional em
application.rb
:Usando o único
pin
para o arquivo esm js em vez depin_all_from
corrigir a montanha de solicitações GET para todos os vários arquivos sublinhados:Então eu pude importar apenas a função que eu precisava, e ela puxou corretamente suas dependências:
Aqui está meu importmap de
./bin/importmap json
:E só uma pequena informação extra para coisas que tentei no caminho. Primeiro usei a rota sugerida para uma única função:
Isso me deu um erro 404 para debounce.js:
Suspeitei que isso acontecia porque ele não estava procurando em node_modules, então tentei isto:
O que fez sentido para mim porque o nome no primeiro argumento para pin (até onde eu entendo) é o nome do arquivo sem a extensão, com um caminho relativo a app/javascript ou um dos outros caminhos em
Rails.application.config.assets.paths
. E como eu tinha adicionadonode_modules
aos caminhos de ativos, entãounderscore/modules/name
fez sentido para mim.Então, no meu arquivo js, importei minha função debounce e suas dependências:
Não obtive nenhum erro 404 nas importações, mas ainda obtive erros 404 nas importações relativas dentro do debounce.js. Presumo que isso ocorreu porque ainda era a versão não-esm.
Então, não tenho certeza se há uma maneira melhor, mas parece funcionar bem para fazer o seguinte: