Webpack.configは、index.htmlをdistフォルダにコピーする方法


189

/ distに入るアセットを自動化しようとしています。次の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']
  }
}

また、webpackの実行時に/ libの隣にあるディレクトリの/ distフォルダにmain.htmlを含めたいと思います。これどうやってするの?

更新1 2017_____________

これを行う私のお気に入りの方法はhtml-webpack-plugin、テンプレートファイルでを使用することです。受け入れられた答えにも感謝します!この方法の利点は、インデックスファイルに、キャッシュされたjsリンクが追加で追加されることです。

回答:


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 2016年

最初の方法を試したところ、ファイルがコピーされました。しかし、コピーしていたCSSが正しく機能しなくなりました。(Handsontableはwebpackで動作しないため、webpackの外部で必要でした。)
Vaccano '27

CSSの@Vaccanoでは、このメソッドを使用しないでください。スタイル・ローダーとCSS-ローダーを使用して、ここを参照してください:stackoverflow.com/questions/34039826/...
VitalyB

4
webpack v2では、-loaderサフィックスを省略できないようです。例えばrequire('file-loader?name=[name].[ext]!../index.html');
overthink

1
@codeVerineはい、webpack構成ファイルの配列に何かを追加して使用する{ test: /index\.html/, loader: 'file-loader', query: { name: '[name].[ext]' }と、loaderswebpack-dev-serverにサービスを提供できず、おかしなことに、リクエストで404が発生します/(ルートは存在しません) !)。
Brian McCutchon 2017

67

VitalyBの回答にオプションを追加します。

オプション3

npm経由。npmを介してコマンドを実行する場合は、この設定をpackage.jsonに追加できます(webpack.config.jsも確認してください)。runを開発するnpm start場合、この場合、index.htmlをコピーする必要はありません。これは、Webサーバーがソースファイルディレクトリから実行され、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
OSを
超えた開発

32

CopyWebpackPluginを使用できます。それは次のように機能しています:

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

WebpackがGulpとGruntに代わって、バンドルだけでなく、ビルドに関連する他の多くのタスクも実行するようになったため、このソリューションはほとんどのプロジェクトで見られます。のスクリプトはpackage.json、テストランナーや開発サーバーの起動などの単純な目的でのみ使用されます。
ロバートジャックは

15

私は答えはそうだと思います:あなたはできません。(または、少なくとも:すべきではありません)。これは、Webpackが行うことになっていることではありません。Webpackはバンドラーであり、他のタスクには使用しないでください(この場合、静的ファイルのコピーは別のタスクです)。このようなタスクを実行するには、GruntやGulpなどのツールを使用する必要があります。統合することは非常に一般的である兵卒タスクとしてのWebPACKをかなどガルプタスク。どちらにも、説明したようなファイルのコピーに役立つ他のタスクがあります。たとえば、grunt-contrib-copyまたは gulp-copyます。

他のアセット(以外index.html)の場合は、Webpackにバンドルするだけです(それがまさにWebpackの目的です)。たとえば、var image = require('assets/my_image.png');。しかし、私はあなたindex.htmlがバンドルの一部である必要はないので、それはバンドラーの仕事ではないと思います。


59
私は正確にwebpackに行ったので、うなり声やgulpを使う必要はありませんでした。他の選択肢はありますか?gulpを使用する必要がある場合、なぜwebpackを使用する必要があるのですか?
SuperUberDuper 2015

4
問題は逆さまです。gruntやgulpを使用できるのに、なぜwebpackを使用する必要があるのですか?それらは非常に優れたタスク/ビルドシステムです。Webpack(またはbrowserifyまたはr.js)は、多くのJSファイル(およびその他のリソース)を1つの大きな(または複数の)JavaScriptバンドルにバンドルするために使用できるツールです。ジョブに適したツールを使用する必要があります。繰り返しになりますが、webpack、browserify、またはその他のバンドラーをgruntまたはgulpから実行することは非常に一般的です。
Brodie Garnet、

1
webpackがそれを行う方法はたくさんあります。file-loader基本的にファイル/画像を出力ディレクトリにコピーし、必要なときにURLを提供するものを使用できますvar url = require('myFile');。言ったように、バンドルは1つまたは複数のファイルにすることができます。
Brodie Garnet

1
親ビルドプロセスとしてbrocolliを使用する可能性があります
SuperUberDuper '22

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によってタグが挿入される点が異なります。縮小およびその他のオプションを構成でき、githubに文書化されています。



3

index.htmlだけを取得したい場合に@hobbeshunterの回答を拡張するには、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他のものがwebpackのconfファイルで指定されていない場合、バンドルのデフォルトの出力名のようです。それは良い長期的な解決策ではないと思いますが、webpackの仕組みを理解するのに役立つことを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.