
ãŸããWebpackãå¿
èŠãªçç±ãšãWebpackã解決ããããšããŠããåé¡ãç解ããŠãããWebpackãæäœããæ¹æ³ãåŠç¿ããŸãã Webpackã䜿çšãããšãã¢ããªã±ãŒã·ã§ã³ã§ãèŸåãå£è«/ããªã声ãåãé€ãã1ã€ã®ããŒã«ã«çœ®ãæããããšãã§ããŸãã ã¯ã©ã€ã¢ã³ãã®äŸåé¢ä¿ãã€ã³ã¹ããŒã«ããã³ç®¡çããããã®æ段ã§ã¯ãªããæšæºã®Node Package ManagerïŒnpmïŒã䜿çšããŠããã¹ãŠã®ããã³ããšã³ãã®äŸåé¢ä¿ãã€ã³ã¹ããŒã«ããã³ç®¡çã§ããŸãã webpackã¯ãã»ãšãã©ã®ããªã声/ gulpã¿ã¹ã¯ãå®è¡ã§ããŸãã
Bowerã¯ãã¯ã©ã€ã¢ã³ãåŽã®ããã±ãŒãžãããŒãžã£ãŒã§ãã JavaScriptãHTMLãCSSã®ã³ã³ããŒãã³ãã®æ€çŽ¢ãã€ã³ã¹ããŒã«ãåé€ã«äœ¿çšã§ããŸãã GruntJSã¯ãéçºè
ãå埩ã¿ã¹ã¯ãèªååããã®ã«åœ¹ç«ã€JavaScriptã³ãã³ãã©ã€ã³ãŠãŒãã£ãªãã£ã§ãã MakeãŸãã¯Antã®JavaScriptã®ä»£æ¿ãšèããããšãã§ããŸãã 圌ã¯çž®å°ãã³ã³ãã€ã«ãåäœãã¹ãããªã³ããªã©ã®ã¿ã¹ã¯ãåŠçããŸãã
Webã¢ããªã±ãŒã·ã§ã³ã§åçŽãªãŠãŒã¶ãŒãããã¡ã€ã«ããŒãžãäœæããŠãããšããŸãã jQueryããã³ã¢ã³ããŒã¹ã³ã¢ã©ã€ãã©ãªã䜿çšããŸãã 1ã€ã®æ¹æ³ã¯ãäž¡æ¹ã®ãã¡ã€ã«ãHTMLã«å«ããããšã§ãã
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>User Profile</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.css" media="screen"> <link rel="stylesheet" href="/css/style.css" media="screen"> </head> <body> <div class="container"> <div class="page-header"> <h1 id="timeline"></h1> </div> <ul class="timeline"> </ul> </div> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script> <script src="js/profile.js"></script> </body> </html>
ããã¯ãããŒãã¹ãã©ãããåããåçŽãªHTMLã§ãã ã¹ã¯ãªããã¿ã°ã䜿çšããŠjQueryãšã¢ã³ããŒã¹ã³ã¢ãæ¥ç¶ããŸããã
æ¥ç¶ããã©ã€ãã©ãªã䜿çšããprofile.js
ãã¡ã€ã«ãèŠãŠã¿ãŸãããã ã³ãŒãã¯ãã¢ããªã±ãŒã·ã§ã³ã®ããžãã¹ããžãã¯ãæ ŒçŽããå¿åã®ã¯ããŒãžã£ãŒå
ã«ãããŸãã ã³ãŒããé¢æ°ã«ããã¯ããªããšãå€æ°ã¯ã°ããŒãã«ç°å¢ã«ãªããããã¯æªãããšã§ãã
(function(){ var user = { name : "Shekhar Gulati", messages : [ "hello", "bye", "good night" ] }; $("#timeline").text(user.name+ " Timeline"); _.each(user.messages, function(msg){ var html = "<li><div class='timeline-heading'><h4 class='timeline-title'>"+msg+"</h4></div></li>"; $(".timeline").append(html); }); }());
ã¹ã¯ãªãããåŒã³åºããããšãã³ãŒããå®è¡ãããŸãã ãã©ãŠã¶ã§ããŒãžãéããšããããã¡ã€ã«ã¯æ¬¡ã®ããã«ãªããŸãã

