javascript - 网络包。使用 `import()` 后加载 block 失败

标签 javascript reactjs webpack code-splitting

我正在处理 React项目,我发现其中一个 budles 文件太大,我需要拆分它。所以,我尝试使用 import()语法:

import React from 'react';
import thumbnails from './thumbnails.json';

export default class Portfolio extends React.Component {
    constructor(props) {
        super(props);
        import('react-image-gallery').then(module => {
            const ImageGallery = module.default;
            this.galleries = thumbnails.map((thumbnail, i) => {
                let items = [];
                for (let i = 0; i < thumbnail.gallery.amount; i++) {
                    items.push({
                        original: `${thumbnail.gallery.href}/${i}.png`,
                        thumbnail: `${thumbnail.gallery.href}/${i}m.png`,
                    })
                }
                return (
                    <div className="gallery">
                        <ImageGallery key={i} items={items} thumbnailPosition="left" showPlayButton={false}
                                      onImageLoad={this.onGalleryLoad.bind(this, thumbnail.gallery.amount)}/>
                        <button className="gallery__close" onClick={this.onCloseClick.bind(this)}>&times;</button>
                    </div>
                )
            });
        });
    }
Portfolio是一页的主要组件。后来打开页面,报错Uncaught (in promise) ChunkLoadError: Loading chunk 0 failed.正如我所见,JavaScript 尝试加载文件 0.bundle.js来自 portfolio目录。而需要的块是 0.chunk.js位于根目录中。
这是我的 Wepback 配置:
const TerserPlugin = require('terser-webpack-plugin');

module.exports = env => {
    const isDev = env.MODE === 'development';

    return {
        mode: isDev ? 'development' : 'production',
        devtool: 'source-map',
        entry: {
            './home/script': './home/script.jsx',
            './portfolio/script': './portfolio/script.jsx',
            './prices/script': './prices/script.jsx',
            './contacts/script': './contacts/script.jsx',
            './extra/script': './extra/script.jsx',
            './extra/locations/script': './extra/locations/script.jsx',
            './extra/poses/script': './extra/poses/script.jsx',
            './extra/stylists/script': './extra/stylists/script.jsx',
            './extra/studios/script': './extra/studios/script.jsx',
        },
        output: {
            path: __dirname,
            publicPath: __dirname,
            filename: '[name].bundle.js',
            chunkFilename: '[name].chunk.js',
        },
        module: {
            rules: [
                {
                    test: /\.jsx?$/,
                    exclude: /node_modules/,
                    use: {
                        loader: "babel-loader",
                        options: {
                            presets: ['@babel/preset-env', '@babel/react'],
                            plugins: [
                                '@babel/plugin-proposal-class-properties',
                                '@babel/plugin-transform-runtime',
                                '@babel/plugin-syntax-dynamic-import',
                            ]
                        }
                    }
                },
            ],
        },
        optimization: {
            minimize: !isDev,
            minimizer: [new TerserPlugin({
                test: /.js$/i,
                extractComments: false,
                terserOptions: {
                    output: {
                        comments: false,
                    },
                },
            })],
        },
        resolve: {
            extensions: ['.jsx', '.js'],
        }
    }
};

最佳答案

尝试将您的输出对象更改为

output: {
    ......
    chunkFilename: '[name].[chunkhash].js',
}
查看此内容以供引用 https://github.com/webpack/webpack/issues/9207#issuecomment-499448929

关于javascript - 网络包。使用 `import()` 后加载 block 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62846070/

相关文章:

ios - 用于 react native 地理定位的 podspec 设置

javascript - 如何将 <br/> 插入 JavaScript 字符串

javascript - webpack 的 require.ensure 是如何工作的?

javascript - 如何使音频按我希望的方式工作?

javascript - React Leaflet : Dynamic Markers, 无法读取属性 'addLayer'

javascript - 为什么 React 调用我的组件的次数比需要的次数多?

npm - 有什么方法可以使用不同的配置和 babel 生成多个转译文件吗?

javascript - 尝试为我的游戏服务器设置加载屏幕

javascript - JS 搞乱了幻灯片的定位

reactjs - 在 Jest 测试中使用 Webpack 的 DefinePlugin 变量