ความขัดแย้ง: เนื้อหาหลายรายการส่งออกไปยังชื่อไฟล์เดียวกัน


89

ฉันเป็นมือใหม่ Webpack ที่ต้องการเรียนรู้ทั้งหมดเกี่ยวกับเรื่องนี้ ฉันพบความขัดแย้งเมื่อเรียกใช้ webpack โดยบอกฉันว่า:

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

ฉันควรทำอย่างไรเพื่อหลีกเลี่ยงความขัดแย้ง

นี่คือ 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]",
      }
    ]
  }
};


6
สิ่งที่ฉันอยากรู้คือเครื่องมืออะไรที่เขียนข้อผิดพลาดเช่น "ความขัดแย้ง: เนื้อหาหลายรายการส่งไปยังชื่อไฟล์เดียวกัน slots.js" ทำไมคุณไม่ใส่ชื่อที่น่ารังเกียจของเนื้อหาที่ขัดแย้งในข้อผิดพลาดนั้นแทนที่จะบังคับให้ผู้ใช้ติดตาม ???
Michael Johnston

ข่าวดี! อัปเดตข้อผิดพลาดแล้ว ตอนนี้อ่านอย่างเป็นประโยชน์Conflict: Multiple chunks emit assets to the same filename main.css (chunks main and main)
Cheeso

คำตอบ:


99

ฉันไม่ค่อยคุ้นเคยกับแนวทางของคุณดังนั้นฉันจะแสดงวิธีทั่วไปที่จะช่วยคุณได้

ครั้งแรกของทั้งหมดของคุณoutputคุณจะได้รับการระบุfilenameในการที่จะทำให้ความรู้สึกสำหรับผมว่าการส่งออกจะยังคงเป็นapp.js หากคุณต้องการที่จะให้มันแบบไดนามิกที่ใช้แล้วเพียงแค่app.js"filename": "[name].js"

[name]ส่วนหนึ่งจะทำให้แบบไดนามิกชื่อไฟล์สำหรับคุณ นั่นคือจุดประสงค์ของคุณentryในฐานะวัตถุ แต่ละคีย์จะถูกใช้เป็นชื่อเพื่อแทนที่ไฟล์[name].js.

และอย่างที่สองคุณสามารถใช้ไฟล์html-webpack-plugin. คุณไม่จำเป็นต้องรวมเป็นไฟล์test.


13
มันจะดีมากถ้ามีตัวอย่างที่ตรงกับต้นฉบับ
roberto tomás

26

ฉันมีปัญหาเดียวกันฉันพบว่ามันกำลังตั้งชื่อไฟล์เอาต์พุตแบบคงที่ซึ่งเป็นสาเหตุของปัญหาของฉันในอ็อบเจ็กต์เอาต์พุตให้ลองอ็อบเจ็กต์ต่อไปนี้

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

ทำให้ชื่อไฟล์ต่างกันและไม่ขัดแย้งกัน

แก้ไข: สิ่งหนึ่งที่ฉันเพิ่งพบคือคุณควรใช้แฮชแทน chunkhash หากใช้การรีโหลด HMR ฉันไม่ได้เจาะลึกถึงต้นตอของปัญหา แต่ฉันเพิ่งรู้ว่าการใช้ chunkhash ทำลายการกำหนดค่า webpack ของฉัน

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

ควรทำงานได้ดีกับ HMR แล้ว :)

แก้ไขกรกฎาคม 2018:

ข้อมูลเพิ่มเติมเล็กน้อยเกี่ยวกับเรื่องนี้

แฮช นี่คือแฮชที่สร้างขึ้นทุกครั้งที่ webpack คอมไพล์ในโหมด dev ซึ่งดีสำหรับการป้องกันแคชระหว่างการพัฒนา แต่ไม่ควรใช้สำหรับการแคชไฟล์ของคุณในระยะยาว สิ่งนี้จะเขียนทับ Hash ในทุกงานสร้างของโครงการของคุณ