ãã®ã³ãŒãã«ã¯2ã€ã®ã¿ã¹ã¯ããããŸãã
- ãŠãŒã¶ãŒæ
å ±ãååŸãã
- ã¿ã€ã ã©ã€ã³ãèšå®ããŸãã
ã³ã³ã»ããã®æ··åã¯æªãç¿æ
£ã§ããããšãç¥ãããŠãããããç¹å®ã®ã¿ã¹ã¯ãæ
åœããåå¥ã®ã¢ãžã¥ãŒã«ãäœæããå¿
èŠããããŸãã profile.js
ãã¡ã€ã«ã§ã¯ãå¿åã¯ããŒãžã£ãŒã䜿çšããŠãã¹ãŠã®ã³ãŒããä¿åããŸããã JavaScriptã«ã¯ãã¢ãžã¥ãŒã«ãæ¹åããæ¹æ³ããããŸãã 2ã€ã®äžè¬çãªæ¹æ³ã¯ãCommonJSãšAMDã§ãã
- CommonJSã¢ãžã¥ãŒã«ã¯ãç¹å®ã®ãªããžã§ã¯ãããšã¯ã¹ããŒããã倧äœã®åå©çšå¯èœãªã³ãŒãã§ããã
require
䜿çšããŠä»ã®ã¢ãžã¥ãŒã«ã§å©çšå¯èœã«ãªããŸãã - éåæã¢ãžã¥ãŒã«å®çŸ©ïŒAMDïŒã䜿çšãããšãã¢ãžã¥ãŒã«ãéåæã«ããŒãã§ããŸãã
JavaScriptã®ã¢ãžã¥ãŒã«ã«ã€ããŠè©³ããç¥ãããå Žåã¯ãèšäºJavaScript ModulesïŒA Beginner's Guideãèªãããšããå§ãããŸãã
ãã®èšäºã§ã¯ãCommonJSã§ã¢ãžã¥ãŒã«ãäœæããŸãã ããããŒãšã¿ã€ã ã©ã€ã³ãèšå®ããã¡ãœãããæã€ã¿ã€ã ã©ã€ã³ã¢ãžã¥ãŒã«ãäœæããŸãããã CommonJSã§ã¯ã require
é¢æ°ã䜿çšããŠäŸåé¢ä¿ãã€ã³ããŒãã§ããŸãã ã¿ã€ã ã©ã€ã³ã¯jquery
ãšunderscore
äŸåãunderscore
ã
var $ = require('jquery'); var _ = require('underscore'); function timeline(user){ this.setHeader = function(){ $("#timeline").text(user.name+ " Timeline"); } this.setTimeline = function(){ _.each(user.messages, function(msg){ var html = "<li><div class='timeline-heading'><h4 class='timeline-title'>"+msg+"</h4></div></li>"; $(".timeline").append(html); }); } } module.exports = timeline;
ãã®ã³ãŒãã¯ãæ°ããtimeline
ã¢ãžã¥ãŒã«ãäœæããŸãã setHeader
ãšsetTimeline
2ã€ã®é¢æ°ããããŸãã ç¹å¥ãªmodule
ãªããžã§ã¯ãã䜿çšãã module.exports
ãªã³ã¯ãè¿œå ãmodule.exports
ã ãã®ããã«ããŠãCommonJSã¢ãžã¥ã©ãŒã·ã¹ãã ã«ãä»ã®æ©èœãã¢ãžã¥ãŒã«ã䜿çšã§ããããã«ããããšãäŒããŸãã
次ã«profile.js
æŽæ°ãã timeline
ã¢ãžã¥ãŒã«ã䜿çšããå¿
èŠããããŸãã ãŠãŒã¶ãŒã«é¢ããæ
å ±ãããŒãããæ°ããã¢ãžã¥ãŒã«ãäœæã§ããŸãããããã§ã¯ã1ã€ã®ã¢ãžã¥ãŒã«ã«å¶éããŸãã
var timeline = require('./timeline.js'); var user = { name : "Shekhar Gulati", messages : [ "hello", "bye", "good night" ] }; var timelineModule = new timeline(user); timelineModule.setHeader(user); timelineModule.setTimeline(user);
index.htmlããã©ãŠã¶ã«ããŒããããšã空çœã®ããŒãžã衚瀺ãããŸãã ã³ã³ãœãŒã«ïŒéçºè
ããŒã«ïŒã§ãšã©ãŒãèŠã€ããããšãã§ããŸãã
profile.js:1 Uncaught ReferenceError: require is not defined
åé¡ã¯ããã©ãŠã¶ãCommonJSã®ãããªã¢ãžã¥ã©ãŒã·ã¹ãã ãç解ããªãããšã§ãã ãã©ãŠã¶ã«æåŸ
ããã圢åŒãæäŸããå¿
èŠããããŸãã
ã¢ãžã¥ãŒã«ãã³ãã©ãŒãå©ãã«ãªããŸã
Webãã©ãŠã¶ãŒã¯ããããã®ãã説æãããŠããã¢ãžã¥ãŒã«ãç解ããŸããã ãã¹ãŠã®JavaScriptã³ãŒãã1ã€ã®ãã¡ã€ã«ã«è¿œå ããŠã€ã³ããŒããããã script
ã¿ã°ã䜿çšããŠãã¹ãŠã®ãã¡ã€ã«ãããŒãžã«æåã§è¿œå ããå¿
èŠããããŸãã ãã®åé¡ã解決ããã«ã¯ãã¢ãžã¥ãŒã«ãã³ãã©ãŒã䜿çšããŸãã Bundlerã¢ãžã¥ãŒã«ã¯ãç°ãªãã¢ãžã¥ãŒã«ãšãããã®äŸåé¢ä¿ãæ£ããé åºã§1ã€ã®ãã¡ã€ã«ã«çµåããŸãã ããŸããŸãªã¢ãžã¥ã©ãŒã·ã¹ãã ã䜿çšããŠèšè¿°ãããã³ãŒãã解æãããã©ãŠã¶ãŒãç解ã§ãã1ã€ã®åœ¢åŒã«çµåã§ããŸãã 2ã€ã®äžè¬çãªã¢ãžã¥ãŒã«ãã³ãã©ãŒã¯æ¬¡ã®ãšããã§ãã
- browserify ïŒãã©ãŠã¶ãŒã§åŸã§äœ¿çšããããã«npmã¢ãžã¥ãŒã«ãããã¯ããŸãã browserifyã®å Žåããªã³ãããã¹ãã®å®è¡ãªã©ã®ããã«GruntãŸãã¯Gulpãè¿œå ã§æ¥ç¶ããå¿
èŠããããŸããããã¯ãããã€ãã®ããŒã«ãšçµ±åã®äœæ¥ã«æéãè²»ããå¿
èŠãããããšãæå³ããŸãã
- webpack ïŒã¢ãžã¥ãŒã«ã®ãã³ãã«ïŒã¬ã€ã¢ãŠãïŒãæäŸããã ãã§ãªãã Gulp / Gruntãå®è¡ããã¿ã¹ã¯ãå®è¡ã§ãããã«ãã·ã¹ãã ã ããã«ãwebpackã¯JavsScriptãã¡ã€ã«ã«éå®ããããCSSãç»åãhtmlã³ã³ããŒãã³ããªã©ã®ä»ã®éçå€æ°ãšé£æºã§ããŸããwebpackã¯ã
code splitting
ïŒ code splitting
ïŒãšããéåžžã«äŸ¿å©ãªæ©èœããµããŒãããŸãã 倧èŠæš¡ãªã¢ããªã±ãŒã·ã§ã³ã¯ãå¿
èŠã«å¿ããŠããŠã³ããŒããããæçã«åå²ã§ããŸãã
webpackãšã¯äœã§ããïŒ
å
¬åŒã®å®çŸ©ã¯æ¬¡ã®ãšããã§ãã
webpackã¯äŸåé¢ä¿ã®ããã¢ãžã¥ãŒã«ãåãåãããããã®ã¢ãžã¥ãŒã«ãè¡šãéçãªãœãŒã¹ãçæããŸã
ãã®å®çŸ©ã¯ã解決ãããåé¡ãç解ããããšãã«æå³ããªããŸãã Webpackã¯ãªãœãŒã¹ã®ã»ãããååŸããããããã»ããïŒãã³ãã«ïŒã«å€æããŸãã

