问题标签 [rails-sprockets]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
355 浏览

ruby-on-rails - #= 升级到 Rails 5 后需要不工作

我将 Rails 4.2.10 应用程序升级到 Rails 5。解决了捆绑错误和一些弃用问题。我能够启动 Rails 应用程序,但是当我尝试加载应用程序时,它Invalid CSS after "#": expected id name, was "= require在 css 文件中失败并出现错误

我尝试使用@import,但是对于供应商/资产中的外部文件它失败了。不过,我想了解为什么它不再工作了。在我的配置中,我有文件config.assets.precompile +=

在我的 index.html.erb 中,

在 users.scss 中,

注意:我在 Gemfile 中使用 sass-rails

我得到的错误,

0 投票
1 回答
331 浏览

sprockets - 在请求期间创建新样式表然后立即要求它会产生错误

Sprockets 似乎内置了一个缓存环境,该环境在请求开始时加载所有可能资产的列表,然后要求该列表之外的任何资产都会引发错误。

我编写了一个自定义指令来创建一个新的 CSS 文件——我需要将现有文件的内容包装在一个新的选择器中——如下所示:

但是,要求新包装的资产失败,因为它不在 Sprockets 知道的文件列表中。刷新页面时,第一个资产将成功,因为它现在在请求开始时就存在,因此在缓存列表中,但第二个资产将失败,依此类推。

有没有办法解决这个问题?禁用缓存并不能解决问题。

我猜它与此代码有关https://github.com/rails/sprockets-rails/pull/197/files - 但是没有重新打开一堆类,有没有办法避免缓存环境?

0 投票
2 回答
7591 浏览

ruby-on-rails - 如何通过 Webpack 在 Rails 6 中使用自定义字体

对于我新启动的 Rails 6 应用程序,我想要一组自定义字体。我的设置如下所示:

然后在app/assets/stylesheets/fonts我的 sass 文件中引用了所有 4 个文件。

application.sass有以下进口:@import 'my-font'.

当我运行rails assets:precompile它时,它还将所有4个带有后缀版本(例如my-font-7384658374658237465837246587263458.eot)的文件放在public目录中。

但是,当我运行应用程序时,浏览器正在根目录中寻找一个名为 的文件my-font.eot,当然该文件不存在并且 404s。这对我来说绝对是一个配置问题,但我不知道在哪里。任何帮助将非常感激。

0 投票
1 回答
104 浏览

ruby-on-rails - Rails 动态资产超时错误::::Sprockets::Railtie.build_environment(Rails.application).find_asset("#{params[:controller]}.css")

我在动态加载资产时遇到超时错误。

动态加载资产的代码片段(application.html.erb):

您能否建议如何解决超时错误。

0 投票
0 回答
464 浏览

rspec - NameError: 未初始化的常量 Sprockets::Engines

rails 5.0(从 4.2 升级到 5.0)ruby 2.6.4rspec 3.6

我正在将 rails 应用程序从 rails 4.2 升级到 5.2。目前正在尝试达到 5.0。我正在修复弃用和测试,但目前在运行我的规范测试时遇到了这个错误。在此处列出一个规范以节省空间,但它们都失败并出现相同的错误(如下)。

我已经阅读了大量与此类似的线程,但没有关于如何修复它的真正答案 - 或者我的问题。

FactoryGirl 弃用将升级到 FactoryBot,我只是还没有。

在上面的输出中,我看到了这些错误/线索:

在该文件中,第 1 行是require 'spec_helper'

在该文件中,第 8 行是: require File.expand_path("../../config/environment", __FILE__)

在该文件中,第 8 行是:StudentServices::Application.initialize!

我列出了sass-rails,因为我在 stackoverflow 上看到了一篇文章,提到这个问题在 sass-rails 中得到了解决。 rails 4 - rake 命令在我每次运行 rake db:migrate 命令时都会显示弃用警告 这些 gem 处于最新版本,但问题仍然存在。

