【问题标题】:Serving assets in development vs production在开发与生产中服务资产
【发布时间】:2014-06-29 01:45:41
【问题描述】:

生产模式下的 Rails 为 public/assets 文件夹中的资产提供服务,如下所示:

/assets/application-c3967f04f81628153a30120e3f5b8695.js

在开发模式下从app/assets 文件夹中提供服务

/assets/application.js?body=1

/assets/application-c3967f04f81628153a30120e3f5b8695.js

我想知道 rails 是如何解决这个问题的。因为我想在 nodejs 中做同样的事情,我认为一种方法可能是这样的:

   var env = process.env.NODE_ENV || 'development';

   if ('development' == env) {
     app.use(express.static(path.join(config.root, 'app')));
   } else if ('production' == env) {
     app.use(express.static(path.join(config.root, 'public')));
   };

在 NodeJS 中实现这一目标的替代方法是什么?

【问题讨论】:

    标签: javascript ruby-on-rails node.js deployment asset-pipeline


    【解决方案1】:

    指纹分析

    您所指的是 asset fingerprinting

    这是 Rails 确定生产中资产的唯一 URL 的一种方式,允许您使用 precompilation 之类的方式为您的资产提供静态服务,因此更快

    如 Rails 文档中所述:

    指纹是一种使文件名依赖的技术 关于文件的内容。当文件内容发生变化时, 文件名也改变了。对于静态或不频繁的内容 改变,这提供了一种简单的方法来判断一个版本的两个版本是否 文件是相同的,即使跨不同的服务器或部署日期。

    --

    路径助手

    您遇到的问题是,当您在开发中使用 Rails 时,它将提供来自 app/assets 目录的资产。但是,当您将应用程序投入生产时,该应用程序将改为提供 public 目录中的资产

    这是一个问题,因为这意味着您必须执行一些条件路径加载才能使事情正常工作。解决这个问题的方法是使用asset path helpers

    这些仅适用于 .erb 之类的预处理器,允许您调用以下代码:

    asset_url("your_asset_url")
    

    无论您是处于生产模式还是开发模式,这都会加载资产路径。


    NodeJS

    也许您可以通过查看 Rails 中的 source for asset_url path helper 来获得更好的见解

    【讨论】:

      猜你喜欢
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      • 2013-08-10
      • 2021-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      相关资源
      最近更新 更多