回答我自己的问题:
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
.