Я довольно хорошо знаком с webpack и html-webpack-plugin и уже использовал их в нескольких других (SPA) проектах. Но в этом новом проекте я должен преобразовать устаревший многостраничный веб-сайт, чтобы использовать веб-пакет. Существует специальный обработчик asp.net (ashx), который в настоящее время объединяет (и минимизирует в сборках prod) зарегистрированные сценарии, помещая отдельный запятый список имен сценариев в строку запроса ссылки .ashx в теге script: <script src="Script.ashx?i=jquery,jquery-ui,...">
.
Одна из проблем заключается в том, что почти все страницы используют главную страницу. Таким образом, нет тега <body>
для использования в плагине html-webpack-plugin.
Если бы я имел дело с небольшим количеством записей, у меня не было бы проблем с использованием нескольких шаблонов html-webpack-plugin для вставки скриптов и размещения выходных файлов в правильном месте в структуре папок проекта. Но есть 50 страниц ASPX в разных местах в структуре папок проекта. Так что я бы очень хотел не использовать отдельные шаблоны для всех этих страниц.
Но, учитывая, что ни в одном из этих файлов нет тегов <body>
, как мне вставить сценарии в нужное место?
Я создал собственный генератор кода для чтения всех aspx-страниц в проекте и поиска ссылок на Script.ashx. Затем он анализирует строку запроса, разделенную запятыми, и создает сопутствующий файл .js с одним оператором импорта для каждого из ссылочных сценариев. Эти сопутствующие файлы .js будут теми, на которые есть ссылки в массиве "entry" веб-пакета. Так, например, /home.aspx получает сопутствующий файл /home-entry.js. Этот файл находится в конфигурации веб-пакета: entry { "home" : "./home-entry", ... }
. И соответствующий Script.ashx закомментирован на исходной странице aspx. Я также создаю код для массива webpack entry
и ссылок html-webpack-plugin для каждого entry
в массив plugins
в конфигурации webpack.
Home.aspx (фрагмент):
<asp:Content ID="Content6" ContentPlaceHolderID="footerPlaceHolder" runat="server">
<script type="text/javascript" src="/Script.ashx?i=jquery,jquery-migrate,jquery-ui,jquery-watermark,popr,acrobat-detection,pdflinkfix,device,navbar,jqdialoghelper,home&v=<%= "" + MyNameSpace.Scripts.ScriptHelpers.AssemblyVersion %>"></script>
</asp:Content>
Пример ввода:
"home" : "./home-entry",
Пример плагинов:
new HtmlWebpackPlugin( {
chunks: ['home-entry'],
alwaysWriteToDisk: true,
filename: "./home.aspx",
inject: 'body', // or what?
chunkSortMode: "dependency",
hash: true
} ),
дом-entry.js:
import '/Scripts/jquery-3.3.1.min'
import '/Scripts/jquery-migrate-min'
import '/Scripts/jquery-ui-1.12.1.min'
import '/Scripts/jquery.watermark.min'
import '/Scripts/popr/popr'
import '/Scripts/acrobat_detection'
import '/Scripts/PDFLinkFix'
import '/Scripts/Device'
import '/Scripts/NavBar'
import '/Scripts/jqDialogHelper'
import '/Scripts/Home'
Ожидаемый результат: большая проблема в том, что я не могу понять, есть ли способ сказать html-webpack-plugin, чтобы он вставлял в определенный тег. То есть я хочу найти конкретный тег <asp:Content ID="Content6" ContentPlaceHolderID="footerPlaceHolder" runat="server">
и вставить в него теги сценария. Обратите внимание, что существуют другие теги <asp:Content>
, которые имеют разные значения ContentPlaceHolderID
. Так что html-webpack-plugin должен найти тот, у которого ContentPlaceHolderID="footerPlaceHolder"
.
Фактический результат: я полагаю, что при использовании стандартных параметров плагина html-webpack-plugin, при отсутствии тега <body>
, плагин будет помещать скрипты в конец файла. Что запутает asp.net.