在发展与生产中服务资产

时间:2014-06-29 01:45:42

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

生产模式下的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中实现这一目标有哪些替代方案?

1 个答案:

答案 0 :(得分:0)

<强> Fingerpriting

您所指的是 asset fingerprinting

这是Rails确定生产中资产的唯一网址的一种方式,允许您使用precompilation之类的内容为您的资产提供静态服务,从而更快地

如Rails文档中所述:

  

指纹识别是一种使文件名依赖的技术   关于文件的内容。当文件内容改变时,   文件名也被更改。对于静态或不经常的内容   改变了,这提供了一个简单的方法来判断是否有两个版本   文件是相同的,即使在不同的服务器或部署日期也是如此。

-

路径助手

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

这是一个问题,因为这意味着你必须做一些条件路径加载才能让事情发挥作用。解决这个问题的方法是使用asset path helpers

这些只适用于.erb之类的预处理程序,允许您调用以下内容:

asset_url("your_asset_url")

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


<强>的NodeJS

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