Webpack.config วิธีคัดลอก index.html ไปยังโฟลเดอร์ dist


189

ฉันกำลังพยายามทำให้สินทรัพย์เข้า / ออกโดยอัตโนมัติ ฉันมี config.js ต่อไปนี้:

module.exports = {
  context: __dirname + "/lib",
  entry: {
    main: [
      "./baa.ts"
    ]
  },
  output: {
    path: __dirname + "/dist",
    filename: "foo.js"
  },
  devtool: "source-map",
  module: {
    loaders: [
      {
        test: /\.ts$/,
        loader: 'awesome-typescript-loader'
      },
      { test: /\.css$/, loader: "style-loader!css-loader" }
    ]
  },
  resolve: {
    // you can now require('file') instead of require('file.js')
    extensions: ['', '.js', '.json']
  }
}

ฉันต้องการรวม main.html จากไดเรกทอรีที่อยู่ถัดจาก / lib ลงในโฟลเดอร์ / dist เมื่อเรียกใช้ webpack ฉันจะทำสิ่งนี้ได้อย่างไร

UPDATE 1 2017_____________

วิธีที่ฉันโปรดปรานในการทำเช่นนี้คือการใช้html-webpack-pluginไฟล์เทมเพลต ขอบคุณคำตอบที่ยอมรับเช่นกัน! ข้อดีของวิธีนี้คือไฟล์ดัชนีจะมีลิงก์ js cachbusted เพิ่มออกมาจากกล่อง!

คำตอบ:


162

ตัวเลือกที่ 1

ในindex.jsไฟล์ของคุณ(เช่นรายการ webpack) เพิ่มความต้องการของคุณindex.htmlผ่านปลั๊กอินตัวโหลดไฟล์เช่น:

require('file-loader?name=[name].[ext]!../index.html');

เมื่อคุณสร้างโครงการด้วย webpack แล้วindex.htmlจะอยู่ในโฟลเดอร์ผลลัพธ์

ตัวเลือก 2

ใช้html-webpack-pluginเพื่อหลีกเลี่ยงการมี index.html เลย เพียงแค่ให้ webpack สร้างไฟล์ให้คุณ


2
ฉันสามารถโหลดมันเขียนอะไรบางอย่างในไฟล์ปรับแต่งเองได้ไหม?
codeVerine

ลองใช้วิธีแรกแล้วคัดลอกไฟล์ แต่ CSS ที่ฉันคัดลอกหยุดทำงานอย่างถูกต้อง (ฉันต้องการภายนอกกับ webpack เพราะ Handsontable ไม่สามารถทำงานกับ webpack ได้)
Vaccano

@Vaccano สำหรับ CSS คุณไม่ควรใช้วิธีนี้ ใช้ style-loader และ css-loader ดูที่นี่: stackoverflow.com/questions/34039826/…
VitalyB

4
ใน webpack v2 คุณจะไม่สามารถใส่-loaderคำต่อท้ายได้ เช่นrequire('file-loader?name=[name].[ext]!../index.html');
คิดมาก