我确实玩过将链轮降低到3.7.0,这给了我一个不同的错误,但仍然涉及链轮:

在此输出中,有一个指向 github 的 url 讨论了此弃用。我不确定如何将它应用于我的应用程序来解决这个问题,或者如果这甚至是问题。

我希望有人可以更多地了解导致此 sprockets 错误的原因以及如何解决它。

我很高兴编辑这篇文章并在需要时添加更多内容。

谢谢你看这个。

jc

0 投票
1 回答
147 浏览

ruby-on-rails - 如何使 sprockets(或 rack,或 nginx?)激励浏览器缓存字体并正确返回 304?

在用sprockets 替换webpacker 的 Rails6 应用程序中,我没有设法让 sprockets 使我的浏览器缓存字体。编辑:我的浏览器确实缓存了字体,但谷歌抱怨并且 curl 显示了应用程序的响应方式(与304不同,见下文)。

更新

似乎304只有当您告诉服务器(通过If-Modified-Since-headers)您确切知道最后修改的版本时才会返回 a 。虽然我的 Mozilla 开发资源并没有说明这显然应该是这种情况(而且我没有阅读 RFC 的心情),但它可能是有道理的:

  • 您的服务器在 2020 年 1 月 1 日为资产提供服务(为简单起见,批准日期)
  • 浏览器访问您并将资产与日期一起存储
  • 第二天同一浏览器重新访问,向服务器询问资产并告诉它最后一个已知日期(2020-01-01通过If-Modified-Since-header)
    • 服务器回答304:你已经知道这些东西了
  • 第二天发生错误,服务器提供开发资产
  • 浏览器重新访问,获取新的(但错误的资产,Last modified日期为 2020-01-03)并将其存储在该日期旁边
  • 服务器管理员删除了错误的开发资产
  • 第二天,浏览器访问并告诉服务器“我知道昨天的事情”
    • 服务器告诉浏览器:不,忘记了,正确的有效载荷是这个,这是时间戳:2020-01-01。

在下面的测试中,我使用If-Modified-Since了与最后一个(生产)资产时间戳不对应的标题。感谢@bliof 帮助解决这个问题。

因为我的最终目标是让谷歌的速度洞察力快乐(现在我知道如果所有玩家都表现良好,这个 304- 响应有效)我将遵循 Rails 5+ 路径config.public_file_server.headershttps://blog.bigbinary.com/2015/10 /31/rails-5-allows-setting-custom-http-headers-for-assets.html)。Rails 指南还指出了您通常如何让您的网络服务器(或 CDN)处理这种情况(https://guides.rubyonrails.org/asset_pipeline.html#in-production),但我的堆栈工作方式有所不同。

原文如下

字体在 eg 中app/assets/fonts/OTF/SourceSansPro-BoldIt.otf并正确放入public/assets/OTF/...fingerprint...(伴随着.gz变体)。它们通过 SCSS font-face 规则引用,指向其中包含相应指纹的文件(使用font-url())。

curling 这些时,我似乎永远不会得到 a HTTP/1.1 304 Not Modified,而是 a200与给定的有效载荷。使用其他(JS,CSS)资产,它可以按预期工作。

我没有修改config/initializers/assets.rb,因为所有子目录和文件都应该已经被拾取(并且assets:precompile输出和内容public/assets显示它有效)。

深入了解https://github.com/rails/sprockets/blob/9909da64595ddcfa1e7ee40ed1d99738961288ec/lib/sprockets/server.rb#L73的 sprockets 代码似乎表明可能没有正确设置 etag 或类似的东西,但我确实这样做了并没有真正破坏该代码。

据我所知,该应用程序使用非常标准的 nginx 配置与 dokku(基本上是 heroku)一起部署:https ://github.com/dokku/dokku/blob/master/plugins/nginx-vhosts/templates/nginx .conf.sigil。该应用程序为资产本身提供服务(如在 heroku 中)。

