代码之家  ›  专栏  ›  技术社区  ›  Henry Yang

为什么'npm run bundle--p'(webpack-p)不为我的rails应用程序编译资产?

  •  0
  • Henry Yang  · 技术社区  · 6 年前

    我参与了这个铁路项目( https://github.com/DMPRoadmap/roadmap )试着让它跟着它 installation guide

    当遵循安装指南时:

    1) 步骤前: npm run bundle ,网站没有正确显示其图像和布局

    2) 在这一步之后 npm运行包 ,网站显示其图像和布局正确

    3) 在引擎盖下, npm运行包 将启动webpack。我在之后按CTRL+C关闭网页包 npm运行包 ,网站仍在正常显示图像和布局。

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

    为什么 npm运行包--p (即 网页包-p )没有正确编译资产?我以为是守护进程版本的 npm运行包 (即 webpack )daemon意味着在后台运行(我认为daemon与service是同一个?)?

    如果我对这个概念理解不正确,或者在任何地方使用不正确,请纠正我。

    谢谢您!

    1 回复  |  直到 6 年前
        1
  •  0
  •   Henry Yang    6 年前

    回答我自己的问题:

    1) 步骤前: npm run bundle ,网站不显示其图像 合理布局

    资产(图像和css样式表的布局)还没有编译,因此Rails不能使用它,因此布局将不正确,图像也不会显示。

    您可以使用 npm运行包 在这个项目中。

    2) 在这一步之后 npm运行包 ,网站显示了它的图像和 合理布局

    见上文。

    3) 在引擎盖下, npm运行包 将启动webpack。我关闭 按CTRL+C组合键打开网页 npm运行包 ,以及网站 仍在正确显示图像和布局。

    我以为网页包( npm运行包 )像服务器一样,为他们所需要的rails服务器资产提供服务,但实际上这不是真的。

    webpack只编译rails使用的资源。网页包在你运行之后继续运行的原因 npm运行包 因为它不断检测到这些资产文件的源的更改,因此当您在网站上发布浏览器刷新时,这些资产文件的源的任何更改都将立即反映出来。

    4) 我跑 npm run bundle -- -p 应该等于 webpack -p , 网站没有正确显示图片和布局 不再。 为什么npm run bundle--p(即webpack-p)没有编译 合适的资产?

    npm运行包--p 确实等于 网页包-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运行包--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运行包--p ,这将删除上述文件并生成它们的指纹版本,因此rails找不到它,因此不会显示任何图像,并向我显示不正确的布局。

    我以为是守护进程版本的 npm运行包 (即 webpack)和daemon意味着在后台运行(我认为daemon是 与服务相同?)?

    它不是 npm运行包 . 我以为是守护进程版本的 npm运行包 因为他们的维基经常这么说哪一个是错的,看 https://github.com/DMPRoadmap/roadmap/issues/1782 .