您可以将任何想要手动加载的 Javascript 文件放在应用程序的 public/javascripts/lib 目录中,它们不会包含在资产管道中。然后,您可以在需要它们的页面上手动加载它们。
例如,在一个项目中,我使用了Chosen jQuery 插件,然后像这样加载它:
<script type="text/javascript" src="/javascripts/lib/chosen.jquery.min.js"></script>
Rails 将从public/ 获取公共文件,因此您只需从那里引用您的文件(删除public/ 位)。
这个项目相当大,有 88 个控制器、662 个动作,以及总共 38 个自定义 JavaScript 库,这些库在应用程序中偶尔使用,包括 Markdown 编辑器、图表库,甚至 jQuery UI。
为了管理蔓延并尽可能保持每个页面紧凑,我做了两件事:1)在我的控制器中,我设置了一个实例变量@page_libs,以列出要加载的库,以及 2) layout 在需要时使用@page_libs 中的值来包含特殊的Javascript。
控制器动作可能如下所示:
def edit
@products = products.find(params[:id])
@page_libs = [:ui, :textile]
end
app/views/layouts/application.html.erb 将其包含在正确的位置:
<%- if @page_libs&.include?(:ui) || @page_libs&.include?(:table) %>
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js"></script>
<script type="text/javascript" src="/javascripts/lib/chosen.jquery.min.js"></script>
<% end -%>
<%- if @page_libs&.include?(:swiper) %>
<script type="text/javascript" src="/javascripts/lib/idangerous.swiper.min.js"></script>
<% end -%>
<%- if @page_libs&.include?(:table) %>
<script type="text/javascript" src="/javascripts/lib/jquery.handsontable.full.js"></script>
<% end -%>
<%- if @page_libs&.include?(:textile) %>
<script type="text/javascript" src="/javascripts/lib/textile.js" charset="utf-8"></script>
<% end -%>
请注意,第一个包含用于 jQuery UI,我从 CDN 加载,而不是从我的应用程序的 public 加载。这种技术同样适用于外部库以及您托管的库。事实上,我的应用程序中的大多数页面只依赖于 2 个外部库(jQuery 和 Underscore.js),但可以选择从外部源加载多达 16 个其他 Javascript 库。限制页面上的外部库可以显着减少页面加载时间,直接提升应用程序的性能。
有时,Javascript 库也会包含 CSS 组件。或者,您甚至可以包含特定于页面的 CSS。外部样式表也可以采用相同的方法。这些是上述 Javascript 库的相应页面特定样式表“包含”:
<%- if @page_libs&.include?(:ui) %>
<link rel="stylesheet" type="text/css" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/themes/smoothness/jquery-ui.css">
<link rel="stylesheet" type="text/css" href="/stylesheets/lib/chosen.min.css">
<% end -%>
<%- if @page_libs&.include?(:swiper) %>
<link rel="stylesheet" type="text/css" href="/stylesheets/lib/idangerous.swiper.css">
<% end -%>
这样,我在项目中有一个点来管理库,而不管页面需要多少(或少数)。我最终可能会在 ApplicationController 中创建一系列自定义 before_action 处理程序,以定义页面需要包含哪些库。像这样的:
before_action: :include_library_ui, only: [:new, :edit]
before_action: :include_library_swiper, only: [:show]
这将进一步清理控制器操作,并更容易识别依赖关系。然而,鉴于我的代码库的大小和剩余的紧迫任务,我还没有迈出这一步。也许它会激励你开始这样做。