ãªãœãŒã¹ã®å€æã«ã¯ãwebpackã®å¿èéšã§ããããŒããŒãé¢ä¿ããŠããŸããã
åäœäžã®Webpack
webpackãã€ã³ã¹ããŒã«ããã«ã¯ãããŒããå¿
èŠã§ãã å
¬åŒãµã€ãããããŒããããŠã³ããŒãã§ããŸãã
ããã§ãwebpackãã°ããŒãã«ã«ã€ã³ã¹ããŒã«ã§ããŸãã
$ npm install -g webpack
npm init
ã³ãã³ãã§æ°ããã¢ãžã¥ãŒã«ãäœæããŸãã 圌女ã¯package.json
ãã¡ã€ã«ãäœæããŸãã npmã䜿çšããŠäŸåé¢ä¿ãã€ã³ã¹ããŒã«ããŸãã
$ npm install -S jquery $ npm install -S underscore
ããã«ãwebpackãäŸåé¢ä¿ãšããŠã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã
$ npm install -S webpack
index.html
次ã®ã³ãŒãã«çœ®ãæããŸãã ã芧ã®ãšãããjqueryãšunderscoreã®ã¹ã¯ãªããã¿ã°ããã¹ãŠåé€ããŸããã ãŸãã js/profile.js
ãã€ã³ããŒããã代ããã«js/profile.js
dist/bundle.js
ãŸãã
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>User Profile</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.css" media="screen"> <link rel="stylesheet" href="/css/style.css" media="screen" title="no title"> </head> <body> <div class="container"> <div class="page-header"> <h1 id="timeline"></h1> </div> <ul class="timeline"> </ul> </div> <script src="dist/bundle.js" charset="utf-8"></script> </body> </html>
ãã³ãã«ãäœæããŸãããã
$ webpack js/profile.js dist/bundle.js
Hash: 6d83c7db8ae0939be3d0 Version: webpack 1.13.2 Time: 350ms Asset Size Chunks Chunk Names bundle.js 329 kB 0 [emitted] main [0] ./js/profile.js 252 bytes {0} [built] [1] ./js/timeline.js 427 bytes {0} [built] + 2 hidden modules
ããã§ãããŒãžã¯æ£åžžã«æ©èœããŠããŸãã
webpackã¢ãã¿ãŒã®å€æŽãè¡ããèªåçã«ãã³ãã«ãçæã§ããŸãã ãããè¡ãã«ã¯ã次ã®ãã©ã°ãæå®ããŠå®è¡ããŸãã
$ webpack -w js/profile.js dist/bundle.js
ããã§ãwebpackã¯èªåçã«çµäºããŸããã ãã¡ã€ã«ãå€æŽãããšãæ°ãããã³ãã«ãçæãããŸãã ãã©ãŠã¶ã§ããŒãžããªããŒãããã ãã§ãã profile.js
å€æŽããŸãããïŒ
var user = { name : "Shekhar Gulati!!!", messages : [ "hello", "bye", "good night" ] };
bundle.js
ã«ãã£ãŠçæãããbundle.js
ãã¡ã€ã«ã«ã¯ãwebpackèªäœã«é¢é£ããå€ãã®ã³ãŒããå«ãŸããŠãããããã«ããã³ãŒãã¯å€æŽããã圢åŒã«ãªããŸãã ãã©ãŠã¶ãããšãã°éçºè
ããŒã«ã§ã¢ããªã±ãŒã·ã§ã³ããããã°ããã®ã¯éåžžã«äžäŸ¿ã§ãã ç掻ãç°¡çŽ åããããã«ãdevtoolsãã©ã°ã䜿çšããŠwebpackãå®è¡ã§ããŸãã
$ webpack -w --devtool source-map js/profile.js dist/bundle.js
webpackã¯bundle.jsãã¡ã€ã«ã®ãœãŒã¹ããããçæããŸãã ãœãŒã¹ãããã¯ãæå°åããã³ã³ã³ãã€ã«ãããã³ãŒããããœãŒã¹ã®ã¢ã»ã³ãã«ãããŠããªãã³ãŒããšåäžã®ãã¡ã€ã«ã«é¢é£ä»ããŸãã ãã¹ãã®ããã«ãprofile.jsã«debugger
è¡ãè¿œå ã§ãdebugger
var timeline = require('./timeline.js'); var user = { name : "Shekhar Gulati", messages : [ "hello", "bye", "good night" ] }; debugger; var timelineModule = new timeline(user); timelineModule.setHeader(user); timelineModule.setTimeline(user);
ããŒãžããªããŒããããšãã¢ããªã±ãŒã·ã§ã³ã¯ãã®è¡ã§åæ¢ããŸãã