Chunkhash หากคุณใช้สิ่งนี้ร่วมกับชิ้นส่วนรันไทม์คุณสามารถใช้มันสำหรับการแคชระยะยาวกลุ่มรันไทม์จะเห็นสิ่งที่เปลี่ยนแปลงในซอร์สโค้ดของคุณและอัปเดตแฮชของชิ้นส่วนที่เกี่ยวข้อง จะไม่อัปเดตผู้อื่นเพื่อให้สามารถแคชไฟล์ของคุณได้


10

ฉันมีปัญหาเดียวกัน ดูเหมือนว่าปัญหาจะเกิดขึ้นกับไฟล์file-loader. ข้อผิดพลาดหายไปเมื่อฉันลบการทดสอบ html และรวมไว้html-webpack-pluginเพื่อสร้างindex.htmlไฟล์แทน นี่คือwebpack.config.jsไฟล์ของฉัน:

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]
}

html-webpack-plugin จะสร้างไฟล์ index.html และฉีดไฟล์ js ที่รวมเข้ามาโดยอัตโนมัติ


1
สิ่งนี้ช่วยแก้ปัญหาของฉันได้เช่นกัน ดูเหมือนว่าคุณสามารถมีHTMLWebpackPluginหรือhtml-loaderแต่ไม่ใช่ทั้งสองอย่าง
Raphael Rafatpanah

6

ฉันมีปัญหาเดียวกันและพบสิ่งเหล่านี้ในเอกสาร

หากการกำหนดค่าของคุณสร้าง "กลุ่ม" มากกว่ารายการเดียว (เช่นเดียวกับจุดเข้าใช้งานหลายจุดหรือเมื่อใช้ปลั๊กอินเช่น CommonsChunkPlugin) คุณควรใช้การแทนที่เพื่อให้แน่ใจว่าแต่ละไฟล์มีชื่อที่ไม่ซ้ำกัน

  • [name] ถูกแทนที่ด้วยชื่อของกลุ่ม
  • [hash] ถูกแทนที่ด้วยแฮชของการคอมไพล์
  • [chunkhash] ถูกแทนที่ด้วยแฮชของก้อน
 output: {
    path:__dirname+'/dist/js',

    //replace filename:'app.js' 
    filename:'[name].js'
}

2

ฉันพบข้อผิดพลาดนี้ในสภาพแวดล้อม dev ในเครื่องของฉัน สำหรับฉันวิธีแก้ไขข้อผิดพลาดนี้คือบังคับให้สร้างไฟล์ใหม่ ในการดำเนินการนี้ฉันได้ทำการเปลี่ยนแปลงเล็กน้อยกับไฟล์ CSS ของฉัน

ฉันโหลดเบราว์เซอร์ใหม่และข้อผิดพลาดก็หายไป


ต้องการใช้ asyncComponent จากนั้นฉันพบปัญหานี้กับไฟล์ที่อยู่ก่อนหน้าในส่วนประกอบอื่น ๆ เส้นด้ายเริ่มต้นใหม่อย่างง่ายได้รับการแก้ไข ขอบคุณ!
kidz

0

ข้อผิดพลาดเดียวกันในโปรเจ็กต์ Vue.js เมื่อทำ e2e ด้วย Karma หน้าถูกเสิร์ฟโดยใช้แม่แบบคงที่index.htmlกับ/dist/build.js และได้รับข้อผิดพลาดนี้เรียกใช้ Karma

คำสั่งในการออก Karma โดยใช้package.jsonคือ:

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

คอนฟิกูเรชันเอาต์พุตในwebpack.config.jsคือ:

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

วิธีแก้ปัญหาของฉัน: ได้รับแรงบันดาลใจจากคำตอบของ Evan Burbidge ฉันต่อท้ายสิ่งต่อไปนี้ที่ท้ายwebpack.config.js :

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

จากนั้นในที่สุดก็ใช้ได้กับทั้งการแสดงเพจและ e2e


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.