ruby-on-rails - RAILS 6 + Webpacker -- 生产环境中 packs/css|js/application-* 的路由错误
问题描述
在开发模式下,一切看起来都很棒。但是当我切换到生产时,找不到引导程序。当我查看日志时,我看到如下错误:
ActionController::RoutingError (No route matches [GET] "/packs/js/application-2a5806e943e281221741.js"):
这对于 CSS 和 JS 都是如此。当我查看 public/packs 文件时,文件确实存在于相应的子目录中(.js 文件的 js 等)。所以,webpacker 完成了它的工作,但 puma 没有找到它。有任何想法吗?这是一个旧的 Rails 应用程序,它被迁移了几个版本的 rails,所以我确信在将所有东西捆绑在一起时我错过了一些东西。
解决方案
为了扩展我认为是该问题正确答案的 Tenzin 的评论,开发中的 Rails 将始终重新渲染资产并为它们提供服务。这很慢,但对于在开发时查看快速更改很有用。
当我们想要部署到生产环境时,问题是 Rails 开始提供静态文件,这意味着服务器不再会在每次请求时呈现它们。它将为他们提供一次并永远为他们服务。使用 webpacker,您可以在 webpacker.yml 中找到提供这些资产的位置
public_root_path: public
public_output_path: packs
因此,如果您要在本地部署或尝试运行生产,请首先确保为生产编译您的资产,以便创建这些静态文件。
rake assets:precompile RAILS_ENV=production
然后确保无论服务器在哪里运行,它都有一个 ENV 变量 RAILS_SERVE_STATIC_FILES 设置为任何值。从 production.rb 中可以看出,
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
只是检查这个变量是否存在。如果是,那么它不会像我们讨论的那样重新渲染,它会寻找 webpacker.yml 中显示的静态文件。
另外一个小提示,如果您使用 React UI 或 Bootstrap 之类的东西并且缺少 CSS,请确保您根据库的文档导入 CSS。
例如,在 Bootstrap 中,您需要在 app/javascript/packs/stylesheets(实际上是在 /javascript 文件夹中的任何位置)创建一个 application.scss 文件,并将其导入 /javascript/packs/application.js。
在 application.scss 你会想要
import "~bootstrap/scss/bootstrap"
这当然是在您将 Bootstrap 添加到您的 package.json 之后
yarn add bootstrap
推荐阅读
- amazon-web-services - 写入分区文件时触发 lambda 函数
- jenkins - Plot Plugin draws only part of data
- c++ - tensor flow post training quantized model produce nans in cpp
- c# - when AWS S3 bucket modified then can i trigger local system database using .Net
- hibernate - 使用带有双边双向关联的 @EmbeddedId 时出现 EntityExistsException
- jquery - 在 jquery 第一步 js 验证电子邮件和名称验证
- c++ - ./abc.o:无法执行二进制文件:执行格式错误
- javascript - 等待 URLSession 中的脚本
- php - 301 重写 URL 后重定向不适用
- android - 额外数据未通过图库意图