Webpack 打包自定义库时生成 [hash].worker.js 文件

Posted

技术标签:

【中文标题】Webpack 打包自定义库时生成 [hash].worker.js 文件【英文标题】:Webpack generating [hash].worker.js file when packaging custom library 【发布时间】:2020-08-08 12:04:17 【问题描述】:

我正在尝试创建一个可重用的 React 组件库以供我们内部使用。

Webpack 正在捆绑输出 - 应该 是单个文件。但它实际上是把我期望的 bundle.js 加上一个名为 [some_hash].worker.js 的文件。

我不确定如何强制 webpack 将那个“worker”文件包含在我要求的单个包中。

webpack.config:

const path = require('path');
const webpack = require('webpack');

const DIST_PATH = path.resolve(__dirname, "../dist");
const SRC_PATH = path.resolve(__dirname, "../src");
const APP_PATH = path.resolve(__dirname, "../src/index.js");
const BASE_PATH = path.resolve(__dirname);
const  CleanWebpackPlugin  = require('clean-webpack-plugin');

module.exports = ( appPath = APP_PATH, distPath = DIST_PATH ) => (
  context: BASE_PATH,
  devServer: 
    contentBase: distPath,
    compress: true,
    port: 9000,
    historyApiFallback: true
  ,
  resolve: 
    modules: ['node_modules', SRC_PATH],
    alias: 
      'react': path.resolve(__dirname, '../node_modules/react'),
      'react-dom': path.resolve(__dirname, '../node_modules/react-dom'),
    
  ,
  externals: 
      // Don't bundle react or react-dom
      react: 
        commonjs: "react",
        commonjs2: "react",
        amd: "React",
        root: "React"
      ,
      "react-dom": 
        commonjs: "react-dom",
        commonjs2: "react-dom",
        amd: "ReactDOM",
        root: "ReactDOM"
      
  ,
  entry: 
    bundle: appPath,
  ,
  output: 
    path: distPath,
    filename: 'index.js',
    publicPath: '/dist/',
    library: 'internal-components',
    libraryTarget: 'umd',
    umdNamedDefine: true
  ,
  module: 
    rules: [
      
        test: /\.jsx$/,
        use: 
          loader: 'babel-loader',
          options: 
            presets: ['@babel/preset-env', '@babel/preset-react'],
            plugins: [
              '@babel/plugin-proposal-object-rest-spread',
              '@babel/plugin-syntax-dynamic-import',
              [ '@babel/plugin-proposal-decorators',  'legacy': true  ],
              [ '@babel/plugin-proposal-class-properties',  'loose': true  ]
            ]
          
        
      ,
      
        test: /\.js$/,
        exclude: /(node_modules|build)/,
        use: 
          loader: 'babel-loader',
          options: 
            presets: ['@babel/preset-env'],
            plugins: [
              '@babel/plugin-proposal-object-rest-spread',
              '@babel/plugin-syntax-dynamic-import',
              ['@babel/plugin-proposal-decorators', 'legacy': true],
              ["@babel/plugin-proposal-class-properties", 'loose': true]
            ]
          
        
      ,
      ...
    ]
  ,
  plugins: [
    new CleanWebpackPlugin(),
    new webpack.optimize.LimitChunkCountPlugin(
      maxChunks: 1,
    )
  ]
);

【问题讨论】:

【参考方案1】:

您可以尝试使用带有内联的worker-loader plugin 来处理捆绑 -

rules: [
      ...
      
        test: /\.worker\.js$/,
        use: 
           loader: 'worker-loader',
           options:  inline: true, fallback: false 
        
      
    ]

也就是说,Github 上有几个未解决的问题,围绕着使用 worker 作为blob,所以 YMMV

【讨论】:

【参考方案2】:

实际上,如果您使用的是 webpack 3 及更高版本,捆绑包的分块会自动为您完成。在 SplitChunks 插件文档 here 中,它实际上说明了它的行为方式。

因此,您可能需要扫描您的代码并检查这种情况。另外很高兴知道您是否正在异步导入某些模块?这可能会向 webpack 发出信号,让它成为一个单独的块。

【讨论】:

以上是关于Webpack 打包自定义库时生成 [hash].worker.js 文件的主要内容,如果未能解决你的问题,请参考以下文章

webpack 打包产生的文件名中,hash 与 chunkhash 的区别

webpack中的hashchunkhash和contenthash

webpack打包后iconfont文件路径问题解决

webpack项目如何正确打包引入的自定义字体

webpack系统学习之一

Webpack4 常用配置