O aplicativo Rails padrão instalado por rails new
possui config.assets.compile = false
em produção.
E a maneira comum de fazer as coisas é executar rake assets:precompile
antes de implantar seu aplicativo, para garantir que todos os ativos do pipeline de ativos sejam compilados.
Então, o que acontece se eu começar a config.assets.compile = true
produção?
Eu não preciso precompile
mais correr . O que acredito que acontecerá é a primeira vez que um ativo for solicitado, ele será compilado. Isso será um sucesso na primeira vez (e significa que você geralmente precisa de um tempo de execução js na produção para fazê-lo). Mas, além dessas desvantagens, depois que o ativo foi compilado com preguiça, acho que todo o acesso subsequente a esse ativo não terá impacto no desempenho, o desempenho do aplicativo será exatamente o mesmo dos ativos pré-compilados após essa compilação preguiçosa de primeiro hit inicial. isso é verdade?
Falta alguma coisa? Algum outro motivo para não iniciar a config.assets.compile = true
produção? Se eu tenho um tempo de execução JS em produção e estou disposto a aceitar a troca de desempenho degradado pelo primeiro acesso de um ativo, em troca de não precisar executar precompile
, isso faz sentido?
Respostas:
Eu escrevi esse pedaço do guia.
Você definitivamente não quer viver compilado na produção.
Quando você compila, é o que acontece:
Toda solicitação de um arquivo em / assets é passada para os Sprockets. Na primeira solicitação de cada ativo, ele é compilado e armazenado em cache em qualquer Rails que esteja usando para cache (geralmente o sistema de arquivos).
Em solicitações subsequentes, o Sprockets recebe a solicitação e precisa procurar o nome do arquivo com impressão digital, verifique se o arquivo (imagem) ou os arquivos (css e js) que compõem o ativo não foram modificados e, se houver uma versão em cache, atenda.
Isso é tudo na pasta de ativos e em qualquer pasta de fornecedor / ativo usada pelos plug-ins.
Isso representa muita sobrecarga, pois, para ser honesto, o código não é otimizado para velocidade.
Isso afetará a rapidez com que os ativos serão transferidos para o cliente e afetará negativamente os tempos de carregamento da página do seu site.
Compare com o padrão:
Quando os ativos são pré-compilados e a compilação está desativada, os ativos são compilados e impressos digitais no
public/assets
. O Sprockets retorna uma tabela de mapeamento dos nomes de arquivos simples para impressões digitais no Rails, e o Rails grava isso no sistema de arquivos. O arquivo de manifesto (YML no Rails 3 ou JSON com um nome aleatório no Rails 4) é carregado na Memória pelo Rails na inicialização e armazenado em cache para uso pelos métodos auxiliares de ativos.Isso torna muito rápida a geração de páginas com os recursos corretos das impressões digitais, e a veiculação dos arquivos em si é rápida do servidor da web a partir do sistema de arquivos. Ambos muito mais rápidos que a compilação ao vivo.
Para obter a máxima vantagem do pipeline e das impressões digitais, é necessário definir cabeçalhos de futuro distante no servidor da web e ativar a compactação gzip para arquivos js e css. O Sprockets grava versões compactadas dos ativos que você pode configurar para o servidor, eliminando a necessidade de fazê-lo para cada solicitação.
Isso distribui ativos para o cliente o mais rápido possível e no menor tamanho possível, agilizando a exibição das páginas no lado do cliente e reduzindo as solicitações (com cabeçalho no futuro futuro).
Portanto, se você estiver compilando ao vivo, é:
Versus
Editar: (Resposta ao comentário seguinte)
O pipeline pode ser alterado para pré-compilar na primeira solicitação, mas existem alguns obstáculos importantes para isso. A primeira é que deve haver uma tabela de pesquisa para nomes de impressões digitais ou os métodos auxiliares são muito lentos. Sob um senario de compilação sob demanda, haveria uma maneira de anexar à tabela de pesquisa, à medida que cada novo ativo é compilado ou solicitado.
Além disso, alguém teria que pagar o preço da entrega lenta de ativos por um período desconhecido, até que todos os ativos sejam compilados e no local.
O padrão, onde o preço de compilar tudo é pago off-line de uma só vez, não afeta os visitantes públicos e garante que tudo funcione antes que as coisas sejam lançadas.
O ponto crítico é que ele adiciona muita complexidade aos sistemas de produção.
[Editar, junho de 2015] Se você estiver lendo isso porque está procurando uma solução para tempos de compilação lentos durante uma implantação, considere pré-compilar os ativos localmente. Informações sobre isso estão no guia de pipeline de ativos . Isso permite pré-compilar localmente apenas quando houver uma alteração, confirmar isso e, em seguida, implantar rapidamente, sem estágio de pré-compilação.
fonte
Ter menos sobrecarga com a coisa de pré-compilação.
você pode simplesmente usar imagens e folhas de estilo como "/assets/stylesheet.css" em * .html.erb ou "/assets/web.png"
fonte
Para quem usa o Heroku:
Se você implantar no Herkou, ele fará o pré-compilamento automaticamente durante a implantação, se os recursos compilados não forem incluídos (ou seja,
public/assets
não confirmados), portanto não há necessidadeconfig.assets.compile = true
ou comprometimento dos recursos pré-compilados.Os documentos de Heroku estão aqui . Uma CDN é recomendada para remover a carga no recurso dinamômetro.
fonte
Não será o mesmo que pré-compilar, mesmo após o primeiro hit: como os arquivos não são gravados no sistema de arquivos, não podem ser atendidos diretamente pelo servidor da web. Algum código ruby sempre estará envolvido, mesmo que apenas leia uma entrada de cache.
fonte
precompile=true
, com , os recursos compilados seriam gravados no sistema de arquivos. Você tem certeza? Deixe-me verificar ...tmp/cache
quepublic/assets
não é um local que o servidor da Web possa ver, mas ainda será servido pelo aplicativo rails o servidor da web. blá. está certo, você acha?Conjunto
config.asset.compile = false
Adicione ao seu Gemfile
group :assets do gem 'turbo-sprockets-rails3' end
Instale o pacote
Corre
rake assets:precompile
Então inicie seu servidor
fonte
config.asset.compile = true in production.rb
arquivo, porque não há nenhum mecanismo de pré-complemento adicionado. Por isso, toda vez que iniciamos o servidor, leva muito tempo para carregar a página (quando a solicitação atinge o processamento da solicitação e a compilação de ativos). Agora eu incluíturbo-sprockets-rails3
no Gemfile e execute o comando querake assets:precompile
compila os ativos anteriormente. Agora eu configuroconfig.asset.compile = false in production.rb
e inicio o servidor, a página é carregada sem demora. (Processando apenas a solicitação sem compilação de ativos)turbo-sprockets-rails3
só é necessário em Ruby 3Do guia oficial :
Além disso, a etapa de pré-compilação não é um problema se você usar o Capistrano para suas implantações. Ele cuida disso para você. Você acabou de correr
ou (dependendo da sua configuração)
e está tudo pronto. Se você ainda não o usa, eu recomendo dar uma olhada.
fonte
Como está abrindo uma vulnerabilidade de travessia de diretório - https://blog.heroku.com/rails-asset-pipeline-vulnerability
fonte