AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 79298467
Accepted
dthegnome
dthegnome
Asked: 2024-12-21 05:43:44 +0800 CST2024-12-21 05:43:44 +0800 CST 2024-12-21 05:43:44 +0800 CST

Posso usar a gem importmap-rails para substituir o yarn ou posso usá-la com o yarn?

  • 772

Estou com problemas para usar importmap-railspara 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-railssó 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-railso yarn como meu gerenciador de pacotes? Tentei isso com underscore.js e tive alguns problemas.

  1. Executei yarn add underscore, vi que foi baixado corretamente e então adicionado node_modulesaos caminhos de ativos para que propshafteu importmap-railssoubesse 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 jsonmostrou 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.

ruby-on-rails
  • 2 2 respostas
  • 52 Views

2 respostas

  • Voted
  1. Best Answer
    Alex
    2024-12-21T09:37:11+08:002024-12-21T09:37:11+08:00

    Você pode usar yarnpara obter os pacotes, mas precisa usar o pacote do módulo ES:

    pin "underscore", to: "underscore/underscore-esm.js"
    
    import { debounce } from "underscore"
    

    Se você precisa de apenas uma função:

    pin "/assets/underscore/modules/debounce.js", to: "underscore/modules/debounce.js"
    # debounce dependencies
    pin "/assets/underscore/modules/now.js", to: "underscore/modules/now.js"
    pin "/assets/underscore/modules/restArguments.js", to: "underscore/modules/restArguments.js"
    

    o que permitirá importações relativas:

    // app/javascript/application.js
    
    // relative to the asset url
    import debounce from "./underscore/modules/debounce.js"
    

    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:

    application                                          => import
    application                                          => matches importmap
    /assets/application-c10b436c.js                      => OK
            ⌄
          ./underscore/modules/debounce.js               => import
    /assets/underscore/modules/debounce.js               => resolve relative url
    /assets/underscore/modules/debounce.js               => matches importmap
    /assets/underscore/modules/debounce-1fc53fe7.js      => OK
                               ⌄
                             ./restArguments.js          => import
    /assets/underscore/modules/restArguments.js          => resolve relative url
    /assets/underscore/modules/restArguments.js          => matches importmap
    /assets/underscore/modules/restArguments-708796bd.js => OK
    
    • 1
  2. dthegnome
    2024-12-22T03:51:07+08:002024-12-22T03:51:07+08:00

    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:

    config.assets.paths << Rails.root.join('node_modules')
    

    Usando o único pinpara o arquivo esm js em vez de pin_all_fromcorrigir a montanha de solicitações GET para todos os vários arquivos sublinhados:

    # config/importmap.rb
    pin "underscore", to: "underscore/underscore-esm.js"
    

    Então eu pude importar apenas a função que eu precisava, e ela puxou corretamente suas dependências:

    // my-module.js:
    import { debounce } from "underscore"
    

    Aqui está meu importmap de ./bin/importmap json:

    {
      "imports": {
        "application": "/assets/application-bd82d6ab.js",
        "underscore": "/assets/underscore/underscore-esm-91fff580.js",
        "src/image_modal_methods": "/assets/src/image_modal_methods-5c3fcc95.js",
        "src/search": "/assets/src/search-8b38146d.js",
        "src/sortable-table": "/assets/src/sortable-table-8ef04aa1.js"
      }
    }
    

    E só uma pequena informação extra para coisas que tentei no caminho. Primeiro usei a rota sugerida para uma única função:

    pin "/assets/underscore/modules/debounce.js", to: "underscore/modules/debounce.js"
    # debounce dependencies
    pin "/assets/underscore/modules/now.js", to: "underscore/modules/now.js"
    pin "/assets/underscore/modules/restArguments.js", to: "underscore/modules/restArguments.js"
    
    // app/javascript/application.js
    
    // relative to the asset path
    import debounce from "./underscore/modules/debounce.js"
    

    Isso me deu um erro 404 para debounce.js:

    http://localhost:3000/assets/src/underscore/modules/debounce.js net::ERR_ABORTED 404 (Not Found)
    

    Suspeitei que isso acontecia porque ele não estava procurando em node_modules, então tentei isto:

    # pin "underscore/modules/debounce"
    # # debounce dependencies
    # pin "underscore/modules/now"
    # pin "underscore/modules/restArguments"
    

    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 adicionado node_modulesaos caminhos de ativos, então underscore/modules/namefez sentido para mim.

    Então, no meu arquivo js, ​​importei minha função debounce e suas dependências:

    import restArguments from 'underscore/modules/restArguments'
    import now from 'underscore/modules/now'
    import debounce from "underscore/modules/debounce"
    

    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.

    debounce-decaec4e.js:1         
           GET http://localhost:3000/assets/underscore/modules/restArguments.js net::ERR_ABORTED 404 (Not Found)
    
    debounce-decaec4e.js:2 
           GET http://localhost:3000/assets/underscore/modules/now.js net::ERR_ABORTED 404 (Not Found)
    

    Então, não tenho certeza se há uma maneira melhor, mas parece funcionar bem para fazer o seguinte:

    • Gerenciar dependências com yarn
    • Adicionar node_modules aos caminhos de ativos
    • pin esm versões de dependências
    • funções de importação necessárias
    • 0

relate perguntas

  • Exibir informações do servidor Rails no Active Admin

  • Grape api (rails) - constante não inicializada Endpoints::TodoAPI (NameError)

  • Qual retorno de chamada devo usar para obter o valor anterior?

  • Rails - Pare de servir qualquer visualização de front-end

  • Obtendo erro de método indefinido em ruby ​​on rails enquanto o método é definido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve