Webpack æä¾äº Node.js APIï¼å¯ä»¥å¨ Node.js è¿è¡æ¶ä¸ç´æ¥ä½¿ç¨ã
å½ä½ éè¦èªå®ä¹æå»ºæå¼åæµç¨æ¶ï¼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 compiler è¿è¡æ¶è¢«æ§è¡:
const webpack = require('webpack');
webpack({}, (err, stats) => {
if (err || stats.hasErrors()) {
// ...
}
// å¤ç宿
});å¦æä½ ä¸å webpack ä¼ å
¥å¯æ§è¡çåè°å½æ°ï¼
å®ä¼è¿åä¸ä¸ª webpack Compiler å®ä¾ã
ä½ å¯ä»¥éè¿æå¨æ§è¡å®æè
为å®çæå»ºæ¶æ·»å ä¸ä¸ªçå¬å¨ï¼
å°±å CLI 类似ãCompiler å®ä¾æä¾äºä»¥ä¸æ¹æ³:
.run(callback).watch(watchOptions, handler)é常æ
åµä¸ï¼ä»
ä¼å建ä¸ä¸ªä¸»è¦ Compiler å®ä¾ï¼
è½ç¶å¯ä»¥å建ä¸äºå compiler æ¥ä»£çå°ç¹å®ä»»å¡ã
Compiler åºæ¬ä¸åªæ¯æ§è¡æä½é度çåè½ï¼ä»¥ç»´æçå½å¨æè¿è¡çåè½ã
å®å°ææçå è½½ãæå
ååå
¥å·¥ä½ï¼
é½å§æå°æ³¨åè¿çæä»¶ä¸ã
Compiler å®ä¾ä¸ç hooks 屿§ï¼ç¨äºå°ä¸ä¸ªæä»¶æ³¨å
å° Compiler ççå½å¨æä¸çææé©åäºä»¶ä¸ã
webpack 使ç¨
WebpackOptionsDefaulter
å WebpackOptionsApply
æ¥é
ç½® Compiler å®ä¾ä»¥åææå
ç½®æä»¶ã
ä½¿ç¨ run æ¹æ³å¯å¨ææç¼è¯å·¥ä½ã
宿ä¹åï¼æ§è¡ä¼ å
¥çç callback 彿°ã
æç»è®°å½ä¸æ¥çæ¦æ¬ä¿¡æ¯ï¼statsï¼åé误ï¼errorsï¼ï¼é½åºå¨è¿ä¸ª 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(
{
// 示ä¾
aggregateTimeout: 300,
poll: undefined,
},
(err, stats) => {
// è¿éæå° watch/build ç»æ...
console.log(stats);
}
);Watching é
ç½®é项çç»èå¯ä»¥å¨
è¿éæ¥è¯¢ã
Watching (Close Watching)watch æ¹æ³è¿åä¸ä¸ª Watching å®ä¾ï¼è¯¥å®ä¾ä¼æ´é²ä¸ä¸ª .close(callback) æ¹æ³ã
è°ç¨è¯¥æ¹æ³å°ä¼ç»æçå¬:
watching.close((closeErr) => {
console.log('Watching Ended.');
});Watchingä½¿ç¨ watching.invalidateï¼ä½ å¯ä»¥æå¨ä½¿å½åç¼è¯å¾ªç¯ï¼compiling roundï¼æ æï¼
èä¸ä¼åæ¢çå¬è¿ç¨ï¼processï¼ï¼
watching.invalidate();stats 对象ä¼è¢«ä½ä¸º webpack() åè°å½æ°ç第äºä¸ªåæ°ä¼ éï¼
å¯ä»¥éè¿å®è·åå°ä»£ç ç¼è¯è¿ç¨ä¸çæç¨ä¿¡æ¯ï¼
å
æ¬ï¼
webpack CLI æ£æ¯åºäºè¿äºä¿¡æ¯å¨æ§å¶å° å±ç¤ºåå¥½çæ ¼å¼è¾åºã
stats 对象æ´é²äºä»¥ä¸æ¹æ³:
å¯ä»¥ç¨æ¥æ£æ¥ç¼è¯ææ¯å¦æé误ï¼
è¿åå¼ä¸º true æ falseã
å¯ä»¥ç¨æ¥æ£æ¥ç¼è¯ææ¯å¦æè¦åï¼
è¿åå¼ä¸º true æ falseã
以 JSON 对象形å¼è¿åç¼è¯ä¿¡æ¯ã
options å¯ä»¥æ¯ä¸ä¸ªå符串ï¼é¢è®¾å¼ï¼ææ¯é¢ç²åæ§å¶ç对象:
stats.toJson('minimal');stats.toJson({
assets: false,
hash: true,
});ææå¯ç¨çé ç½®é项åé¢è®¾å¼é½å¯æ¥è¯¢ stats ææ¡£ã
è¿éæ
è¯¥å½æ°è¾åºç
示ä¾ã
ä»¥æ ¼å¼åçå符串形å¼è¿åæè¿°ç¼è¯ä¿¡æ¯ ï¼ç±»ä¼¼ 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 ç Node.js API ç options åæ°ï¼
è¯¥åæ°ç±æ¯ç±å¤ä¸ªé
置对象ææçæ°ç»ï¼webpack ä¼ç¸åºå°å建å¤ä¸ª compiler å®ä¾ï¼
å¹¶ä¸å¨ææ compiler æ§è¡å®æ¯åè°ç¨ 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 ä½¿ç¨æ®éæä»¶ç³»ç»æ¥è¯»åæä»¶å¹¶å°æä»¶åå
¥ç£çã
使¯ï¼è¿å¯ä»¥ä½¿ç¨ä¸åç±»åçæä»¶ç³»ç»ï¼å
å(memory), webDAV çï¼æ¥æ´æ¹è¾å
¥æè¾åºè¡ä¸ºã
为äºå®ç°è¿ä¸ç¹ï¼
å¯ä»¥æ¹å inputFileSystem æ outputFileSystemã
ä¾å¦ï¼å¯ä»¥ä½¿ç¨ memfs æ¿æ¢é»è®¤ç outputFileSystemï¼
以尿件åå
¥å°å
åä¸ï¼
è䏿¯åå
¥å°ç£ç:
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) => {
// ä¹å读åè¾åº:
const content = fs.readFileSync('...');
compiler.close((closeErr) => {
// ...
});
});å¼å¾ä¸æçæ¯ï¼è¢« webpack-dev-server åä¼å¤å ¶ä»å ä¾èµç webpack-dev-middleware å°±æ¯éè¿è¿ç§æ¹å¼ï¼ å°ä½ çæä»¶ç¥ç§å°éèèµ·æ¥ï¼ä½å´ä»ç¶å¯ä»¥ç¨å®ä»¬ä¸ºæµè§å¨æä¾æå¡ï¼