ãããã£ãŠããã®èšäºã§ã¯webpackèªäœã«ã€ããŠç°¡åã«èª¬æãããã©ã°ã€ã³ã®éçºã«ã€ããŠè©³ãã説æããŸãã

1. Webpackã«ã€ããŠç°¡åã«
人æ°ã®ããgruntãgulpãªã©ã®ãã«ãã·ã¹ãã çšã«å€æ°ã®è£å©ã©ã€ãã©ãªãèšè¿°ãããŠããŸãããwebpackã¯çŸæç¹ã§ã¯ãã®ãããªè±å¯ããèªã£ãŠããŸãããå¿ èŠãªã©ã€ãã©ãªã䜿çšã§ããããšã¯çŽ æŽãããããšã§ãã ãããžã§ã¯ãã«webpackãå®è£ ããããšã決ããããæ¢æã®ãœãªã¥ãŒã·ã§ã³ããªãå Žåã解決æ¹æ³ã¯1ã€ãããããŸãã-èªåã§æžããŠãã ããã
ããã§ãwebpackãšã¯äœã§ããããã®æ©èœã¯äœã§ãããããã¯ã©ã®ããã«æ©èœããŸããïŒ
éçºè èªèº«ãWebpackãé 眮ããŠããããïŒ http://webpack.github.io ïŒãWebpackã¯ã¢ãžã¥ãŒã«ãã³ãã©ãŒã§ãã