我该怎么做才能使 sprockets 添加相关的标头/用 a “正确”响应304?任何想法如何调试该问题?

相关的“调试”部分

对 CSS 的初始请求

后续获取 CSS

(相关部分,其他参数和输出省略)。请注意,会同时发送If-Modified-Since: Mon, 06 Apr 2020 11:59:56 GMT标头。

(这就是我想要的:A 304 Not Modified

字体资源的初始请求

后续获取字体

我发现有趣的是,服务器实际上发送了Last-Modified,它在If-Modified-Since之前。我猜聪明的浏览器会在那里停止对话,但我真的很想看到一个表现良好的 304。

0 投票
2 回答
3508 浏览

ruby-on-rails - Sprockets::Rails::Helper::AssetNotFound - 资产“my_logo.jpeg”不在资产管道中

收到此错误,我错过了什么?

  1. 我制作了一个新的 Ruby on Rails 应用程序rails new my_app#Rails 6.0.3.2

  2. 允许它安装 gems、web packer 等。

  3. 添加config.assets.compile = falseconfig/environments/development.rb

  4. 添加包含此内容的静态控制器和索引文件

    应用程序/控制器/static_controller.r b

    应用程序/视图/静态/index.html.erb

  5. 将 my_logo.jpeg 文件添加到app/assets/images/

  6. 预编译资产:bundle exec rake assets:precompile

  7. 将 rails 服务器运行为:bundle exec rails server

我可以看到该文件的public/assets/名称如下:my_logo-484af9fb82bc8a0279ef38b527402b5697475bd8f827251f46fbb182be6c07a1.jpg

如果我将其设置为 true,它将很好地显示图像:config.assets.compile = true

清单文件内容也来自public/assets/.sprockets-manifest-a7f9f10978778e828273bf0c790645f6.json

我也打开config.assets.unknown_asset_fallback = true看看路径是什么,结果是:http://localhost:3000/images/my_logo.jpg当它是假的(当它工作时),我得到这条路径:http://localhost:3000/assets/my_logo-484af9fb82bc8a0279ef38b527402b5697475bd8f827251f46fbb182be6c07a1.jpg

0 投票
2 回答
2967 浏览

ruby-on-rails - 是否可以/建议在没有 webpack(er) 的情况下运行 Rails 6?

我正在启动一个新的 Rails 6 应用程序。如果我理解正确的话,Webpack(er) ( gem webpacker) 已经取代 Sprockets 作为包含/缩小 JS ( source ) 的新标准。此外,Rails 6 现在都需要Node.js 和 Yarn

我是否正确假设 Node.js 和 Yarn 依赖项只是由于包含 Webpack,或者 Rails 6 的其他组件也需要它们?

从 Rails 6 应用程序中删除 Webpack 和 Node 和 Yarn 并继续使用 Rails 资产管道(除了缺少 Webpack 功能)是否有任何可能的缺点?

0 投票
1 回答
61 浏览

css - 在 rails6 开发中禁用加载所有样式表

我想通过注释/取消注释以下行来加载/卸载特定的 css 调试 bulma 结构stylesheet_link_tag

我的样式表目录树是这样的:

但是当我像上面那样评论那一行时,css文件被加载(以及grid.css)。

我认为link_directory只有样式表目录,不能递归加载:

所有其他配置默认为 Rails 6.1.3。

为什么 app/assets/stylesheets/bulma/debug.css 会自动加载,我该如何禁用它?

0 投票
2 回答
133 浏览

ruby-on-rails - Sprockets::FileNotFound: 将 Rails 6 应用程序部署到 Heroku 时找不到类型为“text/scss”的文件“jquery-ui”

我正在努力将我的 Rails 6 应用程序部署到 Heroku - 部署因以下错误消息而中断:

这是我的app/assets/config/manifest.js

并且是app/assets/stylesheets/application.scss文件:

package.json

我该如何解决这个问题?

先感谢您。