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 모ëì ìì²í©ëë¤.
const webpack = require('webpack');ëë ES2015를 ì í¸íë¤ë©´ ìëì²ë¼ ì¬ì©íì¸ì.
import webpack from 'webpack';ê°ì ¸ì¨ webpack í¨ìë webpack ì¤ì ê°ì²´ë¥¼ ì ê³µíë©° ì½ë°± í¨ìê° ì ê³µëë©´ webpack ì»´íì¼ë¬ë¥¼ ì¤íí©ëë¤.
const webpack = require('webpack');
webpack({}, (err, stats) => {
if (err || stats.hasErrors()) {
// ...
}
// íë¡ì¸ì± ìë£
});webpack ë¬ë í¨ìì ì½ë°±ì ì ë¬íì§ ìì¼ë©´ webpack Compiler ì¸ì¤í´ì¤ë¥¼ ë°íí©ëë¤.
ì´ ì¸ì¤í´ì¤ë¥¼ ì¬ì©íì¬ webpack ë¬ë를 ìëì¼ë¡ í¸ë¦¬ê±° íê±°ë, ë¹ëíê³ ë³ê²½ ì¬íì ê°ìí ì ììµëë¤.
CLIì ë¹ì·í©ëë¤.
Compiler ì¸ì¤í´ì¤ë ë¤ì ë©ìë를 ì ê³µí©ëë¤.
.run(callback).watch(watchOptions, handler)í¹ì ìì
ì ììí기 ìí´ ìì ì»´íì¼ë¬ë¥¼ ìì±í ì ìì§ë§,
ì¼ë°ì ì¼ë¡ ë§ì¤í° 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 ë¬ë를 í¸ë¦¬ê±° íì§ë§, ê³§ì´ì´ ë³ê²½ ì¬íì ê°ìí©ëë¤ (webpack --watch CLIì ì ì¬í©ëë¤).
webpackì´ ë³ê²½ì¬íì ê°ì§íë ì¦ì ë¤ì ì¤íí©ëë¤.
Watching ì¸ì¤í´ì¤ë¥¼ ë°íí©ëë¤.
watch(watchOptions, callback);const webpack = require('webpack');
const compiler = webpack({
// ...
});
const watching = compiler.watch(
{
// ìì
aggregateTimeout: 300,
poll: undefined,
},
(err, stats) => {
// watch/build 결과를 ì¬ê¸°ì ì¶ë ¥...
console.log(stats);
}
);Watching ìµì
ì
ì¬ê¸°ì ìì¸í ì¤ëª
ëì´ ììµëë¤.
Watchingwatch ë©ìëë .close(callback) ë©ìë를 ë
¸ì¶íë Watching ì¸ì¤í´ì¤ë¥¼ ë°íí©ëë¤.
ì´ ë©ìë를 í¸ì¶íë©´ ê°ìê° ì¢
ë£ë©ëë¤.
watching.close((closeErr) => {
console.log('Watching Ended.');
});Watchingwatching.invalidate를 ì¬ì©íë©´ ê°ì íë¡ì¸ì¤ë¥¼ ì¤ì§íì§ ìê³
íì¬ ì»´íì¼ ë¼ì´ë를 ìëì¼ë¡ 무í¨íí ì ììµëë¤.
watching.invalidate();webpack() callbackì ë ë²ì§¸ ì¸ìë¡ ì ë¬ëë stats ê°ì²´ë
ì½ë ì»´íì¼ íë¡ì¸ì¤ì ëí ì¢ì ì ë³´ ìì¤ì
ëë¤.
ì¬ê¸°ìë ë¤ìì´ í¬í¨ë©ëë¤.
webpack CLIë ì´ ì 보를 ì¬ì©íì¬ ë³´ê¸° ì¢ì íìì¼ë¡ ì¬ì©ìì ì½ìì ì¶ë ¥ì íìí©ëë¤.
ì´ stats ê°ì²´ë ë¤ì ë©ìë를 ë
¸ì¶í©ëë¤.
ì»´íì¼íë ëì ì¤ë¥ê° ììëì§ íì¸íë ë° ì¬ì©í ì ììµëë¤.
true ëë false를 ë°íí©ëë¤.
ì»´íì¼íë ëì ê²½ê³ ê° ììëì§ íì¸íë ë° ì¬ì©í ì ììµëë¤.
true ëë false를 ë°íí©ëë¤.
ì»´íì¼ ì 보를 JSON ê°ì²´ë¡ ë°íí©ëë¤.
optionsë 문ìì´(ì¬ì ì¤ì ) ëë ë³´ë¤ ì¸ë¶íë ì ì´ë¥¼ ìí ê°ì²´ì¼ ì ììµëë¤.
stats.toJson('minimal');stats.toJson({
assets: false,
hash: true,
});ì¬ì© ê°ë¥í 모ë ìµì ê³¼ ì¬ì ì¤ì ì íµê³ 문ìì ì¤ëª ëì´ ììµëë¤.
ë¤ìì ì´ í¨ìì ì¶ë ¥ ììì ëë¤.
ì»´íì¼ ì ë³´ì íìíë 문ìì´ì ë°íí©ëë¤. (CLI ì¶ë ¥ê³¼ ì ì¬í©ëë¤.)
ìµì
ì stats.toJson(options)ê³¼ ëì¼íì§ë§ í ê°ì§ ì¶ê° ì¬íì´ ììµëë¤.
stats.toString({
// ì½ì ìì ì¶ê°
colors: true,
});ë¤ìì stats.toString() ì¬ì©ë²ì ììì
ëë¤.
const webpack = require('webpack');
webpack(
{
// ...
},
(err, stats) => {
if (err) {
console.error(err);
return;
}
console.log(
stats.toString({
chunks: false, // ë¹ë를 í¨ì¬ ì¡°ì©íê² ë§ëëë¤.
colors: true, // ì½ìì ììì íìí©ëë¤.
})
);
}
);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');
}
);ì¤ë¥ë¥¼ ì ì²ë¦¬íë ¤ë©´ ë¤ì ì¸ ê°ì§ ì íì ì¤ë¥ë¥¼ ê³ ë ¤í´ì¼ í©ëë¤.
ë¤ìì ì´ ëª¨ë ìì ì ìííë ììì ëë¤.
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({
/* ìµì
*/
});
compiler.outputFileSystem = fs;
compiler.run((err, stats) => {
// ì¶ë ¥ ëì¤ì ì½ê¸°
const content = fs.readFileSync('...');
compiler.close((closeErr) => {
// ...
});
});ì´ê²ì´ webpack-dev-serverì ë¤ë¥¸ ì¬ë¬ í¨í¤ì§ìì ì¬ì©íë webpack-dev-middlewareê° íì¼ì ì ë¹íê² ì¨ê¸°ë©´ìë ë¸ë¼ì°ì ê¹ì§ ê³ì ì ê³µíë ë°©ë²ì ëë¤!