Загрузка сгенерированных чанков веб-пакетов из чанков времени выполнения - PullRequest
0 голосов
/ 17 апреля 2019

Я частично обновляю существующее веб-приложение новым (реагирующим) кодом и использую веб-пакет, чтобы связать все вместе для производства. Поскольку существующая HTML-страница (на самом деле это XML, преобразованный в HTML) уже существует, я не могу использовать index.html, сгенерированный HtmlWebpackPlugin.

Чего я хотел бы добиться, так это того, чтобы webpack генерировал небольшой runtime.bundle.js, который будет динамически загружать другие сгенерированные чанки (main.[contenthash] и vendor.[contenthash]), вместо добавления этих записей в виде тегов script к * 1009. *. Таким образом, runtime.bundle.js можно установить на nocache, тогда как другие большие блоки могут быть кэшированы браузером и правильно извлечены при изменениях кода.

Например, вот блок тела сгенерированного index.html, обратите внимание на комментарий:

<html>
  <head>...</head>
  <body>
    <noscript>You need to enable JavaScript to run this app.</noscript>
    <div id="root"></div>
    <script type="text/javascript" src="runtime.bundle.js"></script>

    <!-- I want these two files below not injected as script tags, 
         but loaded from the runtime.bundle.js file above  -->

    <script type="text/javascript" src="vendors.31b8acd750477817012d.js"></script>
    <script type="text/javascript" src="main.1e4a456d496cdd2e1771.js"></script>
  </body>
</html>

Файл времени выполнения уже загружает другой фрагмент, который динамически импортируется из JS со следующим кодом:

const App = React.lazy(() => import(/* webpackChunkName: "modulex" */ './App'));

Это создает следующий фрагмент где-то внутри runtime.bundle.js

          a = document.createElement('script');
        (a.charset = 'utf-8'),
          (a.timeout = 120),
          i.nc && a.setAttribute('nonce', i.nc),
          (a.src = (function(e) {
            return (
              i.p +
              '' +
              ({ 1: 'modulex' }[e] || e) +
              '.' +
              { 1: '0e0c4000d075e81c1e5b' }[e] +
              '.js'
            );

Так может ли быть достигнуто то же самое для блока vendors и main?

Единственное альтернативное решение, о котором я могу подумать, - это использовать WebpackManifestPlugin для генерации manifest.json и использовать его для вставки фрагментов в уже существующий HTML-файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...