ããã·ã ãœã¹ããïŒ crazymax11 ïŒ -N1.RUã®ããã³ããšã³ããªãŒãã¯ã以åã¯ç¬èªã®ã«ã¹ã¿ã ãã«ããæã£ãŠããããã€ãã®å€§ããªãããžã§ã¯ãã«Webpackãå°å ¥ããããã€ãã®ãããžã§ã¯ãã«è²¢ç®ããŸããã ããã·ã ã¯ãWebpackã䜿çšããŠå€¢ã®ãã³ãã«ãæ§ç¯ããè¿ éã«å®è¡ããæ§æãã¯ãªãŒã³ã§ç¶æãããã¢ãžã¥ãŒã«åŒã®ãŸãŸã«ãªãããã«æ§æããæ¹æ³ãç¥ã£ãŠããŸãã
解éã¯ã¬ããŒããšã¯ç°ãªããŸã-proflinksã®å€§å¹ ã«æ¹åãããããŒãžã§ã³ã§ãã ãã©ã³ã¹ã¯ãªããå šäœãéããŠãã€ãŒã¹ã¿ãŒãšãã°ã¯èšäºããã©ã°ã€ã³ããããã¡ã€ããŒããªãã·ã§ã³ããã©ã³ã¹ãã€ã©ãŒãã¹ããŒã«ãŒã®èšèã®èšŒæãåã«ã¹ããŒãã«å ¥ããããšãã§ããªããªã³ã¯ã«æ£ãã°ã£ãŠããŸãã ãã¹ãŠãåéãããšãWebpackã®ããŒãã¹ã¬ãã«ãéããŸã:-)
å žåçãªãããžã§ã¯ãã§ã®Webpackã®çµ±å
éåžžãå®è£ é åºã¯æ¬¡ã®ãšããã§ãïŒéçºè ã¯ã©ããã§Webpackã«é¢ããèšäºãèªã¿ãæ¥ç¶ããããšã決å®ãããã«ããéå§ããäœããã®æ¹æ³ã§åäœãããã¹ãŠãéå§ãããã°ããã®éwebpack-configãåäœããŸã-6ãæã1幎ã2 å°å ã§ã¯ããã¹ãŠãé 調ã§ã-倪éœãè¹ãè¶ã ãããŠãå®éã®ãŠãŒã¶ãŒãæ¥ãŸãïŒ
-ãµã€ããã¢ãã€ã«ããã€ã¹ããèªã¿èŸŒãŸããŸããã
-ãã¹ãŠãç§ãã¡ã®ããã«åããŠããŸãã ããŒã«ã«ã§ã¯ããã¹ãŠã倧äžå€«ã§ãïŒ
念ã®ãããéçºè ã¯ãã¹ãŠã®ãããã¡ã€ã«ãäœæããã¢ãã€ã«ããã€ã¹ã®å Žåã ãã³ãã«ã®ééã7 MBã§ãããŒãã«30ç§ãããããšã確èªããŸã ã ããã¯èª°ã«ãåãããéçºè ã¯åé¡ã解決ããæ¹æ³ãæ¢ãå§ããŸã-ããŒããŒãæ¥ç¶ãããããã¹ãŠã®åé¡ã解決ããéæ³ã®ãã©ã°ã€ã³ãèŠã€ããããšãã§ããŸãã å¥è·¡çã«ããã®ãããªãã©ã°ã€ã³ã¯ãããŸãã éçºè ã¯webpack-configã«ã¢ã¯ã»ã¹ããŠã€ã³ã¹ããŒã«ãè©Šã¿ãŸãããã³ãŒãè¡ãå¹²æžããŸãã
if (process.env.NODE_ENV === 'production') { config.module.rules[7].options.magic = true; }
è¡ã¯æ¬¡ã®ããã«ç¿»èš³ãããŸãïŒãæ§æãå®åçšã«ã¢ã»ã³ãã«ãããŠããå Žåã7çªç®ã®ã«ãŒã«ãåããããã«
magic = true
ãªãã·ã§ã³ãé 眮ããŸããã éçºè ã¯ããããã©ã®ããã«åŠçããã©ã®ããã«è§£æ±ºããããç¥ããŸããã ããã¯ã倢ã®æãå¿ èŠãªç¶æ³ã§ãã
倢ã®æãéããã«ã¯ïŒ
ãŸãããããäœã§ããããå®çŸ©ããŸãããã ãŸãã倢ã®ãã³ãã«ã«ã¯2ã€ã®äž»ãªç¹åŸŽããããŸãã
- ããã¯å°ãéããªããŸãã äœéãå°ãªãã»ã©ããŠãŒã¶ãŒã¯åäœããã¢ããªã±ãŒã·ã§ã³ãããéãååŸã§ããŸãã ãµã€ãã15ç§ééããªãã§ãã ããã
- ãŠãŒã¶ãŒã¯ããµã€ãã®çŸåšã®ããŒãžã衚瀺ããããã«ããŠã³ããŒãããå¿ èŠããããã®ã ããããŠã³ããŒããããã1ãã€ãã¯ããŠã³ããŒãããŸããïŒ
ãŸãããã³ãã«ã®ãµã€ãºãå°ããããã«ã¯ããŸããã®ãµã€ãºãè©äŸ¡ããå¿ èŠããããŸãã
ã¬ãŒããã³ãã«ãµã€ãº
æãäžè¬çãªãœãªã¥ãŒã·ã§ã³ã¯ã WebpackBundleAnalyzerãã©ã°ã€ã³ã§ãã ã¢ããªã±ãŒã·ã§ã³ã®ãã«ãçµ±èšãåéããåã¢ãžã¥ãŒã«ã®å Žæãšééã確èªã§ããã€ã³ã¿ã©ã¯ãã£ããªããŒãžãã¬ã³ããªã³ã°ããŸãã
![ç»å](https://habrastorage.org/getpro/habr/post_images/27a/803/6b9/27a8036b994a09b7371c567b6df6cd82.png)
ããã§ååã§ãªãå Žåã¯ã å¥ã®ãã©ã°ã€ã³ã䜿çšããŠäŸåé¢ä¿ã°ã©ããäœæã§ããŸã ã
![ç»å](https://habrastorage.org/getpro/habr/post_images/7c3/900/24a/7c390024a9d902ca99e3d00c0d8081b3.png)
ãŸãã¯åã°ã©ã ã
![ç»å](https://habrastorage.org/getpro/habr/post_images/350/14a/ec4/35014aec45623d06972bca310b3f8edf.png)
ããã§ååã§ã¯ãªããWebpackãããŒã±ãã£ã³ã°æ åœè ã«è²©å£²ãããå Žåã¯ããŠãããŒã¹å šäœãæ§ç¯ã§ããŸããåãã€ã³ãã¯ãå®å®ã®æã®ãããªã¢ãžã¥ãŒã«ã§ãã
![ç»å](https://habrastorage.org/getpro/habr/post_images/45b/a6e/2d2/45ba6e2d2daff144c69df2a43e8ef53a.png)
ãã³ãã«ã®ãµã€ãºãè©äŸ¡ããŠç£èŠããå€ãã®ããŒã«ããããŸãã ããšãã°ãWebpackæ§æã«ã¯ããã³ãã«ã®ééã倧ããããå Žåã«ã¢ã»ã³ããªãç Žæ£ãããªãã·ã§ã³ããããŸã ã Lodash 4.15ãšLodash 4.14ã®ããã«ãç°ãªãããŒãžã§ã³ã®2ã€ã®npmããã±ãŒãžãããå Žåã«ããã³ãã«ã®æ§ç¯ã劚ããéè€ããã±ãŒãžãã§ãã«ãŒwebpackãã©ã°ã€ã³ãã©ã°ã€ã³ããããŸãã
ãã³ãã«ãæžããæ¹æ³
- æãæçœãªã®ã¯ãJavaScriptãæå°åããããã«UglifyJSããã©ã°ã€ã³ããããšã§ãã
- ç¹å®ã®ãªãœãŒã¹ãå§çž®ããã³æé©åããç¹å¥ãªããŒããŒãšãã©ã°ã€ã³ã䜿çšããŸã ã ããšãã°ã cssã®å Žåã¯css-nano ãSVGãæé©åããSVGOãªã©ã
- gzip / brotliãã©ã°ã€ã³ã䜿çšããŠããã¹ãŠã®ãã¡ã€ã«ãçŽæ¥Webpackã«å§çž®ããŸãã
- ãã®ä»ã®ããŒã«ã
ããã§ããã³ãã«ããéå°ãã¹ããŒããæ¹æ³ãç解ã§ããŸãã
éå°ãæšãŠã
moment.jsã®äººæ°ã®ããäŸã§ãããèæ ®ããŠãã ãã ïŒ
import moment from 'moment'
空ã®ã¢ããªã±ãŒã·ã§ã³ãååŸããmoment.jsãšReactDOMãã€ã³ããŒããããããWebpackBundleAnalyzerã«æž¡ããšã次ã®å³ã衚瀺ãããŸãã
![ç»å](https://habrastorage.org/getpro/habr/post_images/105/e0f/833/105e0f8334a83c529077c693fda3d3de.png)
æ¥ä»ã«1æ¥ã1æéãè¿œå ããããmoment.jsã䜿çšããŠãªã³ã¯ãã15å以å ãã«é 眮ãããããã ãã§ãæ倧230 K ãã€ãã®ã³ãŒããæ¥ç¶ã§ããŸã ã ãªããããèµ·ãããã©ã®ããã«è§£æ±ºãããŸããïŒ
ç¬éã®ãã±ãŒã«èªã¿èŸŒã¿
moment.jsã«ã¯ããã±ãŒã«ãèšå®ããé¢æ°ããããŸãã
function setLocale(locale) { const localePath = 'locale/' + locale + '.js'; this._currentLocale = require(localePath); }
ã³ãŒãããããã±ãŒã«ãåçãã¹ã«æ²¿ã£ãŠããŒããããŠããããšãããããŸãã å®è¡æã«èšç®ãããŸãã Webpackã¯ã¹ããŒãã«åäœããã³ãŒãã®å®è¡äžã«ãã³ãã«ãã¯ã©ãã·ã¥ããªãããã«ããŸãããããžã§ã¯ãå ã®ãã¹ãŠã®å¯èœãªãã±ãŒã«ãèŠã€ããŠãã³ãã«ããŸãã ãããã£ãŠãã¢ããªã±ãŒã·ã§ã³ã¯éåžžã«éããªããŸãã
![ç»å](https://habrastorage.org/getpro/habr/post_images/a03/4cc/b3f/a034ccb3fc36dd03b916b0bc28acb057.png)
解決çã¯éåžžã«ç°¡åã§ããWebpackããæšæºãã©ã°ã€ã³ãååŸããŠãã誰ããå€ãã®ãã±ãŒã«ãããŠã³ããŒããããå Žåããã±ãŒã«ãå€æã§ããªãããããã·ã¢ã®ãã±ãŒã«ã䜿çšããŠãã ããããšèšããŸãã
![ç»å](https://habrastorage.org/getpro/habr/post_images/587/fe6/e38/587fe6e38333e8b482fed615e3c00ee1.png)
Webpackã¯ãã·ã¢èªã®ã¿ã䜿çšããWebpackBundleAnalyzerã¯54 Kbã衚瀺ããŸããããã¯æ¢ã«200 Kbç°¡åã§ãã
ãããã³ãŒãé€å»
次ã®æé©åã¯ã ãããã³ãŒãã®é€å»ã§ãã 次ã®ã³ãŒããæ€èšããŠãã ããã
const cond = true; if (!cond) { return false; } return true; someFunction(42);
ãã®ã³ãŒãã®ã»ãšãã©ã®è¡ã¯æçµãã³ãã«ã§ã¯å¿ èŠãããŸãã-æ¡ä»¶ä»ããããã¯ã¯å®è¡ããããæ»ãåŸã®é¢æ°ãå®è¡ãããŸããã æ®ãå¿ èŠãããã®ã¯
return true
ã ããã¯ããããã³ãŒãã®é€å»ãšãŸã£ããåãã§ãããã«ãããŒã«ã¯ãå®è¡ã§ããªãã³ãŒããæ€åºããŠã«ããããŸãã UglifyJSããããå®è¡ã§ãã䟿å©ãªæ©èœããããŸãã
次ã«ãããé«åºŠãªãããã³ãŒãé€å»- ããªãŒã·ã§ãŒãã³ã°ã¡ãœããã«é²ã¿ãŸãããã
æšã®æºã
Lodashã䜿çšããã¢ããªã±ãŒã·ã§ã³ããããšããŸã ã ã ãããLodashå šäœã䜿çšããŠããããšã匷ãçããŸãã ã»ãšãã©ã®å Žåã get ã IsEmpty ã unionByãªã©ã®ããã€ãã®é¢æ°ãæªçšãããŸãã
ããªãŒãæ¯ããšããWebpackã«äžèŠãªã¢ãžã¥ãŒã«ããæ¯ã£ãŠãæšãŠãããå¿ èŠãªãã®ã ããæ®ããŸãã ããã¯æºããæšã§ãã
Webpackã§ã®ããªãŒã·ã§ãŒãã³ã°ã®ä»çµã¿
次ã®ãããªã³ãŒãããããšããŸãããïŒ
import { a } from './a.js'; console.log(a);
ã³ãŒãã¯éåžžã«åçŽã§ããããã¢ãžã¥ãŒã«ããå€æ°aãã€ã³ããŒãããŠåºåããŸãã ãã ãããã®ã¢ãžã¥ãŒã«ã«ã¯aãšbã® 2ã€ã®å€æ°ããããŸãã å€æ°bã¯äžèŠã§ãããåé€ãããã§ãã
export const a = 3 export const b = 4
Webpackãå°çãããšãã€ã³ããŒãã³ãŒãã次ã®ããã«å€æããŸãã
var d = require(0); console.log(d["a"]);
import
ã¯
require
ã«å€ãããŸãã
require
ã
console.log
å€æŽãã
console.log
ããŸããã
WebpackäŸåé¢ä¿ã¯ã次ã®ã³ãŒãã«å€æãããŸãã
var a = 3; module.exports["a«] = a; /* unused harmony export b */ var b = 4;
Webpackã¯å€æ°aã®ãšã¯ã¹ããŒããæ®ããå€æ°bã®ãšã¯ã¹ããŒããåé€ããŸããããå€æ°èªäœãæ®ããç¹å¥ãªã³ã¡ã³ãã§ããŒã¯ããŸããã å€æãããã³ãŒãã§ã¯ãå€æ°bã¯äœ¿çšããããUglifyJSã¯ãããåé€ã§ããŸãã
WebpackããªãŒã®æºãã¯ãUglifyJSãbabel-minifyã®ãããªã³ãŒããããã€ã¶ãŒãããå Žåã«ã®ã¿æ©èœããŸãã
ããèå³æ·±ãã±ãŒã¹ãèããŠã¿ãŸããã-ããªãŒã®æºããæ©èœããªãå Žåã
ããªãŒã·ã§ãŒãã³ã°ãæ©èœããªãå Žå
ã±ãŒã¹1ãã³ãŒããèšè¿°ããŸãã
module.exports.a = 3; module.exports.b = 4;
Webpackãä»ããŠã³ãŒããå®è¡ããŠããåããŸãŸã§ãã ããã¯ãES6ã¢ãžã¥ãŒã«ã䜿çšããŠããå Žåã«ã®ã¿ããã³ãã©ãTree ShakingãæŽçããããã§ãã CommonJSã¢ãžã¥ãŒã«ã䜿çšããå ŽåãããªãŒã·ã§ãŒãã³ã°ã¯æ©èœããŸããã
ã±ãŒã¹No.2ãES6ã¢ãžã¥ãŒã«ãšååä»ããšã¯ã¹ããŒãã䜿çšããŠã³ãŒããèšè¿°ããŸãã
export const a = 3 export const b = 4
ã³ãŒããBabelãä»ããŠå®è¡ããã ã¢ãžã¥ãŒã«ãªãã·ã§ã³ãfalseã«èšå®ããªãã£ãå ŽåãBabelã¯ã¢ãžã¥ãŒã«ãCommonJSã«å°ããWebpackã¯ES6ã¢ãžã¥ãŒã«ã§ã®ã¿åäœãããããåã³ããªãŒã·ã§ãŒãã³ã°ãå®è¡ã§ããªããªããŸãã
module.exports.a = 3; module.exports.b = 4;
ãããã£ãŠãã¢ã»ã³ããªãã©ã³ã®èª°ããES6ã¢ãžã¥ãŒã«ã転éããªãããã«ããå¿ èŠããããŸãã
ã±ãŒã¹No. 3.äœãããªããã®ãããªåœ¹ã«ç«ããªãã¯ã©ã¹ããããšããŸãïŒ
export class ShakeMe {}
ã ãŸãããŸã 䜿çšããŠããŸããã Webpackãã€ã³ããŒããšãšã¯ã¹ããŒããå®è¡ãããšãBabelã¯ã¯ã©ã¹ãé¢æ°ã«å€æãããã³ãã©ãŒã¯é¢æ°ã䜿çšãããŠããªãããšã«æ°ä»ããŸãã
/* unused harmony e[port b */ var ShakeMe = function () { function ShakeMe() { babelHelpers.classCallCheck(this, ShakeMe); } return ShakeMe; }();
ãã¹ãŠãæ£åžžã§ããããã«èŠããŸããã詳ããèŠããšããã®é¢æ°å ã«ã°ããŒãã«å€æ°
babelHelpers
ãããããããã€ãã®é¢æ°ãåŒã³åºãããŠããããšã
babelHelpers
ãŸãã ããã¯å¯äœçšã§ããUglifyJSã¯ãäœããã®ã°ããŒãã«é¢æ°ãåŒã³åºãããŠããããšãèªèããäœããå£ããããšãæããŠãããããã³ãŒããã«ããããŸããã
ã¯ã©ã¹ãäœæããŠBabelã§å®è¡ãããšããããã¯ã«ãããããŸããã ããã¯ã©ã®ããã«ä¿®æ£ãããŸããïŒ æšæºåãããããã¯ããããŸã-é¢æ°ã®åã«ã³ã¡ã³ã
/*#__PURE__*/
è¿œå ããŸãïŒ
/* unused harmony export b */ var ShakeMe = /*#__PURE__*/ function () { function ShakeMe() { babelHelpers.classCallCheck(this, ShakeMe); } return ShakeMe; }();
UglifyJSã¯ã次ã®æ©èœãçŽç²ã§ãããšããèšèãä¿¡ããŸãã 幞ããªããšã«ã Babel 7ã¯çŸåšãããè¡ã£ãŠãããBabel 6ã§ã¯ãŸã äœãåé€ãããŠããŸããã
ã«ãŒã«ïŒå¯äœçšãããå ŽåãUglifyJSã¯äœãããŸããã
èŠçŽãããšïŒ
- ããªãŒã·ã§ãŒãã³ã°ã¯ ããã¹ãŠãCommonJSã§ãããå€ãBabelã«ãã£ãŠæ§ç¯ãããŠãããããnpmã®ã»ãšãã©ã®ã©ã€ãã©ãªã§ã¯æ©èœããŸãã ã
- ã»ãšãã©ã®å Žåã ããªãŒã®ã·ã§ãŒãã³ã°ã¯ã ãã®ããã«ãã§ã«æºåãããŠããã©ã€ãã©ãªãããšãã°Lodash-esãDate-fnsãããã³ã³ãŒããŸãã¯ã©ã€ãã©ãªã«å¯ŸããŠé©åã«æ©èœããŸãã
- UglifyJSã¯ã¢ã»ã³ããªã«é¢äžããŠããŸãã
- 䜿çšæžã¿ã®ES6-ã¢ãžã¥ãŒã«ã
- å¯äœçšã¯ãããŸããã
ãã³ãã«ã®ééãæžããæ¹æ³ãèãåºããå¿ èŠãªæ©èœã®ã¿ãããŒãããããã«ãã³ãã«ã«æããŸãããã
å¿ èŠãªæ©èœã®ã¿ãããŒãããŸã
ãã®éšåã2ã€ã«åããŸãã æåã®éšåã§ã¯ããŠãŒã¶ãŒãå¿ èŠãšããã³ãŒãã®ã¿ãããŠã³ããŒããããŸã ããŠãŒã¶ãŒããµã€ãã®ã¡ã€ã³ããŒãžã«ã¢ã¯ã»ã¹ããå Žåãå人ã¢ã«ãŠã³ãããŒãžã¯èªã¿èŸŒãŸããŸããã 2çªç®ã®æ¹æ³ã§ã¯ãã³ãŒãã®å€æŽã«ããããªãœãŒã¹ã®åããŒããæå°éã«æããããŸãã
å¿ èŠãªã³ãŒãã®ã¿ãããŒãããŸã
æ¶ç©ºã®ã¢ããªã±ãŒã·ã§ã³ã®æ§é ãæ€èšããŠãã ããã æã£ãŠããŸãïŒ
- ãšã³ããªãŒãã€ã³ã-APPã
- 3ã€ã®ããŒãžïŒããŒã ãæ€çŽ¢ãããã³ã«ãŒãã
![ç»å](https://habrastorage.org/getpro/habr/post_images/872/142/14e/87214214e5fc6514a1a72cb20f6be4b2.png)
解決ãããæåã®åé¡ã¯ãäžè¬çãªã³ãŒããåºãããšã§ã ã ãã¹ãŠã®ããŒãžã«å ±éã®ã³ãŒããšããŠèµ€ãã³ãŒããã¡ã€ã³ããŒãžããã³æ€çŽ¢ããŒãžã«ç·ã®åã瀺ããŸãã æ®ãã®æ°åã¯ç¹ã«éèŠã§ã¯ãããŸããã
![ç»å](https://habrastorage.org/getpro/habr/post_images/854/ec8/80f/854ec880feff7813d267ca834209db71.png)
ãŠãŒã¶ãŒãã¡ã€ã³ããŒãžããæ€çŽ¢ãããšãããã¯ã¹ãšåã®äž¡æ¹ãããäžåºŠãªããŒãããŸãããæ¢ã«æã£ãŠããŸãã çæ³çã«ã¯ããã®ãããªãã®ãèŠããã§ãã
![ç»å](https://habrastorage.org/getpro/habr/post_images/b75/290/36d/b7529036de4cf6923a279666d00ca297.png)
Webpack 4ã«ã¯ããããè¡ãããã®çµã¿èŸŒã¿ãã©ã°ã€ã³SplitChunksPluginãæ¢ã«å«ãŸããŠããã®ã¯è¯ãããšã§ã ã ãã©ã°ã€ã³ã¯ãã¢ããªã±ãŒã·ã§ã³ã³ãŒããŸãã¯ããŒãã¢ãžã¥ãŒã«ã³ãŒããåãåºããŸããããã¯ãåå¥ã®ãã£ã³ã¯ã®ããã€ãã®ãã£ã³ã¯ã§äœ¿çšãããŸãããå ±éã³ãŒãã®ãã£ã³ã¯ã30 Kbãè¶ ããããšã確èªãã5ãã£ã³ã¯ä»¥äžãããŠã³ããŒãããå¿ èŠãããããŒãžãããŒãããŸãã æŠç¥ã¯æé©ã§ããå°ãããããã£ã³ã¯ã®ããŒãã¯æçã§ã¯ãªããããŸãã«ãå€ãã®ãã£ã³ã¯ã®ããŒãã¯é·ãã http2ã§ãå°æ°ã®ãã£ã³ã¯ãããŠã³ããŒãããã»ã©å¹ççã§ã¯ãããŸãã ã Webpackã®2ã€ãŸãã¯3ã€ã®ããŒãžã§ã³ã§ãã®åäœãç¹°ãè¿ãã«ã¯ãææžåãããŠããªãæ©èœã20ã30è¡èšè¿°ããå¿ èŠããããŸããã çŸåšãããã¯1è¡ã§è§£æ±ºãããŠããŸãã
CSSã®ãã€ã¯ã¢ãŠã
å¥ã ã®ãã¡ã€ã«ã«ããåãã£ã³ã¯ã®CSSããŸã åãåºããŠãããšããã§ãããã ããã«ã¯æ¢æã®ãœãªã¥ãŒã·ã§ã³ããããŸã-Mini-Css-Extract-Plugin ãã©ã°ã€ã³ã¯Webpack 4ã«ã®ã¿ç»å Žãããã®åã«ã¯ãã®ãããªã¿ã¹ã¯ã«é©ãããœãªã¥ãŒã·ã§ã³ã¯ãããŸããã§ãã-ããã¯ãçã¿ãã·ã§ããã¬ãã°ã®ã¿ã ãã©ã°ã€ã³ã¯ãéåæãã£ã³ã¯ããCSSãåé€ã ããã®ã¿ã¹ã¯å°çšã«äœæãããå®å šã«å®è¡ããŸãã
æå°éã®ãªãœãŒã¹ãªããŒã
ããšãã°ãã¡ã€ã³ããŒãžã§æ°ããããã¢ãŒã·ã§ã³ãããã¯ããªãªãŒã¹ãããšãã«ããŠãŒã¶ãŒãã³ãŒãã®å¯èœãªéãå°ããéšåããªããŒãããããšã確èªããæ¹æ³ãèŠã€ããŸã ã
ããŒãžã§ãã³ã°ãããã°ããã¹ãŠããŸããããŸãã ããã«ããŒãžã§ã³Nã®ã¡ã€ã³ããŒãžããããããã¢ãŒã·ã§ã³ãããã¯ã®ãªãªãŒã¹åŸ-ããŒãžã§ã³N + 1ããããŸãã Webpackã¯ãããã·ã¥ã䜿çšããŠããã«åæ§ã®ã¡ã«ããºã ãæäŸããŸãã Webpackã¯ãã¹ãŠã®ã¢ã»ããïŒãã®å Žåã¯app.jsïŒãåéããåŸãã³ã³ãã³ãããã·ã¥ãèšç®ãããã¡ã€ã«åã«è¿œå ããŠã¢ããªãååŸããŸãã ãããå¿ èŠãªããŒãžã§ã³ç®¡çã§ãã
![ç»å](https://habrastorage.org/getpro/habr/post_images/fd1/3f2/1a9/fd13f21a9daeddd3a1af9083b8134257.png)
ãããä»ã©ã®ããã«æ©èœãããã確èªããŸãããã ããã·ã¥ããªã³ã«ããŠãã¡ã€ã³ããŒãžã§å€æŽãè¡ããã¡ã€ã³ããŒãžã®ã³ãŒããå®éã«å€æŽãããŠãããã©ããã確èªããŸããã¡ã€ã³ãã¡ã€ã«ãšapp.jsã®2ã€ã®ãã¡ã€ã«ãå€æŽãããŠããããšãããããŸãã
![ç»å](https://habrastorage.org/getpro/habr/post_images/2a2/bc0/b44/2a2bc0b447b7baf927ac729e28ace633.png)
ãªãè«ççã§ã¯ãªãã®ã§ããïŒ çç±ãç解ããããã«ã app.jsãèŠãŠã¿ãŸãããã 次ã®3ã€ã®éšåã§æ§æãããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã³ãŒã
- webpackã©ã³ã¿ã€ã ã
- éåæãã£ã³ã¯ãžã®ãªã³ã¯ã
mainã®ã³ãŒããå€æŽãããšããã®ã³ã³ãã³ããšããã·ã¥ãå€æŽãããŸããã€ãŸããã¢ããªå ã®ã³ãŒããžã®ãªã³ã¯ãå€æŽãããŸãã ã¢ããªèªäœãå€æŽããããããåèµ·åããå¿ èŠããããŸãã ãã®åé¡ã®è§£æ±ºçã¯ãapp.jsãã¢ããªã±ãŒã·ã§ã³ã³ãŒããšWebpackã©ã³ã¿ã€ã ãããã³éåæãã£ã³ã¯ãžã®ãªã³ã¯ã®2ã€ã®ãã£ã³ã¯ã«åå²ããããšã§ãã Webpack 4ã¯ã runtimeChunkãªãã·ã§ã³ã1ã€äœ¿çšããŠãã¹ãŠãåŠçããŸãããã®ãªãã·ã§ã³ã¯ãgzipã§2 KBæªæºã®éåžžã«è»œéã§ãã ãŠãŒã¶ãŒã®ããã«ãããåèµ·åããããšã¯å®è³ªçã«äŸ¡å€ããããŸããã RuntimeChunkã¯ããã£ã1ã€ã®ãªãã·ã§ã³ã§æå¹ã«ãªããŸãã
optimization: { runtimeChunk: true }
Webpack 3ããã³2ã§ã¯ã1è¡ã§ã¯ãªã5ã6è¡ãèšè¿°ããŸãã ããã¯ããã»ã©å€ããããŸããããããã§ããªãäžäŸ¿ã§ãã
![ç»å](https://habrastorage.org/getpro/habr/post_images/6e4/125/5d8/6e41255d837ac2a5c4bb8a6e9b74f686.png)
ãã¹ãŠãçŽ æŽãããããªã³ã¯ãšã©ã³ã¿ã€ã ãäœæããããšãåŠã³ãŸããïŒ mainã§æ°ããã¢ãžã¥ãŒã«ãäœæããŠãªãªãŒã¹ãããããŠopïŒ -ä»ãäžè¬çã«ããã¹ãŠãåèµ·åããŸãã
![ç»å](https://habrastorage.org/getpro/habr/post_images/cc7/8f6/a5f/cc78f6a5f6ffcd8b2da956d5463fefc8.png)
ãªããã ã¢ãžã¥ãŒã«ãwebpackã§ã©ã®ããã«æ©èœããããèŠãŠã¿ãŸãããã
Webpackã¢ãžã¥ãŒã«
ã¢ãžã¥ãŒã«a ã b ã dãããã³eãè¿œå ããã³ãŒãããããšããŸãïŒ
import a from 'a'; import b from 'b'; import d from 'd'; import e from 'e';
Webpack 㯠ãã€ã³ããŒããrequireã«å€æããŸããaã b ã dãããã³e㯠ãrequireïŒ0ïŒãrequireïŒ1ïŒãrequireïŒ2ïŒãããã³requireïŒ3ïŒã«çœ®ãæããããŸãã
var a = require(0); var b = require(1); var d = require(2); var e = require(3);
éåžžã«é »ç¹ã«çºçããç»åãæ³åããŠãã ãã
import c from 'c';
æ°ããã¢ãžã¥ãŒã«c
import c from 'c';
äžå€®ã®ã©ããã«è²Œãä»ããŸãïŒ
import a from 'a'; import b from 'b'; import c from 'c'; import d from 'd'; import e from 'e';
Webpackããã¹ãŠãåŠçãããšããæ°ããã¢ãžã¥ãŒã«ã®ã€ã³ããŒããrequireïŒ2ïŒã«å€æããŸãïŒ
var a = require(0); var b = require(1); var c = require(2); var d = require(3); var e = require(4);
ã¢ãžã¥ãŒã«dãšeã¯2ãš3ã§ãããã3ãš4ãšããæ°ããIDãåãåããŸãã ããããç°¡åãªçµè«ãåŸãããŸããã·ãªã¢ã«çªå·ãidãšããŠäœ¿çšããã®ã¯å°ãã°ãããŠããŸãããWebpackã¯ãããè¡ããŸãã
ã·ãªã¢ã«çªå·ãäžæã®IDãšããŠäœ¿çšããªãã§ãã ãã
åé¡ã解決ããããã«ãçµã¿èŸŒã¿ã®Webpackãœãªã¥ãŒã·ã§ã³-HashedModuleIdsPluginããããŸãã
new webpack.HashedModuleIdsPlugin({ hashFunction: 'md4â², hashDigest:'base64â², hashDigestLength: 4, }),
ãã®ãã©ã°ã€ã³ã¯ããã¡ã€ã«ãžã®çµ¶å¯Ÿãã¹ããã®ããžã¿ã«IDã®ä»£ããã«4æåã®md4ããã·ã¥ã䜿çšããŸãã ããã«ãããrequireã¯æ¬¡ã®ããã«ãªããŸãã
var a = require('YmRl'); var b = require('N2Fl'); var c = require('OWE4â²); var d = require('NWQz'); var e = require('YWVj');
æ°åã®ä»£ããã«ãæåãç»å ŽããŸããã ãã¡ãããé ããåé¡ããããŸã-ããã¯ããã·ã¥ã®è¡çªã§ã ã äžåºŠã€ãŸãããã®ã§ã4ã®ä»£ããã«8æåã䜿çšããããšããå§ãããŸããããã·ã¥ãæ£ããæ§æãããšããã¹ãŠãåœåã®æ¹æ³ã§æ©èœããŸãã
倢ã®ãã³ãã«ãåéããæ¹æ³ãããããŸããã
- çž®å°ããŸãã
- ã³ãŒãåââå²ã䜿çšããŸã ã
- ããã·ã¥ãèšå®ããŸã ã
ç§ãã¡ã¯åéããããšãåŠã³ãŸããããããŠä»ãã¹ããŒãã«åãçµã¿ãŸãã
倢ã®ãã³ãã«ããã°ããçµã¿ç«ãŠãæ¹æ³ã¯ ïŒ
N1.RUã§ã¯ãæ倧ã®ã¢ããªã±ãŒã·ã§ã³ã¯10,000åã®ã¢ãžã¥ãŒã«ã§æ§æãããŠãããæé©åããã«ãã«ãããã®ã«28åããããŸãã ã¢ã»ã³ããªã2åã«ã¹ããŒãã¢ããã§ããŸããïŒ ãããã©ããã£ãŠãã£ãã®ïŒ èšç®ãé«éåããã«ã¯3ã€ã®æ¹æ³ãããã3ã€ãã¹ãŠãWebpackã«é©çšã§ããŸãã
ã¢ã»ã³ããªã®äžŠåå
æåã«ããããšã¯ãã¢ã»ã³ããªã®äžŠååã§ããã ãã®ããã«ïŒ
- HappyPackPlugin㯠ãããŒããŒãä»ã®ããŒããŒã«ã©ãããããã¹ãŠã®èšç®ãåå¥ã®ããã»ã¹ã«ã©ããããŸãã ããã«ãããããšãã°ãBabelãšnode-sassã®äžŠååãå¯èœã«ãªããŸãã
- ã¹ã¬ããããŒã㌠HappyPackPluginãšã»ãŒåãããã«åäœããããã»ã¹ã§ã¯ãªãã¹ã¬ããããŒã«ã®ã¿ã䜿çšããŸãã å¥ã®ã¹ã¬ãããžã®åãæ¿ãã¯ã³ã¹ãã®ãããæäœã§ãããããæ éã«äœ¿çšããŸããããã¯ãbabelãnode-sassãªã©ã®ãªãœãŒã¹éäžåã®éãæäœãã©ããããå Žåã«ã®ã¿äœ¿çšããŠãã ããã ããšãã°ãjsonãèªã¿èŸŒãå Žåã䞊ååã¯é«éã«èªã¿èŸŒãŸãããããå¿ èŠãããŸããã
- ã»ãšãã©ã®å Žåã䜿çšãããã©ã°ã€ã³ãšããŒããŒã«ã¯ãã§ã«äžŠååããŒã«ãçµã¿èŸŒãŸããŠããŸã -ãã èŠãã ãã§ãã ããšãã°ããã®ãªãã·ã§ã³ã¯UglifyJSã«ãããŸãã
ãã«ãçµæã®ãã£ãã·ã¥
ã¢ã»ã³ããªçµæã®ãã£ãã·ã¥ã¯ãWebpackã¢ã»ã³ããªãé«éåããæãå¹ççãªæ¹æ³ã§ãã
æåã®è§£æ±ºçã¯cache-loaderã§ãã ããã¯ãããŒããŒã®ãã§ãŒã³ã«å ¥ããç¹å®ã®ããŒããŒã®ãã§ãŒã³çšã«ç¹å®ã®ãã¡ã€ã«ãæ§ç¯ããçµæããã¡ã€ã«ã·ã¹ãã ã«ä¿åããããŒããŒã§ãã ãã³ãã«ã®æ¬¡ã®ã¢ã»ã³ããªã§ããã®ãã¡ã€ã«ããã¡ã€ã«ã·ã¹ãã äžã«ãããæ¢ã«ãã®ãã§ãŒã³ã§åŠçãããŠããå Žåããã£ãã·ã¥ããŒããŒã¯çµæãååŸãããã®èåŸã«ããããŒããŒïŒBabel-loaderãnode-sassãªã©ïŒãåŒã³åºããŸããã
ã°ã©ãã¯ãã¢ã»ã³ããªæéã瀺ããŠããŸãã éãããŒ-ãã£ãã·ã¥ããŒããŒã䜿çšããããã£ãã·ã¥ããŒããŒã䜿çšããå Žåã®ãã«ãæéã100ïŒ -7ïŒ é ããªããŸãã ããã¯ããã£ãã·ã¥ããŒããŒããã£ãã·ã¥ããã¡ã€ã«ã·ã¹ãã ã«ä¿åããããã«äœåãªæéãè²»ããããã§ãã ãã§ã«2åç®ã®ã¢ã»ã³ããªã§ãç®ã«èŠããå©çãåãåããŸãããã¢ã»ã³ããªã¯2åé«éã§ããã
![ç»å](https://habrastorage.org/getpro/habr/post_images/6bc/e73/210/6bce732104fda8263464528d91d1a8a1.png)
2çªç®ã®ãœãªã¥ãŒã·ã§ã³ã¯ãããæŽç·ŽãããHardSourcePluginã§ãã äž»ãªéãïŒãã£ãã·ã¥ããŒããŒã¯ãã³ãŒããŸãã¯ãã¡ã€ã«ãå«ãããŒããŒã®ãã§ãŒã³ã§ã®ã¿åäœããåãªãããŒããŒã§ãããHardSourcePluginã¯Webpackãšã³ã·ã¹ãã ã«ã»ãŒå®å šã«ã¢ã¯ã»ã¹ã§ããä»ã®ãã©ã°ã€ã³ããã³ããŒããŒã§åäœã§ãããã£ãã·ã¥ã®ãšã³ã·ã¹ãã ãå°ãæ¡åŒµããŸãã äžèšã®ã°ã©ãã¯ãæåã®èµ·åã§ãã«ãæéã37ïŒ å¢å ããããšã瀺ããŠããŸããããã¹ãŠã®ãã£ãã·ã¥ã䜿çšãã2åç®ã®èµ·åã§5åå éããŸããã
![ç»å](https://habrastorage.org/getpro/habr/post_images/cb6/acf/d36/cb6acfd36adbaaadffd68af19889f960.png)
æè¯ã®éšåã¯ãäž¡æ¹ã®ãœãªã¥ãŒã·ã§ã³ãäžç·ã«äœ¿çšã§ããããšã§ãããããN1.RUã§è¡ãããŠããããšã§ãã ãã£ãã·ã¥ã«ã¯åé¡ãããã®ã§æ³šæããŠãã ãããããã«ã€ããŠã¯åŸã§èª¬æããŸãã
æ¢ã«äœ¿çšããŠãããã©ââã°ã€ã³/ããŒããŒã«ã¯ããã£ãã·ã¥ã¡ã«ããºã ãçµã¿èŸŒãŸããŠããå ŽåããããŸãã ããšãã°ã babel-loaderã«ã¯éåžžã«å¹ççãªãã£ãã·ã³ã°ã·ã¹ãã ããããŸãããäœããã®çç±ã§ããã©ã«ãã§ãªãã«ãªã£ãŠããŸãã åãæ©èœãawesome-typeScript-loaderã«ãããŸãã UglifyJSãã©ã°ã€ã³ã«ã¯ãã£ãã·ã³ã°ããããããã¯éåžžã«å¹æçã§ãã 圌ã¯ç§ãã¡ãæ°åå éãããŸããã
ãããŠä»ãåé¡ã
ãã£ãã·ã¥ã®åé¡
- ãã£ãã·ã¥ãæ£ããæ€èšŒãããªãå ŽåããããŸãã
- é©çšããããœãªã¥ãŒã·ã§ã³ã¯ãæ¥ç¶ããããã©ã°ã€ã³ãããŒããŒãã³ãŒãããŸãã¯çžäºã«åäœããªãå ŽåããããŸã ã ãã®ç¹ã§ããã£ãã·ã¥ããŒããŒã¯ã·ã³ãã«ã§æéã®ããããªããœãªã¥ãŒã·ã§ã³ã§ãã ãã ããHardSourcePluginã§ã¯ãããã«æ³šæããå¿ èŠããããŸãã
- ãã¹ãŠãå£ããŠãããšããã¥ãŒããã®ã¯é£ããã§ãã ãã£ãã·ã¥ãæ£ããæ©èœãããç解ã§ããªããšã©ãŒãçºçããå Žåãåé¡ã®åå ãçªãæ¢ããããšã¯éåžžã«å°é£ã§ãã
çç£ãç¯çŽããæ¹æ³ã¯ïŒ
ããã»ã¹ãé«éåããæåŸã®æ¹æ³ã¯ãããã»ã¹ã®ã©ã®éšåãå®è¡ããªãããšã§ãã çç£ãç¯çŽããæ¹æ³ã«ã€ããŠèããŠã¿ãŸãããã ç§ãã¡ã«ã§ããªãããšã¯äœã§ããïŒ çãã¯çãã äœãã§ããŸãã ã æ¬çªç°å¢ã§äœããæåŠããæš©å©ã¯ãããŸãããã devã§ã¯å€§å¹ ã«ç¯çŽã§ããŸãã
ä¿åãããã®ïŒ
- å¿ èŠã«ãªããŸã§ãœãŒã¹ããããåéããªãã§ãã ãã ã
- CSSã®åé€ãšCSSããŒããŒã«ããåŠçãè¡ãã¯ãŒã«ãªã¹ããŒã ã®ä»£ããã«ã¹ã¿ã€ã«ããŒããŒã䜿çšããŸãã ã¹ã¿ã€ã«ããŒããŒèªäœã¯éåžžã«é«éã§ããCSSè¡ãååŸãããã®è¡ãã¹ã¿ã€ã«ã¿ã°ã«æ¿å ¥ããé¢æ°ã«ããã·ã¥ããããã§ãã
- browserlistã«ã¯ãç¹ã«äœ¿çšãããã©ãŠã¶ã®ã¿ãæ®ãããšãã§ããŸã ã ã»ãšãã©ã®å Žåãããã¯æåŸã®ã¯ãã ã§ãã ããã¯å€§å¹ ã«å éããŸãã
- UglifyJSãcss-nanoãgzip / brotliããã®ãªãœãŒã¹ã®æé©åãå®å šã«æŸæ£ããŸã ã
ãã«ãã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã¯ã䞊ååããã£ãã·ã¥ãããã³èšç®ã®æåŠã§ãã ããã3ã€ã®ç°¡åãªæé ã«åŸãããšã§ãéåžžã«é«éåã§ããŸãã
webpackã®æ§ææ¹æ³
倢ã®ãã³ãã«ãçµã¿ç«ãŠãæ¹æ³ãšããããã°ããçµã¿ç«ãŠãæ¹æ³ãèãåºããŸããã次ã«ãæ§æãå€æŽãããã³ã«è¶³ãæããªãããã«Webpackãæ§æããæ¹æ³ãèŠã€ããŸãã
ãããžã§ã¯ãã®æ§æã®é²å
ãããžã§ã¯ãã®å žåçãªwebpack-configãã¹ã¯ã åçŽãªèšå®ããå§ãŸããŸãã æåã¯ãWebpackãBabel-loaderãsass-loaderãæ¿å ¥ããã ãã§ããã¹ãŠããŸããããŸãã ãã®åŸãäºæ³å€ã«ãããã€ãã®æ¡ä»¶ãprocess.envã«è¡šç€ºãã ããã®æ¡ä»¶ãæ¿å ¥ããŸãã ãéæ³ããªãã·ã§ã³ã®ããæ¡ä»¶ãè¿œå ããããŸã§ã1ã2ã3ãããã«å€ãã ããªãã¯ããã¹ãŠããã§ã«éåžžã«æªãããšãç解ããŠããŸããdevãšproductionã®èšå®ãè€è£œãã 2åä¿®æ£ããæ¹ãè¯ãã§ãããã ãã¹ãŠãæ確ã«ãªããŸãã ãããã«äœãåé¡ããããŸããïŒããšæã£ãå Žåãå¯äžã®å®çšçãªã¢ããã€ã¹ã¯ãæ§æãé çªã«ä¿ã€ããšã§ãã ã©ããã£ãŠããã®ãæããŠãããŸãããã
æ§æãé çªã«ä¿æãã
webpack-mergeããã±ãŒãžã䜿çšããŸãã ããã¯ãè€æ°ã®æ§æã1ã€ã«çµåããããã«äœæãããnpmããã±ãŒãžã§ãã ããã©ã«ãã®ããŒãžæŠç¥ã«æºè¶³ã§ããªãå Žåã¯ãã«ã¹ã¿ãã€ãºã§ããŸãã
èšå®ã䜿çšãããããžã§ã¯ãæ§é
4ã€ã®ã¡ã€ã³ãã©ã«ããŒããããŸãã
- ããŒããŒã
- ãã©ã°ã€ã³
- ããªã»ããã
- ããŒãã
.
Plugin/Loader
, , API, , .
次ã®ããã«ãªããŸãã
/** * JSdoc * @param {Object} options * @see */ module.exports = function createPlugin(options) { return new Plugin(options); };
, , , . , url-loader :
/** * url-loader file-loader. * * @example * - some-image.png. url-loader, url-loader * 1. , url-loader base64 * 2. , url-loader outputPath + name , . * some-image.png, outputPath/images/some-image.12345678hash.png, url-loader * publicPath/images/some-image.12345678hash.png * * @param {string} prefix * @param {number} limit , * @return {Object} loader * @see https://www.npmjs.com/package/url-loader */
, , , , , , . , , , , url-loader. :
function urlLoader(prefix = 'assets', limit = 100) { return { loader: 'url-loader', options: { limit, name: `${prefix}/[name].[hash].[ext]` } }; };
. , Loader .
Preset
webpack. , , , webpack, . â , , scss-:
{ test: /\.scss$/, use: [cssLoader, postCssLoader, scssLoader] }
.
Part
â , . , , . , :
entry: { app: './src/Frontend/app.js' }, output: { publicPath: '/static/cabinet/app/', path: path.resolve('www/static/app') },
:
- , , , json, , , splitChunks.
- dev , , js/css
- Part , output, publicPath, entry-point , , source map.
![ç»å](https://habrastorage.org/getpro/habr/post_images/7ee/20f/fa6/7ee20ffa6f453c35f11d92e3583d8caf.png)
Webpack-merge . , . webpack-merge 3-7 , Babel-loader, . , .
ãŸãšãããšã , . , webpack â . , .
, !
â Frontend Conf . , â , , Frontend Conf ++ .
- ? FrontenConf ++ , 27 28 . 27 , 15 . â !