React Webpack CompressionPlugin gzip Проблема с динамической загрузкой страницы

Я использую веб-пакет 3.10.0 с CompressionPlugin 1.1.11 для реакции. Это все работает и сжимает разделенные файлы чанка.

Это файлы *.js, разделенные генерацией для всех частей маршрутизатора приложения, через чанки веб-пакетов, такие как (реагируйте на route.js):

import React from 'react';
import {Route, IndexRoute} from 'react-router';
import App from './containers/App';


function errorLoading(error) {
    throw new Error(`Dynamic page loading failed: ${error}`);
}

function loadRoute(cb) {
    return module => cb(null, module.default);
}

export default {
    path: '/',
    component: App,
    indexRoute:
    {
        getComponent(location, cb) {
            System.import(/* webpackChunkName: "dashboard" */ './components/dashboard/Dashboard')
                .then(loadRoute(cb))
                .catch(errorLoading);
        },
    },
    childRoutes: [
        {
            path: 'dashboard',
            getComponent(location, cb) {
                System.import(/* webpackChunkName: "dashboard" */ './components/realestate/RealEstate')
                    .then(loadRoute(cb))
                    .catch(errorLoading);
            }
        },
        {
            path: 'routeritem1',
            getComponent(location, cb) {
                System.import(/* webpackChunkName: "routeritem1" */ './components/routeritem1')
                    .then(loadRoute(cb))
                    .catch(errorLoading);
            }
        },
        {
            path: 'routeritem2',
            getComponent(location, cb) {
                System.import(/* webpackChunkName: "routeritem2" */ './components/routeritem2')
                    .then(loadRoute(cb))
                    .catch(errorLoading);
            }
        },

        {
            path: 'routeritem3',
            getComponent(location, cb) {
                System.import(/* webpackChunkName: "routeritem3" */ './components/routeritem3')
                    .then(loadRoute(cb))
                    .catch(errorLoading);
            }
        },

        {
            path: 'routeritem4',
            getComponent(location, cb) {
                System.import(/* webpackChunkName: "routeritem4" */ './components/routeritem4')
                    .then(loadRoute(cb))
                    .catch(errorLoading);
            }
        },

        {
            path: 'routeritem5',
            getComponent(location, cb) {
                System.import(/* webpackChunkName: "routeritem5" */ './components/routeritem5')
                    .then(loadRoute(cb))
                    .catch(errorLoading);
            }
        },
    ],
};

С помощью ChangeExtensionPlugin он добавляет основные сжатые файлы javascript в конец тега index.html.

<script type="text/javascript" src="vendor-1.1.0.js.gz"></script><script type="text/javascript" src="main_-1.1.0.js.gz"></script>

Все идет нормально. Есть еще 10 файлов.js.gz, которые загружаются по команде, когда вы просматриваете через реагирующий маршрутизатор.

Проблема в том, что эти файлы заканчиваются на.js.gz, а не на js. Когда я просматриваю часть маршрутизатора, браузер выдает: Ошибка: сбой при динамической загрузке страницы: Ошибка: сбой при загрузке фрагмента 0.

Внутри vendor.js:

/******/script.src = __webpack_require__.p + "" + ({"0":"dashboard","1":"routeritem1","2":"routeritem2","3":"routeritem3","4":"routeritem4","5":"routeritem5"}[chunkId]||chunkId) + "_-1.1.0.js";

изменение " -1.1.0.js"; на " -1.1.0.js.gz"; решает проблему, но я хочу, чтобы она была полностью автоматизирована.

В веб-пакете в файле: JsonpMainTemplatePlugin.js, рядом: const scriptSrcPath = this.applyPluginsWaterfall эта часть генерируется. Я не хочу менять сам код веб-пакета.

Любая идея, как это может быть автоматизировано (например, плагин, изменения webpack.config.js, что-то еще), чтобы изменить эту часть генерации кода веб-пакета?

Соответствующий webpack.config.js

    plugins: [      
  new webpack.optimize.ModuleConcatenationPlugin(),
  new webpack.optimize.CommonsChunkPlugin({
      name: 'vendor',
      filename: 'vendor' + outputFileTemplateSuffix + '.js',
      minChunks: Infinity
  }),
  new webpack.DefinePlugin({
      "process.env": { NODE_ENV: JSON.stringify("production")}
  }),
  new webpack.ProvidePlugin({
       $: "jquery",
       jQuery: "jquery",
       "window.jQuery": "jquery"
  }),
  new HtmlWebpackPlugin({
    template: path.join(__dirname, 'index.html'),
    filename: 'index.html',
    minify: {
            collapseWhitespace: true,
            collapseInlineTagWhitespace: true,
            removeComments: true,
            removeRedundantAttributes: true
        }
  }),
  new UglifyJsPlugin({
    parallel: true,
    uglifyOptions: {
    ecma: 5, // specify one of: 5, 6, 7 or 8
    keep_classnames: false,
    keep_fnames: false,
    ie8: false,
    nameCache: null, // or specify a name cache object
    safari10: false,
    toplevel: false,
    warnings: false,
    }
  }),
  new CompressionPlugin({
    asset: '[path].gz[query]',
    algorithm: 'gzip',
    test: /\.js$/,
    threshold: 10240,
    minRatio: 0.8,
    deleteOriginalAssets: true
   }),
   new ChangeExtensionPlugin(
   {
    extensions: ['js'],
    compressionMethod: 'gz',
   }),
   new CopyWebpackPlugin([
    {
        from: path.join(__dirname, 'app/img'),
        to: 'img'
    }
  ])
],

0 ответов

Другие вопросы по тегам