webpackは、Node.jsランタイムで直接使用できるNode.js APIを提供します。
Node.js APIは、ビルドや開発プロセスをカスタマイズする必要がある場合に役立ちます。これは、すべてのレポートとエラー処理を手動で行う必要があり、webpackはコンパイル部分のみを行うためです。このため、stats
構成オプションは、webpack()
呼び出しでは効果がありません。
webpack Node.js APIの使用を開始するには、まずwebpackをまだインストールしていない場合はインストールしてください。
npm install --save-dev webpack
次に、Node.jsスクリプトでwebpackモジュールをrequireします。
const webpack = require('webpack');
または、ES2015を好む場合は
import webpack from 'webpack';
インポートされたwebpack
関数には、webpackの構成オブジェクトが渡され、コールバック関数が提供されている場合はwebpackコンパイラーを実行します。
const webpack = require('webpack');
webpack({}, (err, stats) => {
if (err || stats.hasErrors()) {
// ...
}
// Done processing
});
webpack
ランナー関数にコールバックを渡さない場合、webpackのCompiler
インスタンスが返されます。このインスタンスを使用すると、webpackランナーを手動でトリガーしたり、CLIと同様に、ビルドして変更を監視したりできます。Compiler
インスタンスには、次のメソッドが用意されています。
.run(callback)
.watch(watchOptions, handler)
通常、1つのマスターCompiler
インスタンスのみが作成されますが、特定のタスクを委任するために子コンパイラーを作成できます。Compiler
は、ライフサイクルを実行するために必要最小限の機能のみを実行する関数です。すべての読み込み、バンドル、および書き込み作業は、登録されたプラグインに委任します。
Compiler
インスタンスのhooks
プロパティは、Compiler
のライフサイクル内の任意のフックイベントにプラグインを登録するために使用されます。WebpackOptionsDefaulter
とWebpackOptionsApply
ユーティリティは、webpackによって、すべての組み込みプラグインを使用してCompiler
インスタンスを構成するために使用されます。
次に、run
メソッドを使用して、すべてのコンパイル作業を開始します。完了すると、指定されたcallback
関数が実行されます。統計とエラーの最終的なロギングは、このcallback
関数で行う必要があります。
Compiler
インスタンスでrun
メソッドを呼び出すことは、上記で説明したクイック実行メソッドとよく似ています。
const webpack = require('webpack');
const compiler = webpack({
// ...
});
compiler.run((err, stats) => {
// ...
compiler.close((closeErr) => {
// ...
});
});
watch
メソッドを呼び出すと、webpackランナーがトリガーされますが、その後、変更を監視します(CLI:webpack --watch
と同様)。webpackが変更を検出するとすぐに、再び実行されます。Watching
のインスタンスを返します。
watch(watchOptions, callback);
const webpack = require('webpack');
const compiler = webpack({
// ...
});
const watching = compiler.watch(
{
// Example
aggregateTimeout: 300,
poll: undefined,
},
(err, stats) => {
// Print watch/build result here...
console.log(stats);
}
);
Watching
オプションについては、こちらで詳しく説明しています。
Watching
を閉じるwatch
メソッドは、.close(callback)
メソッドを公開するWatching
インスタンスを返します。このメソッドを呼び出すと、監視が終了します。
watching.close((closeErr) => {
console.log('Watching Ended.');
});
Watching
を無効化watching.invalidate
を使用すると、監視プロセスを停止せずに、現在のコンパイルラウンドを手動で無効にできます。
watching.invalidate();
webpack()
コールバックの2番目の引数として渡されるstats
オブジェクトは、コードコンパイルプロセスに関する優れた情報源です。以下が含まれます。
webpack CLIは、この情報を使用して、コンソールに適切にフォーマットされた出力を表示します。
このstats
オブジェクトは、次のメソッドを公開します。
コンパイル中にエラーが発生したかどうかを確認するために使用できます。true
またはfalse
を返します。
コンパイル中に警告が発生したかどうかを確認するために使用できます。true
またはfalse
を返します。
コンパイル情報をJSONオブジェクトとして返します。options
は、文字列(プリセット)またはより細かく制御するためのオブジェクトにできます。
stats.toJson('minimal');
stats.toJson({
assets: false,
hash: true,
});
利用可能なすべてのオプションとプリセットは、statsのドキュメントで説明されています。
この関数の出力の例を以下に示します。
コンパイル情報のフォーマット済み文字列を返します(CLI出力と同様)。
オプションは、stats.toJson(options)
と同じですが、1つ追加があります。
stats.toString({
// Add console colors
colors: true,
});
stats.toString()
の使用例を以下に示します。
const webpack = require('webpack');
webpack(
{
// ...
},
(err, stats) => {
if (err) {
console.error(err);
return;
}
console.log(
stats.toString({
chunks: false, // Makes the build much quieter
colors: true, // Shows colors in the console
})
);
}
);
MultiCompiler
モジュールを使用すると、webpackは複数の構成を個別のコンパイラーで実行できます。webpackのNodeJS APIのoptions
パラメーターがオプションの配列である場合、webpackは個別のコンパイラーを適用し、すべてのコンパイラーが実行された後にcallback
を呼び出します。
var webpack = require('webpack');
webpack(
[
{ entry: './index1.js', output: { filename: 'bundle1.js' } },
{ entry: './index2.js', output: { filename: 'bundle2.js' } },
],
(err, stats) => {
process.stdout.write(stats.toString() + '\n');
}
);
適切なエラー処理を行うには、次の3種類のエラーを考慮する必要があります。
これらすべてを実行する例を次に示します。
const webpack = require('webpack');
webpack(
{
// ...
},
(err, stats) => {
if (err) {
console.error(err.stack || err);
if (err.details) {
console.error(err.details);
}
return;
}
const info = stats.toJson();
if (stats.hasErrors()) {
console.error(info.errors);
}
if (stats.hasWarnings()) {
console.warn(info.warnings);
}
// Log result...
}
);
デフォルトでは、webpackは通常のファイルシステムを使用してファイルを読み取り、ディスクにファイルを書き込みます。ただし、別の種類のファイルシステム(メモリ、webDAVなど)を使用して、入力または出力の動作を変更することができます。これを実現するには、inputFileSystem
またはoutputFileSystem
を変更できます。たとえば、デフォルトのoutputFileSystem
をmemfs
に置き換えて、ディスクではなくメモリにファイルを書き込むことができます。
const { createFsFromVolume, Volume } = require('memfs');
const webpack = require('webpack');
const fs = createFsFromVolume(new Volume());
const compiler = webpack({
/* options */
});
compiler.outputFileSystem = fs;
compiler.run((err, stats) => {
// Read the output later:
const content = fs.readFileSync('...');
compiler.close((closeErr) => {
// ...
});
});
これは、webpack-dev-middlewareが使用する手法であり、webpack-dev-serverや他の多くのパッケージが、ファイルを不思議に隠しながらもブラウザーに引き続き提供するために使用するものです。