Webpack.config index.html dosyasının dist klasörüne nasıl kopyalanacağını


189

/ Dist varlıklarını otomatikleştirmek çalışıyorum. Aşağıdaki config.js var:

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

Ayrıca, webpack'i çalıştırırken / dist yanında bulunan dizinden main.html dosyasını / dist klasörüne eklemek istiyorum. Bunu nasıl yapabilirim?

GÜNCELLEME 1 2017_____________

Bunu yapmanın en sevdiğim yolu html-webpack-pluginşablon dosyasıyla birlikte kullanmak . Kabul edilen cevap için teşekkürler! Bu yolun avantajı, endeks dosyası ayrıca kutunun dışında cachbusted js bağlantısı eklenecek olmasıdır!

Yanıtlar:


162

seçenek 1

Sizin de index.jsdosyaya (yani webpack girişi) bir senin gerektirir eklemek index.htmlyoluyla dosya yükleyici eklentisi, örneğin:

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

Projenizi webpack ile oluşturduktan index.htmlsonra çıktı klasöründe olacaksınız.

seçenek 2

Kullanım html-webpack-eklentisi hiç bir index.html zorunda kalmamak için. Web paketinin dosyayı sizin için oluşturmasını sağlayın.


2
bir şekilde config dosyasında bir şeyler yazabilir miyim?
codeVerine

