Conflict: Multiple assets emit to the same filename
Asked Answered
H

15

164

I'm a webpack rookie who wants to learn all about it. I came across a conflict when running my webpack telling me:

ERROR in chunk html [entry] app.js Conflict: Multiple assets emit to the same filename app.js

What should I do to avoid the conflict?

This is my webpack.config.js:

module.exports = {
  context: __dirname + "/app",

  entry: {
    'javascript': "./js/app.js",
    'html': "./index.html",
  },
  output: {
    path: __dirname + "/dist",
    filename: "app.js",
  },
  resolve: {
    extensions: ['.js', '.jsx', '.json']
  },
  module: {
    loaders: [
      {
        test: /\.jsx?$/,
        exclude: /node_modules/,
        loaders: ["babel-loader"]
      },
      {
        test: /\.html$/,
        loader: "file-loader?name=[name].[ext]",
      }
    ]
  }
};
Helga answered 9/2, 2017 at 23:8 Comment(3)
what I want to know is what tool writes an error like "Conflict: Multiple assets emit to the same filename slots.js". Why would you not put the damn names of the conflicting assets in that error instead of forcing the user to track it down???Sulphur
Good news! The error has been updated. It now helpfully reads Conflict: Multiple chunks emit assets to the same filename main.css (chunks main and main)Sully
Additional answers can be found here: #66454011Instinct
H
147

i'm not quite familiar with your approach so I'll show you a common way to help you out.

First of all, on your output, you are specifying the filename to app.js which makes sense for me that the output will still be app.js. If you want to make it dynamic, then just use "filename": "[name].js".

The [name] part will make the filename dynamic for you. That's the purpose of your entry as an object. Each key will be used as a name in replacement of the [name].js.

And second, you can use the html-webpack-plugin. You don't need to include it as a test.

Hillyer answered 10/2, 2017 at 3:43 Comment(1)
it would be great if this had a sample that matched the originalStamm
G
53

I had the same problem, I found it was setting a static output file name that was causing my problem, in the output object try the following object.

output:{
        filename: '[name].js',
        path: __dirname + '/build',
        chunkFilename: '[id].[chunkhash].js'
    },

This makes it so that the filenames are different and it doesn't clash.

EDIT: One thing i've recently found is that you should use a hash instead of chunkhash if using HMR reloading. I haven't dug into the root of the problem but I just know that using chunkhash was breaking my webpack config

output: {
  path: path.resolve(__dirname, 'dist'),
  filename: '[name].[hash:8].js',
  sourceMapFilename: '[name].[hash:8].map',
  chunkFilename: '[id].[hash:8].js'
};

Should work fine with HMR then :)

EDIT July 2018:

A little more information on this.

Hash This is a hash generated every time that webpack compiles, in dev mode this is good for cache busting during development but shouldn't be used for long term caching of your files. This will overwrite the Hash on every build of your project.

Chunkhash If you use this in conjunction with a runtime chunk then you can use it for long term caching, the runtime chunk will see what's changed in your source code and update the corresponding chunks hash's. It won't update others allowing for your files to be cached.

Gaullist answered 26/3, 2017 at 12:48 Comment(2)
Hi, what the :8 stand for? thxReasonless
@Reasonless the first 8 characters from the file's hashGamut
W
16

I had exactly the same problem. The problem seems to occur with the file-loader. The error went away when I removed the html test and included html-webpack-plugin instead to generate an index.html file. This is my webpack.config.js file:

var path = require('path');

var HtmlWebpackPlugin = require('html-webpack-plugin');
var HTMLWebpackPluginConfig = new HtmlWebpackPlugin({
  template: __dirname + '/app/index.html',
  filename: 'index.html',
  inject: 'body'
})

module.exports = { 
  entry: {
    javascript: './app/index.js',
  },  

  output: {
    filename: 'bundle.js',
    path: __dirname + '/dist'
  },  

  module: {
    rules: [
      {   
        test: /\.jsx?$/,
        exclude: [
          path.resolve(__dirname, '/node_modules/')
        ],  
        loader: 'babel-loader'
      },  
    ]   
  },  

  resolve: {
    extensions: ['.js', '.jsx', '.json']
  },  

  plugins: [HTMLWebpackPluginConfig]
}

The html-webpack-plugin generates an index.html file and automatically injects the bundled js file into it.

Wellfound answered 12/2, 2017 at 15:50 Comment(1)
This solved my issue as well. It seems you can have the HTMLWebpackPlugin, or the html-loader, but not both.Tempt
B
16

I had the same issue after upgrading to Webpack 5. My problem was caused by the copy-webpack-plugin.

Below is the original pattern ignoring a specified file, it works with Webpack 4, but throws an error with Webpack 5.

ERROR in Conflict: Multiple assets emit different content to the same filename default.hbs

  plugins: [
   new CopyPlugin({
      patterns: [
        {
          from: "./src/academy/templates",
          globOptions: {
            ignore: ["default.hbs"]
          }
        },
      ]
    }),
   ],

To fix the error:

  plugins: [
   new CopyPlugin({
      patterns: [
        {
          from: "./src/academy/templates",
          globOptions: {
            ignore: ["**/default.hbs"]
          }
        },
      ]
    }),
   ],

By not ignoring the specified file, the default.hbs (a.k.a index.html) was copied twice into the build (a.k.a /disk) directory effectively resulting in Webpack trying to insert multiple assets into the "same" (duplicated) filename.

Blotter answered 22/6, 2021 at 20:5 Comment(0)
F
8

I had the same problem, and I found these in the documents.

If your configuration creates more than a single “chunk” (as with multiple entry points or when using plugins like CommonsChunkPlugin), you should use substitutions to ensure that each file has a unique name.

  • [name] is replaced by the name of the chunk.
  • [hash] is replaced by the hash of the compilation.
  • [chunkhash] is replaced by the hash of the chunk.
 output: {
    path:__dirname+'/dist/js',

    //replace filename:'app.js' 
    filename:'[name].js'
}
Fibroma answered 8/7, 2017 at 13:34 Comment(0)
K
7

If you getting same kind error in Angular

enter image description here

Solution : delete cache folder inside .angular folder and start portal again ng serve

enter image description here

Kinna answered 12/7, 2022 at 16:15 Comment(1)
Removed all the .angular folder and everything went well :)Telencephalon
T
6

In my case the source map plugin was conflicting with the extract mini plugin. Could not find a solution to this anywhere. source maps for css and javascript were writing to the same file. Here is how I finally solved it in my project:

new webpack.SourceMapDevToolPlugin({
    filename: '[name].[ext].map'
}),
Toandfro answered 5/9, 2021 at 5:58 Comment(0)
L
4

I had the same problem after updating all the dependencies to latest (e.g. webpack 4 -> 5) for a Chrome extension I made about 2 years ago, and managed to solve it.

There were two files in the complaint (popup.html and options.html). Here is my original webpack.config.js file:

const path = require('path');
const CopyPlugin = require('copy-webpack-plugin');
const HtmlWebpackPlugin = require("html-webpack-plugin");
const { CleanWebpackPlugin } = require("clean-webpack-plugin");

module.exports = {
    target: 'web',
    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: '[name].js',
    },
    entry: {
        popup: './src/scripts/popup.tsx',
        options: './src/scripts/options.tsx',
    },
    context: path.join(__dirname),
    module: {
        rules: [
            {
                test: /\.tsx?$/,
                loader: 'ts-loader',
            },
            {
                test: /\.css$/,
                use: [
                    'style-loader',
                    'css-loader',
                ],
            },
            {
                test: /\.scss$/,
                use: [
                    'style-loader',
                    'css-loader',
                    'sass-loader',
                ],
            },
        ],
    },

    resolve: {
        extensions: ['.tsx', '.ts', '.js', '.json', '.css'],
    },
    plugins: [
        new CleanWebpackPlugin(),
        new CopyPlugin([
            { from: 'src/popup.html', to: 'popup.html' },
            { from: 'src/options.html', to: 'options.html' },
            { from: 'src/manifest.json', to: 'manifest.json' },
            { from: 'src/icons', to: 'icons' },
        ]),
        new HtmlWebpackPlugin({
            template: path.join("src", "popup.html"),
            filename: "popup.html",
            chunks: ["popup"]
        }),
        new HtmlWebpackPlugin({
            template: path.join("src", "options.html"),
            filename: "options.html",
            chunks: ["options"]
        }),
    ]
};

I solved it by removing:

            { from: 'src/popup.html', to: 'popup.html' },
            { from: 'src/options.html', to: 'options.html' },

under new CopyPlugin... part.

So seems like right now there is no need to explicitly copy popup.html and options.html to output folder when HtmlWebpackPlugin is already emitting them.

Luthuli answered 25/2, 2021 at 5:43 Comment(0)
D
3

I encountered this error in my local dev environment. For me, the solution to this error was to force the files to rebuild. To do this, I made a minor change to one of my CSS files.

I reloaded my browser and the error went away.

Delgadillo answered 15/6, 2018 at 15:32 Comment(1)
Wanted to use asyncComponent. Then I found this problem with a file which was before in other component. Simple restarting yarn fixed that. Thanks!Gauche
H
3

Similar solution to the above with file-loader, however, I think this solution is the more elegant. Before, I was only specifying the [name], adding the [path][name] resolved my conflict as below:

module: {
rules: [
  {
    test: /\.(mp4|m4s)$/,
    use: [
      {
        loader: 'file-loader',
        options: {
          name: '[path][name].[ext]',
        },
      },
    ],
  },
],
Haystack answered 31/12, 2021 at 14:42 Comment(0)
P
2

I changed index.html file from /public directory to /src to fix this issue. (Webpack 5.1.3)

Protective answered 22/10, 2020 at 6:44 Comment(0)
A
1

webpack 5 solution

Add chunkFilename and assetModuleFilename in output as showed below.

  output: {
    path: path.join(__dirname, "/build/"),
    filename: "js/[name].[contenthash].js",
    chunkFilename: 'chunks/[name].[chunkhash].js',
    assetModuleFilename: 'media/[name][hash][ext][query]'
  },
Ayana answered 29/11, 2022 at 15:15 Comment(0)
B
0

The same error in a Vue.js project when doing e2e with Karma. The page was served using a static template index.html with /dist/build.js. And got this error running Karma.

The command to issue Karma using package.json was:

"test": "cross-env BABEL_ENV=test CHROME_BIN=$(which chromium-browser) karma start --single-run"

The output configuration in webpack.config.js was:

 module.exports = {
  output: {
   path: path.resolve(__dirname, './dist'),
   publicPath: '/dist/',
   filename: 'build.js'
  },
  ...
 }

My solution: inspired by the Evan Burbidge's answer I appended the following at the end of webpack.config.js:

if (process.env.BABEL_ENV === 'test') {
  module.exports.output.filename = '[name].[hash:8].js'
}

And then it eventually worked for both page serving and e2e.

Binoculars answered 5/2, 2019 at 12:45 Comment(0)
P
0

I had a similar problem while upgrading webpack 3 to webpack 4. After upgrading the modules I came across this error.

WARNING in Conflict: Multiple assets emit different content to the same filename alert-icon.svg

WARNING in Conflict: Multiple assets emit different content to the same filename comment.svg

The problem was caused by fileloader for svg. Solved the error by adding a hash name: '[name].[hash:8].[ext]' making it unique every time webpack compiles.

Provinding the code below:

module: {
rules: [
  {
  test: /\.svg$/,
  loader: 'file-loader',
  query: {
    name: '[name].[hash:8].[ext]'
  }  
]   

}

Phonometer answered 12/4, 2022 at 13:43 Comment(0)
M
0

Everything is working. I found a bug in the function - I used straight quotes instead of slashes. With slashes everything works correctly.

The reason was the wrong quotes and webpack creates Bundel.${ext} - files in any mode, but with the correct quotes I get Bunle.js and Bundle.scss, or them with a hash. All working with simple [hash] without 8.

Marlborough answered 12/9, 2023 at 10:54 Comment(1)
As it’s currently written, your answer is unclear. Please edit to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers in the help center.Constructive

© 2022 - 2024 — McMap. All rights reserved.