CSSãè¿œå ãã
äžèšã®HTMLã§ã¯ã /css/style.css
ãèªã¿èŸŒãã§ããããšã/css/style.css
ãŸãã Webpackã¯ãJavaScriptã ãã§ãªããCSSãå«ãä»ã®éçå€æ°ã§ãæ©èœããŸãã index.html
ãã/css/style.css
ã®è¡ãåé€ããŸãã ãã®ããã«ã profile.js
ã«ã¹ã¿ã€ã«ãå«ããŸãã
require('../css/style.css'); var timeline = require('./timeline.js'); var user = { name : "Shekhar Gulati", messages : [ "hello", "bye", "good night" ] }; var timelineModule = new timeline(user); timelineModule.setHeader(user); timelineModule.setTimeline(user);
webpackã¯å€æŽããªããŒãããã³ã³ãœãŒã«ã«ãšã©ãŒã¡ãã»ãŒãžã衚瀺ãããŸãã
ERROR in ./css/style.css Module parse failed: /Users/shekhargulati/dev/52-technologies-in-2016/36-webpack/code/css/style.css Unexpected token (1:0) You may need an appropriate loader to handle this file type.
åé¡ã¯ãwebpackãããã©ã«ãã§CSSãç解ããªãããšã§ãã ããã«ã¯ãããã€ãã®ããŒãããŒããŒãã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã å¿
èŠãªããŒãããŒããŒãã€ã³ã¹ããŒã«ããã³ãã³ãã¯æ¬¡ã®ãšããã§ãã
$ npm install style-loader css-loader --save-dev
Webpackã¯ããŠã³ããŒããŒã䜿çšããŠãããã¹ããç®çã®åœ¢åŒã«å€æããŸãã 次ã«ã require
ãæŽæ°require
ã
require('style!css!../css/style.css');
æ§æstyle!css!
ã€ãŸããæåã«css
å€æãé©çšããŠstyle.css
ããCSSã«ããã¹ããå€æãã次ã«style
å€æã䜿çšããŠããŒãžã«ã¹ã¿ã€ã«ãé©çšããå¿
èŠããããŸãã
Webpackãå床å®è¡ããŸãã
$ webpack -w --devtool source-map js/profile.js dist/bundle.js
æ§æ
ã³ãã³ãã©ã€ã³ã§ãã¹ãŠã®ãªãã·ã§ã³ãæå®ããªãããã«ãã¢ããªã±ãŒã·ã§ã³ã«ãŒãã«webpack.config.js
æ§æãã¡ã€ã«ãäœæã§ããŸãã
module.exports = { context: __dirname, devtool: "source-map", entry: "./js/profile.js", output: { path: __dirname + "/dist", filename: "bundle.js" } }
ããã§ãã·ã³ãã«ãªwebpack -w
ã³ãã³ãã§webpackãå®è¡ã§ããŸãã
style!css!
ãè¿œå ãããšãstyle!css!
profile.js
ã§ã¯ãéç£ã³ãŒããšwebpackæ§æãæ··åããŸããã ãã®ãªãã·ã§ã³ãæ§æãã¡ã€ã«ã«è»¢éã§ããŸãã
æ§æã®å€æŽåŸãwebpackãåèµ·åããå¿
èŠããããŸãã
var webpack = require('webpack'); module.exports = { context: __dirname, devtool: "source-map", entry: "./js/profile.js", output: { path: __dirname + "/dist", filename: "bundle.js" }, module:{ loaders: [ {test : /\.css$/, loader: 'style!css!'} ] } }
ããã§æãèå³æ·±ãã»ã¯ã·ã§ã³ã¯ãã¢ãžã¥ãŒã«ã®å®£èšã§ãã ããã§ããã¡ã€ã«ã.cssã§çµããå Žåã style!css!
ãé©çšããå¿
èŠãããããšãææããŸããstyle!css!
ã
ããããªããŒã
ããããªããŒãã«ã¯webpack-dev-server
ãå¿
èŠwebpack-dev-server
ã 次ã®ããã«ã€ã³ã¹ããŒã«ããŸãã
$ npm install -g webpack-dev-server
ããã§ã webpack-dev-server
ã³ãã³ãã䜿çšããŠãµãŒããŒãèµ·åã§ãwebpack-dev-server
ã
httpïŒ// localhostïŒ8080 / webpack-dev-server /ã§ãµãŒããŒãèµ·åãã webpack.config.js
ã®æ§æã䜿çšãwebpack.config.js
ã
ããŒãã¯--port
ãªãã·ã§ã³ã§å€æŽã§ããŸãã
$ webpack-dev-server --port 10000
http:
webpack-dev-server
æ§æã¯ã devServer
ã»ã¯ã·ã§ã³ã®webpack.config.js
ãã¡ã€ã«ã§ãæå®ã§ããŸãã
module.exports = { context: __dirname, devtool: "source-map", entry: "./js/profile.js", output: { path: __dirname + "/dist", filename: "bundle.js" }, module:{ loaders: [ {test : /\.css$/, loader: 'style!css!'} ] }, devServer: { inline:true, port: 10000 }, }
ä»æ¥ã¯ä»¥äžã§ãã Webpackã®è©³çŽ°ã«ã€ããŠã¯ã ããã¥ã¡ã³ããã芧ãã ããã