İlk yolu denedim ve dosyaları kopyaladı. Ama kopyaladığım CSS düzgün çalışmıyor. (Handsontable webpack ile çalışamayacağı için webpack'e dışa ihtiyacım vardı.)
Vaccano

@Vaccano için CSS bu yöntemi kullanmamalısınız. Bir stil yükleyici ve css yükleyici kullanın, buraya bakın: stackoverflow.com/questions/34039826/…
VitalyB

4
Webpack v2'de görünüşe göre -loadersoneki atlayamazsınız . örneğinrequire('file-loader?name=[name].[ext]!../index.html');
overthink

1
Evet @codeVerine, gibi bir şey ekleyerek kullanarak { test: /index\.html/, loader: 'file-loader', query: { name: '[name].[ext]' }sizin için loaderssadece ben olsun webpack-dev-sunucu istenirkeken, tuhaf yeterli, yol açarak 404 hizmet için edemedi sizin webpack yapılandırma dosyasında dizide /kök var olmayan ( !).
Brian McCutchon

67

VitalyB'nin cevabına bir seçenek ekleyeceğim:

Seçenek 3

Npm ile. Komutlarınızı npm ile çalıştırırsanız, bu kurulumu package.json dosyasına ekleyebilirsiniz (ayrıca webpack.config.js dosyasını da kontrol edin). Geliştirme geliştirmek npm startiçin, bu durumda index.html kopyalamaya gerek yoktur, çünkü web sunucusu kaynak dosyaları dizininden çalıştırılacak ve bundle.js aynı yerden kullanılabilecektir (bundle.js yalnızca bellekte yaşayacaktır, ancak index.html ile birlikte bulunmuş gibi kullanılabilir). Üretim çalıştırmak npm run buildve bir dist klasörü için bundle.js ve index.html, aşağıda görebileceğiniz gibi eski cp komutuyla kopyalanır:

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

Güncelleme: Seçenek 4

Bu Stackoverflow yanıtında açıklandığı gibi bir copy-webpack-eklentisi var

Aracılığıyla uygulamanıza kadar doğrudan css, html, resimler ve içerir, çok "ilk" dosyası (index.html gibi) ve (büyük resimler veya video gibi) daha büyük varlıklar haricinde Ama genel olarak, requireve webpack sizin için içerecektir (yükleyiciler ve muhtemelen eklentilerle doğru bir şekilde ayarladıktan sonra).


11
Seçenek 3, Seçenek 1
Gil Epshtain

2
Seçenek 3 denedim, ancak index.html sıcak yeniden yükleme işe yaramadı. İndex.html dosyanızı çok sık düzenlemiyor musunuz? Ciddi soru.
taş

3
Kullanım ncp arası OS dev ortamlarını desteklemek istiyorsanız cp yerine
Vivek Maharajh

33

CopyWebpackPlugin kullanabilirsiniz . Tıpkı şu şekilde çalışıyor:

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

Webpack, Gulp ve Grunt'un yerine sadece paketleme yapmakla kalmayıp, aynı zamanda yapıyla ilgili diğer birçok görevi yerine getirdiğine göre, bu çözüm çoğu projede gördüğüm şeydir. İçindeki komut dosyaları package.jsonyalnızca test çalıştırıcısını veya geliştirici sunucusunu başlatmak gibi basit şeyler için kullanılır.
Robert Jack,

15

Cevabınız şöyle diyebilirim: Yapamazsınız. (veya en azından: yapmamalısınız). Bu Webpack'in yapması gereken şey değil. Webpack bir paketleyicidir ve diğer görevler için kullanılmamalıdır (bu durumda: statik dosyaları kopyalamak başka bir görevdir). Bu tür işleri yapmak için Grunt veya Gulp gibi bir araç kullanmalısınız. Webpack'i bir Grunt görevi veya Gulp görevi olarak entegre etmek çok yaygındır . Her ikisinin de sizin tarif ettiğiniz dosyaları kopyalamak için yararlı diğer görevleri vardır, örneğin, grunt-katkıda-kopya veya gulp-kopya .

Diğer varlıklar için (değil index.html), bunları yalnızca Webpack ile paketleyebilirsiniz (tam olarak Webpack bunun için kullanılır). Örneğin var image = require('assets/my_image.png');,. Ancak, index.htmlihtiyaçlarınızın paketin bir parçası olmaması gerektiğini varsayıyorum ve bu nedenle paketçi için bir iş değil.


59
Kesinlikle webpack'e gittim, bu yüzden homurdanma ya da yudum kullanmam gerekmiyordu. Başka bir alternatif var mı? Eğer yudum kullanmam gerekirse neden webpack ile uğraşayım ki?
SuperUberDuper

4
Soru ters. Eğer homurdanma ya da yudum kullanabiliyorsanız neden web paketini kullanmalısınız? Çok iyi görev / inşa sistemleridir. Web paketi (veya browserify veya r.js), çok sayıda JS dosyasını (ve diğer kaynakları) tek bir büyük (veya birden çok) javascript paketinde paketlemek için kullanabileceğiniz araçlardır. İş için doğru aracı kullanmalısınız. Ve yine, webpack, browserify veya diğer paketleyicileri homurdanma veya yudumdan çalıştırmak çok yaygındır.
Brodie Garnet

1
Webpack'in bunu yapabilmesinin birçok yolu vardır. Sen kullanabilirsiniz file-loaderbunu gerektirdiğinde size url veren temelde sadece kopyalar çıktı dizinine dosya / resim ve: var url = require('myFile');. Dediğim gibi, bir paket bir veya daha fazla dosya olabilir.
Brodie Garnet

1
Üst oluşturma işlemi olarak
brocolli

1
Bu benim için doğru cevap. Büyük / karmaşık projelerde, webpack oluşturma performansı önemli bir husustur. Çeşitli dosya kopyalama eklentileri web paketine gereksiz maliyetler ekleyerek web paketinin JS paketlemesine odaklanmasını sağlamak daha iyi bir fikirdir.
Evi Song

14

Dizini doğrudan giriş yapılandırmanıza ekleyebilir ve yüklemek için bir dosya yükleyici kullanabilirsiniz

module.exports = {

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

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

}

5

Zaten var olan bir index.htmldosyayı distdizine kopyalamak için , kaynağı şablon olarak belirterek HtmlWebpackPlugin'i kullanabilirsiniz .index.html

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

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

Oluşturulan dist/index.htmldosya temelde .js dosyaları<script> gibi paketlenmiş kaynaklara webpack tarafından etiketler enjekte edilen fark ile kaynak dosyanızla aynı olacaktır . Küçültme ve diğer seçenekler yapılandırılabilir ve github'da belgelenir .


3

Windows'da bu iyi çalışır:

  1. npm install --save-dev copyfiles
  2. In package.jsonI kopyası görev var:"copy": "copyfiles -u 1 ./app/index.html ./deploy"

Bu, index.html'imi uygulama klasöründen konuşlandırma klasörüne taşır.



3

Yalnızca index.html almak istiyorsanız @ hobbeshunter'ın yanıtını genişletmek için CopyPlugin'i de kullanabilirsiniz, bu yöntemi diğer paketleri kullanmakta kullanmak için ana motivasyon, her tür için birçok paket eklemek ve yapılandırmak için bir kabus olmasıdır. en kolay yol CopyPlugin'i her şey için kullanmaktır :

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

Sonra

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

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

Gördüğünüz gibi tüm statik klasörü tüm içeriği ile birlikte dist klasörüne kopyalayın. Css veya dosya veya başka eklentilere gerek yoktur.

Bu yöntem her şey için uygun olmasa da, işi basit ve hızlı bir şekilde yapar.


-1

Ben de buldum kolay ve yeterince jenerik için koymak benim index.html dosyayı içinde dist/ dizine ekleyebilir <script src='main.js'></script>etmek index.htmlbenim paketlenmiş webpack dosyaları dahil etmek. main.jsweb paketinin conf dosyasında başka belirtilmemişse paketimizin varsayılan çıktı adı gibi görünüyor . Sanırım iyi ve uzun vadeli bir çözüm değil, ama umarım webpack'in nasıl çalıştığını anlamaya yardımcı olabilir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.