1
@codeVerine ใช่การใช้งานโดยเพิ่มบางอย่างเช่นอาเรย์{ test: /index\.html/, loader: 'file-loader', query: { name: '[name].[ext]' }ของคุณloadersในไฟล์ webpack config ของฉันเท่านั้นที่ฉันไม่สามารถรับ webpack-dev-server เพื่อให้บริการมันนำไปสู่ความสนุกสนาน 404 ในการร้องขอ/(รากไม่อยู่ !)
Brian McCutchon

67

ฉันจะเพิ่มตัวเลือกในคำตอบของ VitalyB:

ตัวเลือก 3

ผ่าน npm หากคุณเรียกใช้คำสั่งผ่าน npm คุณสามารถเพิ่มการตั้งค่านี้ใน package.json ของคุณได้ (ลองดู webpack.config.js ที่นั่นด้วย) สำหรับการพัฒนาที่เรียกใช้npm startไม่จำเป็นต้องคัดลอก index.html ในกรณีนี้เนื่องจากเว็บเซิร์ฟเวอร์จะถูกเรียกใช้จากไดเรกทอรีไฟล์ต้นฉบับและ Bundle.js จะสามารถใช้งานได้จากที่เดียวกัน (Bundle.js จะอยู่ในหน่วยความจำเท่านั้น แต่ จะสามารถใช้งานได้ราวกับว่ามันอยู่พร้อมกับ index.html) สำหรับการดำเนินการผลิตnpm run buildและโฟลเดอร์ dist จะมี bundle.js และ index.html ของคุณได้รับการคัดลอกด้วยคำสั่ง cp แบบเก่าอย่างที่คุณเห็นด้านล่าง:

"scripts": {
    "test": "NODE_ENV=test karma start",
    "start": "node node_modules/.bin/webpack-dev-server --content-base app",
    "build": "NODE_ENV=production node node_modules/.bin/webpack && cp app/index.html dist/index.html"
  }

อัพเดท: ตัวเลือก 4

มีcopy-webpack-pluginดังที่อธิบายไว้ในคำตอบของ Stackoverflow

แต่โดยทั่วไปยกเว้นไฟล์ "แรก" (เช่น index.html) และสินทรัพย์ขนาดใหญ่ (เช่นภาพหรือวิดีโอขนาดใหญ่) รวมถึง css, html, รูปภาพและอื่น ๆ โดยตรงในแอปของคุณผ่านทางrequireและ webpack จะรวมไว้สำหรับคุณ (ดีหลังจากที่คุณตั้งค่าอย่างถูกต้องด้วยตัวตักและปลั๊กอิน)


11
ตัวเลือก 3 ควรเป็นตัวเลือก 1
Gil Epshtain

2
ฉันลองใช้ตัวเลือก 3 แต่การโหลดใหม่อย่างร้อนแรงของ index.html ไม่ทำงาน คุณไม่แก้ไข index.html บ่อยเกินไปหรือไม่ คำถามที่จริงจัง
ศิลา

3
ใช้NCPแทนของซีพีถ้าคุณต้องการที่จะสนับสนุนสภาพแวดล้อม dev ข้าม OS
วิเวก Maharajh

33

คุณสามารถใช้CopyWebpackPlugin มันใช้งานได้เช่นนี้:

module.exports = {
  plugins: [
    new CopyWebpackPlugin([{
      from: './*.html'
    }])
  ]
}

ตอนนี้ Webpack ได้แทนที่ Gulp และ Grunt โดยไม่เพียงแค่ทำการมัด แต่ยังรวมถึงงานอื่น ๆ ที่เกี่ยวข้องกับการสร้างวิธีการแก้ปัญหานี้คือสิ่งที่ฉันได้เห็นในโครงการส่วนใหญ่ สคริปต์ในpackage.jsonนั้นใช้สำหรับสิ่งง่าย ๆ เช่นเริ่มการทดสอบการทำงานหรือเซิร์ฟเวอร์ dev เท่านั้น
Robert Jack Will

15

ฉันจะบอกว่าคำตอบคือ: คุณไม่สามารถ (หรืออย่างน้อย: คุณไม่ควร) นี่ไม่ใช่สิ่งที่ Webpack ควรทำ Webpack เป็นตัวรวมและไม่ควรใช้สำหรับงานอื่น ๆ (ในกรณีนี้: การคัดลอกไฟล์คงที่เป็นงานอื่น) คุณควรใช้เครื่องมืออย่าง Grunt หรือ Gulp เพื่อทำงานดังกล่าว มันเป็นเรื่องธรรมดามากที่จะบูรณาการWebpack เป็นงานฮึดฮัดหรือเป็นงานอึก พวกเขาทั้งสองมีงานอื่น ๆ ที่มีประโยชน์สำหรับการคัดลอกไฟล์เช่นคุณอธิบายเช่นฮึดฮัด contrib คัดลอกหรืออึกสำเนา

สำหรับเนื้อหาอื่น ๆ (ไม่ใช่index.html) คุณสามารถรวมเข้ากับ Webpack (นั่นคือสิ่งที่ Webpack ใช้) ตัวอย่างเช่นvar image = require('assets/my_image.png');. แต่ฉันคิดว่าความindex.htmlต้องการของคุณไม่ได้เป็นส่วนหนึ่งของบันเดิลดังนั้นจึงไม่ใช่งานสำหรับบันเดิล


59
ฉันไป webpack อย่างแม่นยำดังนั้นฉันจึงไม่จำเป็นต้องใช้เสียงฮึดฮัดหรืออึก มีทางเลือกอื่นอีกไหม? ถ้าฉันต้องใช้อึกทำไมฉันถึงต้องกังวลกับ webpack?
SuperUberDuper

4
คำถามนี้กลับหัวกลับหาง ทำไมคุณควรใช้ webpack ถ้าคุณใช้เสียงฮึดฮัดหรืออึก? พวกเขาเป็นระบบที่ดีมาก / สร้าง Webpack (หรือ browserify หรือ r.js) เป็นเครื่องมือที่คุณสามารถใช้สำหรับการรวมไฟล์ JS (และแหล่งข้อมูลอื่น ๆ ) จำนวนมากเข้าไว้ในชุดรวม JavaScript ขนาดใหญ่ (หรือหลายรายการ) คุณควรใช้เครื่องมือที่ถูกต้องสำหรับงาน และอีกครั้งมันเป็นเรื่องธรรมดามากที่จะเรียกใช้ webpack, browserify หรือ bundlers อื่น ๆ จาก grunt หรือ gulp
Brodie Garnet

1
webpack สามารถทำได้หลายวิธี คุณสามารถใช้file-loaderซึ่งโดยทั่วไปเพียงสำเนาแฟ้มภาพ / ไดเรกทอรีการแสดงผลและช่วยให้คุณ URL var url = require('myFile');เมื่อคุณต้องใช้มัน อย่างที่บอกไปแล้วว่าบันเดิลสามารถเป็นไฟล์เดียวหรือหลายไฟล์
Brodie Garnet

1
ฉันอาจใช้ brocolli เป็นกระบวนการสร้างหลัก
SuperUberDuper

1
นี่คือคำตอบที่ถูกต้องสำหรับฉัน ในโครงการขนาดใหญ่ / ซับซ้อนการสร้าง webpack ถือเป็นข้อพิจารณาที่สำคัญ ปลั๊กอินคัดลอกไฟล์ต่าง ๆ ช่วยเพิ่มค่าใช้จ่ายที่ไม่จำเป็นสำหรับ webpack การให้ webpack ให้ความสำคัญกับการรวม JS เป็นความคิดที่ดีกว่า
Evi Song

14

คุณสามารถเพิ่มดัชนีลงในรายการกำหนดค่าโดยตรงและใช้ตัวโหลดไฟล์เพื่อโหลดได้

module.exports = {

  entry: [
    __dirname + "/index.html",
    .. other js files here
  ],

  module: {
    rules: [
      {
        test: /\.html/, 
        loader: 'file-loader?name=[name].[ext]', 
      },
      .. other loaders
    ]
  }

}

5

คัดลอกที่มีอยู่แล้วindex.htmlไฟล์ลงในdistไดเรกทอรีคุณก็สามารถใช้HtmlWebpackPluginโดยการระบุแหล่งที่มาindex.htmlเป็นแม่แบบ

const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  // ...
  plugins: [    
    new HtmlWebpackPlugin({
      template: './path/to/index.html',
    })
  ],
  // ...
};

