为什么`npm run bundle--p(webpack -p)不为我的Rails应用编译资产?

时间:2018-08-07 05:24:53

标签: ruby-on-rails npm webpack service daemon

我分叉了这个rails项目(https://github.com/DMPRoadmap/roadmap),并尝试按照其installation guide

进行设置

遵循安装指南时:

1)在执行步骤npm run bundle之前,网站无法正确显示其图像和布局

2)在执行npm run bundle步骤之后,网站正确显示了其图像和布局

3)在后台,npm run bundle将启动webpack。我在npm run bundle之后按CTRL + C关闭了Webpack,该网站仍在正确显示图像和布局。

4)我运行npm run bundle -- -p,该值应等于webpack -p,并且该网站无法再正确显示图像和布局。

npm run bundle -- -pwebpack -p)为什么不能正确编译资产?我以为它是npm run bundle的守护程序版本(即webpack),守护程序意味着在后台运行(我认为守护程序与服务相同吗?)?

如果我不正确地理解该概念或在任何地方错误地使用该术语,请纠正我。

谢谢!

1 个答案:

答案 0 :(得分:0)

回答我自己的问题:

  

1)在执行步骤npm run bundle之前,网站未显示其图片   并正确布局

资产(图像和css样式表的布局)尚未编译,因此Rails无法使用它,因此布局将不正确并且图像将不会显示。

您可以在此项目中使用npm run bundle来为开发环境编译资产。

  

2)在步骤npm run bundle之后,网站显示其图像,   正确布置

见上文。

  

3)在后台,npm run bundle将启动webpack。我关闭   在npm run bundle之后按CTRL + C组合键进行Webpack,然后访问该网站   仍能正确显示图像和布局。

我认为webpack(npm run bundle)的作用就像一台服务器,为所需的Rails服务器资产提供服务,但实际上并非如此。

webpack仅编译资产以供Rails使用。运行npm run bundle后webpack继续运行的原因是,它不断检测到资产文件源的更改,因此,当您发出浏览器刷新时,这些资产文件源的任何更改将立即反映出来。在网站上。

  

4)我运行npm run bundle -- -p,该值应等于webpack -p,   并且网站无法正确显示图像和布局   不再。   为什么npm run bundle--p(webpack -p)不编译   资产正确?

npm run bundle -- -p实际上等于webpack -p

要了解为什么网站无法再正确显示图像和布局,让我们先来看一下。当我运行npm run bundle -- p时,会发生以下情况:

modified:   config/initializers/fingerprint.rb

deleted:    public/javascripts/application.js
deleted:    public/javascripts/vendor.js
deleted:    public/stylesheets/application.css

added:      public/javascripts/application-2f49ec37563f77c91204.js
added:      public/javascripts/vendor-2f49ec37563f77c91204.js
added:      public/stylesheets/application-2f49ec37563f77c91204.css

npm run bundle -- -p将为生产环境编译资产,并将指纹(在本例中为-2f49ec37563f77c91204)添加到其输出中。

深入研究代码,我们可以看到app/views/layouts/application.html.erb具有以下代码:

<%= stylesheet_link_tag fingerprinted_asset('application') %>
<%= javascript_include_tag fingerprinted_asset('vendor') %>
<%= javascript_include_tag fingerprinted_asset('application') %>

看看fingerprinted_asset()中的app/helpers/application_helper.rb方法,我们可以看到:

  def fingerprinted_asset(name)
    Rails.env.production? ? "#{name}-#{ASSET_FINGERPRINT}" : name
  end

我们可以看到,在生产环境中,我们将使用带指纹的文件名;在非生产环境中,我们将使用带指纹的文件名。

在这种情况下,我正在开发环境中运行rails server,因此我的应用程序尝试查找名称中没有指纹的文件。这意味着这些:

public/javascripts/application.js
public/javascripts/vendor.js
public/stylesheets/application.css

但是我使用npm run bundle -- -p,它删除了上面的文件并生成了它们的指纹版本,因此Rails找不到它,因此不显示任何图像并向我显示错误的布局。

  

我认为它是npm run bundle的守护程序版本(   webpack)和守护进程意味着在后台运行(我认为守护进程是   和服务一样?)?

它不是npm run bundle的守护程序版本。我认为这是npm run bundle的守护程序版本,因为他们的Wiki过去常常说错了,请参见https://github.com/DMPRoadmap/roadmap/issues/1782