ç®±ããåºããŠãAMDãCommonJSãããã³ES6ã¢ãžã¥ãŒã«ããµããŒãããŸããwebpack-dev-serverã¢ããªã³ã«å®è£ ãããsocket.ioãä»ããŠåäœããã©ã€ãreload'aã®å¯èœæ§ããããŸãã ã€ãŸãããœãŒã¹ãã¡ã€ã«ã«å€æŽãå ããåŸãæ¯åãã«ãã³ãã³ããå床å®è¡ããå¿ èŠã¯ãããŸããã
ãŸããwebpackã®èšå®ã¯ããªãã·ã³ãã«ã§ãgulpã»ã©éæã§ã¯ãããŸããããç°¡æœã§æŽç·ŽãããŠããŸãã
çšèªïŒ
2.ããŒããŒãšãã©ã°ã€ã³
ããŒããŒã¯ããã¡ã€ã«ã®ããŠã³ããŒããåŠçãå€æã«äœ¿çšããã匷åãªããŒã«ã§ãã ã€ãŸã ãããžã§ã¯ãã§ãããšãã°ããã¹ã€ãsassãcoffeeães6ãªã©ã®ãã¯ãããžãŒã䜿çšããŠããå ŽåããŸãã¯svgã倧ããããŠå§çž®ããå¿ èŠãããå Žå-åŠçãå€æãçž®å°ã®ãã¹ãŠã®ã¿ã¹ã¯ã¯ããŒããŒã«ãã£ãŠè§£æ±ºãããŸãã ãããã®å€ãã¯ãã§ã«æžãããŠããŸã ã ããã§èŠã€ããããšãã§ããŸãã
ããŒããŒã®äœæã¯ç°¡åã§ãã ãããè¡ãããã«ããããžã§ã¯ãã®å ¬åŒãŠã§ããµã€ãã«å¥ã®ã»ã¯ã·ã§ã³ããããŸã- ããŒããŒãæžãæ¹æ³ããããŠäžè¬ã«ãã³ãŒãã®æåã®è¡ã§ããããã©ãã»ã©ç°¡åãããã«ç解ã§ããŸãïŒ
// Identity loader module.exports = function(source) { return source; };
// Identity loader with SourceMap support module.exports = function(source, map) { this.callback(null, source, map); };
Loaderã¯module.exportsé¢æ°ã§ããã¡ã€ã«ã®å 容ãå ¥åãšããŠåãåããåŠçã®çµæãè¿ããŸãããŸããæ§æã«å¿ èŠãªå±æ§ãååšããå Žåãsourcemapãè¿ãããšãã§ããŸãã
çŸåšã®ã³ã³ããã¹ããè¿ããšãé£éã䜿çšããããšãå¯èœã«ãªããŸãã ãããã£ãŠãããããã1ã€ã®ã¿ã¹ã¯ã®ã¿ãå®è¡ããå¿ èŠããããŸããWebpackéçºè ã¯ãåã¹ãããã«åå¥ã®ããŒããŒãäœæããããšããå§ãããŸãã äžè¬ã«ãããã¯åã¢ãžã¥ãŒã«ãã«ãã»ã«åãããŠããå Žåã®äžè¬çãªã¢ãžã¥ãŒã«ã€ããªãã®ãŒã§ãããããã«ããããããæäœããŠãããã°ãå®è¡ããã®ãã¯ããã«ç°¡åã«ãªããŸãã
ãã©ã°ã€ã³ã¯ãã³ã³ãã€ã©ãŒãšãã1ã€ã®ãã©ã¡ãŒã¿ãŒã®ã¿ãæã€applyã¡ãœãããæã€ãªããžã§ã¯ãã§ãã ãããä»ããŠãwebpack'aãã³ã³ãã€ã«ããããŸããŸãªæ®µéãšéä¿¡ã§ããŸãã å¿ èŠãªå€æãå®è¡ããŸããããŸããŸãªã¿ã€ãã®ãã©ã°ã€ã³ã€ã³ã¿ãŒãã§ã€ã¹ããããŸããäŸãšããŠã次ã®ã³ãŒããå ¬åŒWebãµã€ãã§æäŸãããŠããŸãã
compiler.plugin("compile", function(params) { // Just print a text console.log("Compiling..."); });
ãããžã§ã¯ãããã«ãããã¿ã¹ã¯ãéå§ãããšãã¿ãŒããã«ã§ãçŸåšã®ãã«ãããã»ã¹ã«é¢ããã¡ãã»ãŒãžããŸãã¯å¿ èŠãªã©ã€ãã©ãªã®äžè¶³ãåå ã®ãšã©ãŒããŸãã¯ã³ãŒãæ§æã®åé¡ã«é¢é£ãããšã©ãŒã衚瀺ãããŸãã
webpackã䜿çšããŠãã«ãããã»ã¹ãéå§ãããšãã³ãŒããæ©èœããã¿ãŒããã«ã«ãCompiling ...ããšè¡šç€ºãããŸãã
å€èŠäžãããã¯ç解ã§ããä»çµã¿ã§ããããã®ãããªäœæ¥ã®äŸã¯ã»ãšãã©ãªããããã¥ã¡ã³ãã«ã¯å®éã«ã¯äŸããããŸããã
éšåçã«ãããã¯èšäºãæžãããã«ä¿ããŸããã ããŒããŒã»ã¯ã·ã§ã³ã®èšè¿°æ¹æ³ã«ã¯ããŒããŒã®å€ãã®äŸããããŸããããã©ã°ã€ã³ã»ã¯ã·ã§ã³ã®èšè¿°æ¹æ³ã¯å ¬åŒãµã€ãããç¡æéã«é衚瀺ã«ãªã£ãŠããŸãïŒå Žåã«ãã£ãŠã¯å®å šã«åé€ãããŸãïŒã æŠããŠãããããã€ã³ã¿ãŒãã§ã€ã¹ã¿ã€ãã®äœæ¥ã®ãªã¹ããšããã¹ã説æïŒ upd ïŒçŸåšããã®ã»ã¯ã·ã§ã³ã¯é衚瀺ã«ãªã£ãŠããŸãïŒãšããã§ã«äœæããããã©ã°ã€ã³ã®ã³ãŒãã調æ»ããæ©èœã®ã¿ãããããããã©ã®ããã«äœ¿çšããåäœãããã確èªã§ããŸã
ãã¡ãããwebpackéçºè ããã®ã»ã¯ã·ã§ã³ãããã«æäŸããããšã¯ééããããŸããããçŸåšã®åé¡ã解決ããããã«ãã®ãããã¯ãä»ããç解ããããšããã»ã¯ã·ã§ã³ãéããšãèªåèªèº«ã®ããã«æ°ãããã®ãèŠã€ããããããå®å šã«äœæ¥ãåèããŸããã©ã°ã€ã³ã
3.åé¡ã®è§£æ±ºäŸ-svgã¹ãã©ã€ãã®æ¥ç
Webpackã¯æ°å¹ŽåããååšããŠããŸãããå€ãã®äººããããžã§ã¯ããæäœããããã®ã¡ã€ã³ããŒã«ãšããŠäœ¿çšããããšãæ¢ããŠããŠããŸããããã®æ©èœã¯çŽ æŽããããã¢ãžã¥ãŒã«ã®çµã¿ç«ãŠãšæäœã®äž¡æ¹ã®ããŒã«ãããã«çœ®ãæããããšãã§ããŸãã
ãããŠããŠã§ãããã¯ã®ã¡ã«ããã¯ã®ããã®ãã¹ãŠã®ã¿ã¹ã¯ãšãã©ã°ã€ã³ãšäžç·ã«ããªãããã¡ã«ãªããããžã§ã¯ããæžãçŽãã®ã¯15åã§ã¯ãããŸããã ç¹ã«ããããŸã§ã®ãšãããå€ãå®è¡äžã®ãã«ãã·ã¹ãã ãèªãããšãã§ããwebpackã®äžã«ã¯å€ãã®ã©ã€ãã©ãªããªãããšãèæ ®ããŠãã ããã
ããã«æ±ºããŠããããžã§ã¯ãã®æŽæ°ãéå§ãããšããŸãã ãããŠããã®éçšã§ãäžèšã®åé¡ã«åºãããå¯èœæ§ããããŸããwebpack'eã«ã¯ã以åãããžã§ã¯ãã«ãããå®å šã«æ©èœããŠããã¿ã¹ã¯ã®åæ§ã®ã¡ã«ããºã ãè€è£œãŸãã¯å®è¡ããããŒã«ãååšããªãå ŽåããããŸãã
ããã¯grunt-svgstoreã§çºçããŸãã -å¿ èŠãªãã£ã¬ã¯ããªãããã¹ãŠã®svgã1ã€ã®ã¹ãã©ã€ãã«åéãã use xlinkïŒhref =âïŒlogoâã䜿çšããŠå¿ èŠãªsvgãããŒãžã®é©åãªå Žæã«æ¥ç¶ããã©ã€ãã©ãª
ããã¯ãã¹ãã©ã€ããä»ããŠsvgãæäœããããã®éåžžã«äŸ¿å©ãªã¡ã«ããºã ã§ããã移è¡äžã«ãã®æ©èœã倱ããããããŸããã
gulpã®äžã«ãåæ§ã®ãœãªã¥ãŒã·ã§ã³ããããŸãããwebpackã®äžã§èŠã€ããããšã¯ã§ããŸããã§ããã
ãããåé¡ã§ãããWebpackçšã®ãã©ã°ã€ã³ãäœæããsvgã¹ãã©ã€ããæ¥çããããã®äžè¬çãªä»çµã¿ãç¶æããå Žåã«ãã£ãŠã¯ããã€ãã®æ°ããæ©èœãè¿œå ããããšã§ãã
4.ã³ãŒããæžãããã»ã¹
å·çãå§ããããã«ã¯ã誰ãã®ã³ãŒããçãã§ãããç§ãã¡ã®ã³ãŒããšããŠåœè£ ããããšã¯ç§ãã¡ã®ç®æšã§ã¯ãªãããšãç解ããããšãéèŠã§ããããããåžžã«éãããŠããæéãèãããšãè»èŒªãåçºæããæ°ããããŸããã
ãããã£ãŠãããã§ãã®æ¹æ³ã䜿çšããŸããgrunt-svgstoreã©ã€ãã©ãªã³ãŒããããŒã¹ãšããŠãWebpackã®ãã©ã°ã€ã³ãšããŠæ©èœããããã«å°ãå€æŽããããã€ãã®æ°æ©èœãè¿œå ããŸããäžæ¹ããã©ã°ã€ã³ã³ãŒãã®æäžéšã§ã¯ãå šäœã瀺ããŸãã
/** * Webpack SVGstore plugin based on grunt-svg-store * @see https://github.com/FWeinb/grunt-svgstore/blob/master/tasks/svgstore.js */
ãããã£ãŠãç§ãã¡ã¯ã ããã欺ããããäžå¹³ãèšã£ãŠsvgstoreãæžããéçºè ãæããããããŸããã äžè¬ã«ããã®ãã©ã°ã€ã³ã¯ç¹å®ã®ãããžã§ã¯ãã§1åã ã䜿çšããããã§ã¯ãªããnpmã§ã¬ã€ã¢ãŠãããŠæåããçµæããªãŒãã³ãœãŒã¹ã³ãã¥ããã£ã«è²¢ç®ããããã«åãäžããŸããã
ã¿ã¹ã¯ã®ã³ãŒãããã©ã°ã€ã³ã«å€æããã«ã¯ãå®éã«ã³ãŒããããã¹ãŠã®ããªã声ãåé€ããsvgãã¹ãã©ã€ãã«çŽæ¥çµã¿ç«ãŠãŠæ¥çããããã®æ¢è£œã®ã¡ã«ããºã ã®ã¿ãä¿æããŸãã ãããããã®åŸãä¿®æ£ããå¿ èŠãããå€ãã®åé¡ã«ééããŸãã
5.äºæããªãåé¡
1ïŒã¹ãã©ã€ãã倧ãããããããçž®å°ãè¿œå ããå¿ èŠããããŸãã
æåã«èŠã€ãã£ãã®ã¯ãwebpackã®äžã«ããã¹ãŠã®svgãé§åã§ããsvgoã®ããŒãã®äžã«æ¢è£œã®svgããŒããŒïŒhttps://github.com/rpominov/svgo-loaderïŒãããããšã§ãã
ãã©ã°ã€ã³ã§svgoã¢ãžã¥ãŒã«ãæ¥ç¶ããŸãã
var SVGO = require('svgo');
ãããŠãsvgã®çž®å°é¢æ°ãè¿œå ããŸãã
SvgStore.prototype.svgMin = function(file, loop) { var svgo = new SVGO(); var source = file; var i; function svgoCallback(result) { source = result.data; } // optimize loop for (i = 1; i <= loop; i++) { svgo.optimize(source, svgoCallback); } return source; };
ãããã¡ã€ã«ããäžéšã®svgãæãªãããå¯èœæ§ããããŸãããŸããæ°ããsvgãè¿œå ããããã»ã¹ã§äººä»¶è²»ãæå°éã«ãªãããã«åªããŠããŸãã ãããå®çŸããã«ã¯ã minïŒtrue / falseãã©ã°ã€ã³ã«ãªãã·ã§ã³ãè¿œå ããŸããããã«ãããç¹å®ã®svg'shkiãçž®å°ãããããã¹ãŠã®svgããã®ãŸãŸã®åœ¢ã§æ£ç¢ºã«åéãããã©ãããããããŸãã
ã¹ãã©ã€ãã®ãµã€ãºã¯éèŠã§ããããµã€ãºãå°ããã»ã©èªç¶ã«åªããŠããŸãã ãããããã¹ãŠã®çž®å°ãå®å šã«æåŠããããšã¯ããŸãæ£ãããªããããsvgã®å éšãã£ã¬ã¯ããªãè¿œå ããããšã«ããŸããã ããšãã°ãsvgã䜿çšãããã£ã¬ã¯ããªãžã®ãã¹ïŒ
/ã¢ããª/ã¢ã»ãã/ svg
ãããŠããµããã£ã¬ã¯ããªã«çž®å°ãããsvgãå ¥ããŸãïŒ
/ã¢ããª/ã¢ã»ãã/ svg /å
ãããã£ãŠãå éšã®minãã£ã¬ã¯ããªã«ããsvgã®ã¿ãçž®å°ããè€æ°ã®ã¢ã€ã³ã³ãç Žæããå Žåã¯ãã¹ãŠã®çž®å°ãæåŠããŸããå¿ èŠã¯ãããŸããã
ãã¥ã¢ã³ã¹ããããŸããããã¯ãé¢æ°ã2ã€ã®ãã©ã¡ãŒã¿ãŒãåãããã®1ã€ãsvgã®å 容ã§ããã2çªç®ã-ã«ãŒãã§ããããã§ãã
å®éãsvgã®å©ç¹ã®1ã€ã¯ãCSSã䜿çšããŠç»åã®ã¹ã¿ã€ã«ãå¶åŸ¡ããè²ãç·å¹ ãªã©ãå€æŽã§ããããšã§ãã
ããããæåã®å®è¡åŸãsvgoã¯ã€ã³ã©ã€ã³ã¹ã¿ã€ã«ãåé€ããŸããããã®ãããCSSã䜿çšããŠã¹ã¿ã€ã«ãåå®çŸ©ããããšã¯ã§ããŸããã ããšãã°ãè²ããããŒã«å€æŽããå¿ èŠãããå Žåãããã¯å Žåã«ãã£ãŠã¯æ©èœããŸããã ãã ãã2åå®è¡ãããšããããã®å±æ§ã¯æ¶å»ãããåå®çŸ©ãæ©èœãå§ããŸãã
åœç¶ã誰ãããããå¿ èŠãšããããã§ã¯ãªããããããã©ã«ãã§ã¯ã«ãŒããªãã·ã§ã³ã¯1ïŒ1åã®å®è¡ïŒã«çãããªããŸãããsvgoãä»ããŠä»»æã®æ°ã®å®è¡ãèšå®ã§ããŸãã
2ïŒãã©ã°ã€ã³ã䜿çšããŠè€æ°ã®ã¹ãã©ã€ããåéããå¿ èŠããããŸãã ããã¯ãããªãåå§çãªããªãã£ãã¯ã¹ã䜿çšããŠå®è£ ãããããŸãçŸãããªãïŒãã ãæ©èœããïŒã³ãŒãã§ã¯ãªãããªãã·ã§ã³ã¯ãã£ã«ã¿ãŒãšåŒã°ãã次ã®ããã«æ©èœããŸãã
1. 'except-name'-å€ãexcept-ã§å§ãŸãå Žåããã®å Žåã¯nameã§å§ãŸããã®ãé€ãããã¹ãŠã®svgãã¹ãã©ã€ãã«åéãããŸã
2. 'name'-svgã¯ã¹ãã©ã€ãã«åéãããŸããã¹ãã©ã€ãã¯æå®ãããè¡ïŒãã®å Žåã¯nameïŒã§å§ãŸããŸãã
output: [ { filter: 'Logo-', sprite: 'svg/[hash].logo_sprite.svg' }, { filter: 'except-Logo-', sprite: 'svg/[hash].sprite.svg' } ]
3. 'all'-äœãå ±æããå¿ èŠããªãããã¹ãŠã®svgãé 眮ãããåºåã§1ã€ã®ã¹ãã©ã€ãã®ã¿ãååŸããå Žåã
output: [ { filter: 'all', sprite: 'svg/[hash].sprite.svg' } ]
ãã£ã«ã¿ãŒã«å ããŠããã¹ãŠã®ã¢ã»ããã移åãããã£ã¬ã¯ããªã瀺ãã[hash]ãªãã·ã§ã³ãè¿œå ãããŸããã ããã·ã¥æ¹æ³èªäœã§ã¯ãåã³èªè»¢è»ãçºæããŸããã§ããããæå·ã¢ãžã¥ãŒã«ã䜿çšããæãæšæºçãªããã·ã¥æ¹æ³ãæ¡çšããŸããã
Name.replace('[hash]', crypto.createHash('md5').update(source).digest('hex'))
åœåãåéãããã¹ãã©ã€ãã«ããã·ã¥ãè¿œå ããããšã¯èšç»ãããŠããŸããã§ããããªããªããwebpackããã®ãããªããšãè¡ãããã«æãããç§ãã¡ã®ã¿ã¹ã¯ã¯ãããã·ã¥ãè¿œå ããåã«ã³ã³ãã€ã«ãããã¹ãã©ã€ããã¹ãªããããããšã§ãããæ®ãã¯ã³ã¬ã¯ã¿ãŒã«ãã£ãŠè¡ãããããã§ã ããããæ®å¿µãªããããããæ©èœãããã®ã¯æ©èœããªãã£ãã®ã§ããã©ã°ã€ã³å ã«ããã·ã¥ãè¿œå ããŸãã
3ïŒå¥ã®å€§ããªåé¡ã¯ãåéãããã¹ãã©ã€ãããããã§ã¹ãã«è¿œå ããããšã§ãã
ãããã§ã¹ãã¯ãã¢ã»ããã®ååãšåéãããååãšã®å¯Ÿå¿ãããã·ã¥ãšãã¹ã§ç€ºãJSONã§ãã åã¢ã»ã³ããªã®ããã·ã¥ãããããªããããããã¯ã¢ã»ãããæ¥ç¶ããããã«è¡ãããŸãã ãããã§ã¹ãã䜿çšããŠã䟿å©ãªãªã³ã¯ããŒãã«ãååŸããŸãã ãã®ããã«ãwebpackã®ãããã§ã¹ããã©ã°ã€ã³ã䜿çšããŸã ã
ãã®ãããã§ã¹ãã«ããããããžã§ã¯ãã®è£åŽã¯ãæ°ãããã«ãåŸã«æ¥ç¶ããå¿ èŠããããã®ãç解ããŸãã
ãããŠãããã§ç§ãã¡ãééãããã1ã€ã®åé¡ããããŸããã³ã³ãã€ã©ãŒã¯2ã€ã®ãªããžã§ã¯ããæäŸãããã®ãã¡ã®1ã€ã¯ã¢ã»ããã®é åã2çªç®ã¯ã¢ãžã¥ãŒã«ã§ãã
ãããŠããã©ã°ã€ã³å ã«ã¢ã»ãããè¿œå ããåŸ
compiler.plugin('emit', function(compilation, callback) { compilation.assets[key.sprite] = { source: function() { return new Buffer(source); }, size: function() { return Buffer.byteLength(source, 'utf8'); } }; callback(); });
compiler.assetsé åã«è¡šç€ºãããŸããããã®é åã¯ãã¡ã€ã«åãšããã·ã¥ä»ãã®ãã¹ãšã®äžèŽãæäŸããŸããã
ãã®ãããmanifest-webpackãã©ã°ã€ã³ãäœæããéçºè ã¯ããã©ã°ã€ã³å ã§comiler.assetsã§ã¯ãªãcompiler.modulesã䜿çšããŸããã2çªç®ã®æ¹ãã¯ããã«è«ççã§ãã
ã€ãŸã Tobiasã ææ¡ããã³ãŒãã®äŸïŒwebpackéçºè ã®1人ïŒã«åŸã£ãŠæ°ããã¢ã»ãããè¿œå ããåŸããã®ã¢ã»ããã¯ã¢ã»ããé åã«è¡šç€ºãããŸããããã®é åã«ã¯å ã®ååãŸãã¯ãã¹ãå«ãŸããŠããªãããã䜿çšã§ããŸããã
ãã«é åãä»ããŠååã®ãã£ãŒã«ããæ¿å ¥ããŠãassetsé åã䜿çšããŠãããã§ã¹ããäœæã§ããããã«ããŸããããåãå ¥ããããŸããã§ããã ãããŠäžè¬çã«ããã®èãã¯æåŠãããŸããã
ããã«ãããæ°ããäœæããã¹ãã©ã€ãããããã§ã¹ãã«è¿œå ãããšããåé¡ãçºçããŸããããã®æ®µéã§ã¯ãæçµæ®µéã§ãã©ã°ã€ã³ãä»ããŠãã©ã°ã€ã³ãæåã§æäœããå¿ èŠããããŸãã
compiler.plugin('done', function(compilation, callback) { // code })
ãããŠãæã§fs.readFile / fs.writeFileãéããŠã¹ãã©ã€ãããããã§ã¹ãã«è¿œå ããŸããããã¯è¯ããããŸããã
6.䜿çšäŸãšå±æ
ãªã³ã¯ã䜿çšããŠãWebpackãããžã§ã¯ãã§ãã©ã°ã€ã³ãäœæããŠè©ŠããŠã¿ãããšãã§ããŸãã
å°æ¥çã«ã¯ããã©ã°ã€ã³ãæãæ±çšæ§ã®é«ããã®ã«ããã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ããäœåãªãã®ããã¹ãŠåé€ãããã¹ãã§ãã®äœæ¥ãã«ããŒããããšãèšç»ããŠããŸã-äžè¬ã«ãå°ãªããšãå¿ èŠãªãã®ãæ®ããå¯èœãªéãå®å®ããã
7.åç §
ãã©ã°ã€ã³ã®çµæã䜿çšãããã¢-motor.ruã®ãã¹ãŠã®ã¢ã€ã³ã³
ãã©ã°ã€ã³ãªããžããªïŒåé¡ãšãã«ãªã¯ãšã¹ããåŸ ã£ãŠããïŒ -github.com/lgordey/webpack-svgstore-plugin
NPMãã©ã°ã€ã³-www.npmjs.com/package/webpack-svgstore-plugin
Webpackããã¥ã¡ã³ã-webpack.github.io/docs
Webpackãªããžããª-github.com/webpack/webpack