dist/index.htmlไฟล์ที่สร้างจะเหมือนกับไฟล์ต้นฉบับของคุณที่มีความแตกต่างซึ่งทรัพยากรที่รวมไว้เช่นไฟล์. js จะถูกฉีดด้วย<script>แท็กโดย webpack minificationและตัวเลือกเพิ่มเติมสามารถกำหนดค่าและได้รับการบันทึกไว้บน GitHub


3

มันทำงานได้ดีบน Windows:

  1. npm install --save-dev copyfiles
  2. ในpackage.jsonฉันมีงานคัดลอก:"copy": "copyfiles -u 1 ./app/index.html ./deploy"

สิ่งนี้จะย้าย index.html ของฉันจากโฟลเดอร์แอปไปยังโฟลเดอร์ปรับใช้


ฉันทำงานได้โดยใช้คำตอบที่นั่น: stackoverflow.com/questions/38858718/…
IsraGab

3

ในการขยายคำตอบของ @ hobbeshunter หากคุณต้องการใช้เฉพาะ index.html คุณสามารถใช้ CopyPlugin ได้แรงจูงใจหลักในการใช้วิธีนี้มากกว่าการใช้แพ็คเกจอื่นเป็นเพราะมันเป็นฝันร้ายที่จะเพิ่มแพ็คเกจจำนวนมากสำหรับทุกประเภทและกำหนดค่า ฯลฯ วิธีที่ง่ายที่สุดคือการใช้CopyPluginสำหรับทุกสิ่ง:

npm install copy-webpack-plugin --save-dev

แล้วก็

const CopyPlugin = require('copy-webpack-plugin');

module.exports = {
  plugins: [
    new CopyPlugin([
      { from: 'static', to: 'static' },
      { from: 'index.html', to: 'index.html', toType: 'file'},
    ]),
  ],
};

ตามที่คุณเห็นมันคัดลอกโฟลเดอร์คงทั้งพร้อมกับเนื้อหาทั้งหมดลงในโฟลเดอร์ dist ไม่จำเป็นต้องใช้ไฟล์ css หรือไฟล์หรือโปรแกรมเสริมอื่น ๆ

ในขณะที่วิธีนี้ไม่เหมาะกับทุกอย่างมันจะทำงานให้เสร็จได้อย่างรวดเร็ว


-1

ฉันพบว่ามันง่ายและทั่วไปพอที่จะวางindex.html ไฟล์ของฉันไว้ในdist/ ไดเรกทอรีและเพิ่ม<script src='main.js'></script>เพื่อindex.htmlรวมไฟล์ webpack ที่ให้มาด้วย main.jsดูเหมือนว่าจะเป็นชื่อออกเริ่มต้นของมัดของเราถ้าไม่มีอื่น ๆ ที่ระบุไว้ในไฟล์ conf webpack ของ ฉันคิดว่ามันไม่ดีและแก้ปัญหาระยะยาว แต่ฉันหวังว่ามันจะช่วยให้เข้าใจว่าwebpackทำงานอย่างไร

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