Я нашел довольно хорошее решение этой проблемы, которое в основном сводится к использованию переменной EJS для отслеживания ресурсов, включенных при визуализации документа EJS. Ниже приведен сокращенный пример, который работает только для тегов скрипта (но может быть легко расширен до таблиц стилей или чего-либо еще)
Часть, которая помогает с включением ресурсов:
//file: "include.ejs"
<% for (var i in scripts) { %> //scripts an arr of js files to (maybe) include
<% if (!resources[scripts[i]]) { %>
<script src="<%= scripts[i] %>"></script>
<% resources[scripts[i]] = true %>
<% } %>
<% } %> <!-- end for -->
И файл, который использует этот фрагмент для включения сценариев
//file: "somepartial.ejs"
<html>
<head>
<%- partial("include.ejs", {
scripts: ["lib/jquery.js", "lib/bootstrap-tabs.js"]
}) %>
</head>
<body>
<!-- MY EJS PARTIAL! -->
</body>
</html>
А при рендеринге частичного:
response.render('somepartial.ejs', {
resources: {},
/* some other variables */
});
Таким образом, вы можете быть уверены, что скрипт включен частичным, но только если он уже не был включен где-то на отображаемой HTML-странице
Ограничение
Есть одно ограничение, с которым я столкнулся: если вы загружаете часть своей страницы с помощью запроса AJAX, например
$("#someDiv").load("/another/part/of/the/page.html");
Тогда ресурсы, включенные в загруженную AJAX часть страницы, не будут знать о уже загруженных сценариях (если вы не передадите эту информацию в аргументе REST, как я):
$("#someDiv").load("/another/part/of/the/page.html?resources={...}");
Конечно, с помощью этого небольшого исправления любые две части страницы, загруженные с помощью вызова AJAX, могут запрашивать один и тот же ресурс, и у них нет возможности узнать это, поскольку они знают только о том, что имеет родительский документ. загружен (надеюсь, что это имеет смысл)