ãã®èšäºã®å·çæç¹ã§ã¯ãJavaScriptã«ã¯å
¬åŒã®ã¢ãžã¥ã©ãŒã·ã¹ãã ã¯ãªãã誰ããã§ããéãã¢ãžã¥ãŒã«ããšãã¥ã¬ãŒãããŠããŸããã
ã¢ãžã¥ãŒã«ãŸãã¯åæ§ã®æ§é ã¯ãæ人åãããã°ã©ãã³ã°èšèªã®äžå¯æ¬ ãªéšåã§ãã ä»ã«æ¹æ³ã¯ãããŸãã ã¢ãžã¥ãŒã«ã䜿çšãããšãã¹ã³ãŒããå¶éããããã¢ããªã±ãŒã·ã§ã³ã®äžéšãåå©çšããããã¢ããªã±ãŒã·ã§ã³ãããæ§é åãããããªãœãŒã¹ããã€ãºããåé¢ããããäžè¬çã«ã³ãŒããããèŠããããããã§ããŸãã
JavaScriptã«ã¯ç¬èªã®é°å²æ°ããããŸã-èšèªã«ã¯å
¬åŒã®ã¢ãžã¥ãŒã«ã¯ãããŸãããããã«ããã¹ãŠã®ãã¡ã€ã«ã¯ãªã¢ãŒãã«ããã1ã€ã®ã¢ããªã±ãŒã·ã§ã³ã¹ããªãŒã ã§ãã ããŠã³ããŒãã«é¢ããããã€ãã®å¥åŠãªåé¡ãåžžã«è§£æ±ºããããŠã³ããŒãæéãççž®ããããã«ã¢ãžã¥ãŒã«ã1ã€ã®ãã¡ã€ã«ã«å·§åŠã«ããã¯ããå¿
èŠããããŸãã äºéã®æšæºãšæŠããç°ãªã圢åŒã®ã¢ãžã¥ãŒã«ãé©å¿ãããå¿
èŠãããå ŽåããããŸãã
å®éã圌ãã¯ãDOMãããããããã ãã§ãªãã巚倧ãªãããžã§ã¯ããJavaScriptã§è¡ãããšãã§ãããšã¯èããŠããªãã£ããããã¢ãžã¥ãŒã«ã«ã€ããŠã¯èããŠããŸããã§ããã ã¯ããå°æ¥ã«ã€ããŠã¯èããŸããã§ããã ãããŠãçªç¶ãæªæ¥ãæ¥ãŸããïŒ ãã¹ãŠããã§ã«ããã«ããããã§ãJavaScriptã®ã¢ãžã¥ãŒã«ã¯ãæ§ããã«èšã£ãŠãé
ãã§ãã ãããã£ãŠãéçºè
ã¯ããçš®ã®ã¢ãžã¥ã©ãŒãšãã¥ã¬ãŒã¿ãã¹ãã³ããŠçºæããå¿
èŠããããŸãã
å€ãã®äººãåªããèšäºãAddy Osmani
Writing Modular JavaScript With AMDãCommonJSïŒES Harmony ããèªãã ããšããããšæã
ãŸããããã¯åœŒã®èæž
ãJavaScriptãã¶ã€ã³ãã¿ãŒã³ã®åŠç¿ ãã®ç« ã®1ã€ã«ãªãã
ïŒ ãå€ããã¢ãžã¥ãŒã«ã«ã€ããŠã®è©³çŽ°2010ã
ãããã®èšäºã翻蚳ããããããããå¯ãéãããããã€ããã¯ãããŸããã ç§ã®èšäºã§ã¯ãã¢ãžã¥ã©ãŒãã¹ã«ã€ããŠèª¬æããŸãã ãå€ããã¢ãžã¥ãŒã«ãããæ°ãããã¢ãžã¥ãŒã«ãžã®ç§»è¡æ¹æ³ãšãçŸåšäœ¿çšããŠãããã®ãšãã®çç±ã«ã€ããŠã
ãã®èšäºã¯3ã€ã®ããŒãã§æ§æãããŠããŸãïŒã¢ãžã¥ãŒã«ãã¹ãŠã§ã€ãã¢ãžã¥ãŒã«ã¬ããã®äžèŽéšåãããã³ã¢ãžã¥ãŒã«ã®äžè¬çãªã¿ã€ã
tl; drç§ã¯ãéã¢ãžã¥ãŒã«ããã
AMD ã
browserifyãçµãŠ
LMDã«è³ããŸã§ã®é·ãéã®ããæ©ãã§ããŸããã å°æ¥ã
ECMAScript 6 Modulesã«äŸåããŸãã
ã¢ãžã¥ãŒã«ãã¹
ã¹ããŒãž1ïŒã¢ãžã¥ãŒã«ãªã
JavaScriptã³ãŒããã»ãšãã©ãªãã£ãåœæãç§ã¯ã¢ãžã¥ãŒã«ãå®å
šã«çããŸããã ããããç§ã¯ããããå¿
èŠãšããŸããã§ããã ã¢ãžã¥ã©ãŒã·ã¹ãã ãå°å
¥ãããšã50è¡ã®ã³ãŒãã150è¡ã«ãªããŸãããŸããã¢ãžã¥ãŒã«ãªãã§DOMã«ãã°ããããããé©çšã§ããŸããã ç§ã¯åå空éã§å®å
šã«ç®¡çããã¢ã»ã³ããªã䜿çšããŸããã§ããããããŠããããã¡ã€ã¢ãŒã¯ãã®ãšãéçºãããŸããã§ããã
ã¢ãžã¥ãŒã«
MyNs.MyModule = function () {}; MyNs.MyModule.prototype = {
çµç«
<script src="myNs.js"/> <script src="myNs/myModule.js"/>
catã䜿çšããŠãã¡ã€ã«ãåéãå§ãããšããç§ã®ã¢ããªã±ãŒã·ã§ã³ã®é²æã¯ããã«åæ©é²ã¿ãŸããã
$ cat js/*.js > build.js
ã¹ããŒãž2ïŒååŠç
é²è¡ã¯æ¢ãŸã£ãŠããããç§ã®50è¡ã®ã³ãŒãã¯åŸã
ã«1500ã«ãªãããµãŒãããŒãã£ã®ã©ã€ãã©ãªãšãã®ãã©ã°ã€ã³ã䜿ãå§ããŸããã ãããŠãç§ãæžããã¢ããªã±ãŒã·ã§ã³ã¯ãRich Internet ApplicationãšåŒã¶ããšãã§ããŸãã ã¢ãžã¥ãŒã«ãžã®åå²ãšãããã®éšåçãªåé¢ã¯ãåœæã®ç§ã®åé¡ã解決ããŸããã ã¢ã»ã³ããªã«ã¯ãããªããã»ããµã䜿çšãå§ããŸããã å€ãã®ã¢ãžã¥ãŒã«ããããäŸåé¢ä¿ããããŸãããäŸåé¢ä¿ãèªåã®æã§è§£æ±ºããããªãã£ãã®ã§ãååŠçãäžå¯æ¬ ã§ããã ç§ã¯åå空éã䜿çšããŸãããããããã«ã¯å€§éšãããããŸããïŒ
if (typeof MyNamespace === 'undefined') { var MyNamespace = {}; }
äœåãªèœæžãïŒ
new MyNamespace.MyConstructor(MyNamespace.MY_CONST);
ãããŠåœæã®ãããã£ã±ãŒã¿ãŒã¯ãã®ã³ãŒããããŸãå§çž®ããŠããŸããã§ããïŒ
new a.MyConstructor(a.MY_CONST);
å®å
šãªåé¢ãé©çšãå§ããåå空éãç Žæ£ããŠã¹ã³ãŒãã«çœ®ãæãããšããç§ã®ã¢ãžã¥ãŒã«ã¯å°ãåé²ããŸããã ãããŠåœŒã¯ãããã®ã¢ãžã¥ãŒã«ã䜿ãå§ããŸããïŒ
include('deps/dep1.js'); var MyModule = (function () { var MyModule = function () {}; MyModule.prototype = {
ãããŠããã®ãããªã¢ã»ã³ããª
(function () { include('myModule.js'); }());
ãããŠåãååŠç
$ includify builds/build.js index.js
åã¢ãžã¥ãŒã«ã«ã¯ããŒã«ã«ã¹ã³ãŒãããããã¢ã»ã³ããªå
šäœãå¥ã®IEFEã§ã©ãããããŸãã ããã«ãããã¢ãžã¥ãŒã«ãçžäºã«ä¿è·ããã¢ããªã±ãŒã·ã§ã³å
šäœãã°ããŒãã«ããä¿è·ã§ããŸãã
ã¹ããŒãž3ïŒAMD

ããæ¥ãRedditãèªãã§ãããšãã«ãAMDãšRequireJSã«é¢ããèšäºã«åºäŒããŸããã
å°ããªäœè«ã å®éãAMDã®ã¢ã€ãã¢ã¯
YUI Modulesãšããããã¬ã³ããåãããã®ã§ãã ã¢ãžã¥ãŒã«ã䜿çšããŠå®£èšããããã«ãäœåãªæåãèšè¿°ããå¿
èŠããªããªã£ããããæ§æãç°¡åã«ãªããŸããã
ã ã£ã
YUI().use('dep1', function (Y) { Y.dep1.sayHello(); });
ã«ãªã£ãŠããŸã
require(['dep1'], function (dep1) { dep1.sayHello(); });
AMDã®ããšãç¥ããç§ã¯ãã®æãŸã§ãã¹ãŠãééã£ãŠããããšã«æ°ä»ããŸããã
require()
ãš
define()
ã
require()
ãš
define()
é¢æ°
require()
2ã€ã ãã§ãç§ã®åé¡ã¯ãã¹ãŠè§£æ±ºãããŸããïŒ ã¢ãžã¥ãŒã«ã¯äŸåé¢ä¿èªäœãããŒããå§ããæ£åžžãªãšã¯ã¹ããŒããšã€ã³ããŒããçŸããŸããã ã¢ãžã¥ãŒã«ã¯3ã€ã®éšåïŒã€ã³ããŒãããšã¯ã¹ããŒããã¢ãžã¥ãŒã«æ¬äœïŒã«åå²ãããç°¡åã«ç解ã§ããŸããã ãŸãã圌ãå¿
èŠãšãããšã¯ã¹ããŒããããªãœãŒã¹ãèŠã€ããããšã容æã«ãªããŸããã ã³ãŒãã¯æ§é åãããããã¯ãªãŒã³ã«ãªããŸããïŒ
ã¢ãžã¥ãŒã«
define('myModule', ['dep1', 'dep2'], function (dep1, dep2) { var MyModule = function () {}; MyModule.prototype = {
çµç«
$ node r.js index.js bundle.js
ããããããã»ã©åçŽã§ã¯ãããŸãã...
ã¹ããŒãž4ïŒAMDãžã®å€±æ
äžã«ç€ºããã®ã¯ãçæ³çãªã¢ãžã¥ãŒã«ãšå®ç§ãªã¢ã»ã³ããªã§ãã ããã¯å®éã®ãããžã§ã¯ãã§ã¯çºçããŸããã ãŸããã¢ãžã¥ãŒã«ã«ã¯å€ãã®äŸåé¢ä¿ããããŸãã ãã®åŸã次ã®ããã«ãªããŸãã
require(['deps/dep1', 'deps/dep2', 'deps/dep3', 'deps/dep4', 'deps/dep5', 'deps/dep6', 'deps/dep7'], function ( dep1, dep2, dep3, dep4, dep5, dep6, dep7) { return function () { return dep1 + dep2; }; });
ãã®ã¢ãžã¥ãŒã«ã䜿çšã§ããŸããã倧éšãããŸãã ãã®åé¡ãå
æããããã«ãSimplified CommonJSã§ãã®ãããªã¢ãžã¥ãŒã«ãäœãçŽãããšãã§ããŸãã ãã®å Žåã§ãã
define()
ã©ãããŒãäœæããŠãæ£çŽãªCommonJSã¢ãžã¥ãŒã«ãäœæãã
r.js
ã䜿çšããŠãããããã«ãããå¿
èŠã¯ãã
r.js
define(function (require, module, exports) { var dep1 = require('dep1'), dep2 = require('dep2'), dep3 = require('dep3'), dep4 = require('dep4'), dep5 = require('dep5'), dep6 = require('dep6'), dep7 = require('dep7'); return function () { return dep1 + dep2; }; });
RequireJSã®Simplified CommonJS圢åŒã¯ããã€ãã£ãã§ã¯ãªãããéçºè
ãäœæããå¿
èŠããããŸããã ãã®ãããªã¢ãžã¥ãŒã«ã®äœæãéå§ãããšãRequireJSã¯æ£èŠè
ã«ãããã®ã¢ãžã¥ãŒã«ã®äŸåé¢ä¿ã®æ€çŽ¢ãéå§ããŸãã

ãããŠãããããäœããèŠã€ãããŸããïŒ
require("myModule//"); require("my module"); require("my" + "Module"); var require = r; r("myModule");
ãã®ã³ãŒãã¯æå¹ã§ãããåäžã®ã¢ãžã¥ãŒã«ã¯ãããŸããã ãã¡ããããã®äŸã¯æœè±¡çã§ãããããã€ãã®ååã¯äžèªç¶ã§ããããã³ãã¬ãŒããããã€ãã®å·¥å Žãªã©ãã¢ãžã¥ãŒã«åã®åçãªæ§ç¯ã®ã±ãŒã¹ã«ããåºããããŸããã
ãã¡ãããRequireJSã«ã¯ããã«å¯Ÿãã解決çããããŸã-ãã®ãããªåã¢ãžã¥ãŒã«ãconfigã«ç»é²ããŸãïŒ
({ "paths": { "myModule": "modules/myModule.js" } })
ãŸãããã®ãããªã¢ãžã¥ãŒã«ïŒãã³ãã¬ãŒãïŒãå€æ°ãããæ¯åæ§æã«æ°ããã¢ãžã¥ãŒã«ãæžããããªããããæ§æãåçã«çæãããªã©ãããããçš®é¡ã®éæ³ã§ã³ãŒããæé·ãå§ããŸãã ãŸãããåçã¢ãžã¥ãŒã«ãã䜿çšããªãããšã¯ã䜿çšå¯èœãªæ©èœã䜿çšãããšæãã§ãã
ç§ã¯æ£çŽãªCommonJSã¢ãžã¥ãŒã«ãæžãå§ããéçºäžã§ãr.jsã䜿çšããŠã¢ã»ã³ããªã䜿çšããŸããã AMDãæåŠãããããšã§ãNode.jsã§ãããã®ã¢ãžã¥ãŒã«ãéæ³ãªã䜿çšã§ããããã«ãªããŸããã ç§ã¯ãã®ããŒã«ãåºæ¬çã«ç§ã«åã£ãŠããããšãç解ãå§ããŸããããæŸèæãšäœåãªç 磚ãå¿
èŠã§ãã
RequireJSãæäŸããŠãããåçããŒãã£ã³ã°ã¢ãžã¥ãŒã«ãªãã·ã§ã³ã¯å¿
èŠãããŸããã§ããã éçºãšæ¬çªã§æãé¡äŒŒããã³ãŒããããããšã確èªãããã£ãã®ã§ãéçºäžã®ã¢ãžã¥ãŒã«ã®éåæèªã¿èŸŒã¿ã¯ç§ã«ã¯é©ããªãã£ãããã1ã€ã®ãã¡ã€ã«ã«ã¢ãžã¥ãŒã«ãåéããŸããã
ãããžã§ã¯ãã®äžéšã¯èµ·åæã«èªã¿èŸŒãŸãïŒ1ãªã¯ãšã¹ãïŒãæ®ãã®éšåã¯ãªã³ããã³ãã§èªã¿èŸŒãŸããŸããã ãããŠããããã¯å°ããªãªã¯ãšã¹ãã®æã§ã¯ãªãã1ã€ã®å€§ããªãªã¯ãšã¹ãïŒ1mãã¡ã€ã«ã®è€æ°ã®ã¢ãžã¥ãŒã«ã®ã¢ã»ã³ããªïŒã§ããŒããããŸããã ããã«ãããæéãšãã©ãã£ãã¯ã®äž¡æ¹ãç¯çŽããããããã¯ãŒã¯ãšã©ãŒã®ãªã¹ã¯ã軜æžãããŸããã
ãŸããããã€ãã®ã¢ã»ã³ããªãäœæããå¿
èŠãããå ŽåããããŸãã ããšãã°ããã¹ãç°å¢åãã®ãã·ã¢èªãã±ãŒã«ã®ã¢ããªã±ãŒã·ã§ã³ããäŒæ¥ãããã¯ãŒã¯åãã®è±èªçIEçšã«æé©åãããã¢ããªã±ãŒã·ã§ã³ãªã©ã§ãã ãŸãã¯ãåºåãç¡å¹ã«ãªã£ãŠãããŠã¯ã©ã€ãåãiPadçšã«æé©åãããã¢ããªã±ãŒã·ã§ã³ã ç¡ç§©åºãåèšããã³ããŒïŒããŒã¹ã...
RequireJsã®å²åŠã§ã¯ã
require()
ããããããªãœãŒã¹ãçç£ããããã®æ®éçãªãã©ã³ãã§ãããšããäºå®ã¯å¥œãã§ã¯ãããŸããã§ããã
require()
ã¯ããã©ã°ã€ã³ãšæ¢ã«ããŒããããã¢ãžã¥ãŒã«ã®æœè±¡åãè¡ããŸããäœããã®çç±ã§ãã©ã°ã€ã³ãæ¥ç¶ãããªãã£ãå Žåãäœããã®åœ¢ã§ãã©ã°ã€ã³ãæ瀺çã«ããŒããããããã䜿çšããŠãªãœãŒã¹ãããŒãããŸãã
require(['async!i18n/data', 'pewpew.js', 'text!templates/index.html'], fucntion (data, pewpew, template) { });
ãªãœãŒã¹ãå調ã§ãããããªãœãŒã¹ãããŸãå€ããªããããžã§ã¯ãã§ã¯ãããã¯çŽ
ã¹ããŒãž5ïŒã¢ãžã¥ãŒã«æ€çŽ¢
ãããããªãµãã«çããŠãããªãããšã«æ°ã¥ãã...
1ã€ã®ã¢ãžã¥ãŒã«ã¯CommonJSã§ããå¿
èŠããããŸã
Node.jsãšJS @ DOMã®äž¡æ¹ã§åãã¢ãžã¥ãŒã«ãå®è¡ããå¿
èŠãããéåžžã«é »ç¹ãªã±ãŒã¹ã ã»ãšãã©ã®å Žåããããã¯å€éšç°å¢ïŒãã¡ã€ã«ã·ã¹ãã / DOMïŒãŸãã¯ããããæœè±¡åãããéšåã«é¢é£ããªãããã€ãã®ã¢ãžã¥ãŒã«ã§ãïŒãã³ãã¬ãŒãïŒæãäžè¬çãªéšåïŒãæéãæ±ãæ©èœããã©ãŒãããæ©èœãããŒã«ãªãŒãŒã·ã§ã³ãããªããŒã¿ãŒ...
AMDãäœæããäœããåå©çšããå¿
èŠãããå Žåã2ã€ã®æ¹æ³ããããŸããAMDãCJSã«æžãæããããnode-requireã䜿çšããŸãã å€ãã®å Žåãäœãå€æŽããå¿
èŠããªãããã2çªç®ã®ãªãã·ã§ã³ãéžæããŸãã ãããã 次ã«ãNode.jsã®æ¢åã®ã¢ãžã¥ãŒã«ããŒãã·ã¹ãã ã«å¯Ÿããå¥åŠãªæœè±¡åã§ãããã¢ãžã¥ãŒã«åŒã®æ··ä¹±ãçŸããŸãã Node.jsã®AMDã¢ãžã¥ãŒã«ãæ¬åœã«å¥œãã§ã¯ãããŸããã§ããã
CJSã¯ãNode.jsãšã®äºææ§ã«å ããŠã
define()
ã©ãããŒãšãé¢æ°æ¬äœããã©ãŒãããããè¿œå ã®ã€ã³ãã³ãã奪ãããŠããŸãã ãã®èŠä»¶ãšãšã¯ã¹ããŒãã¯ã
define()
wayãããèŠèŠçã§ES6ã¢ãžã¥ãŒã«ã«è¿ãã§ãã èªåã§æ¯èŒããŠãã ããïŒ
ES6ã¢ãžã¥ãŒã«
import "dep1" as dep1; import "dep2" as dep2; export var name = function () { return dep1 + dep2; };
CommonJS /ã¢ãžã¥ãŒã«
var dep1 = require("dep1"), dep2 = require("dep2"); exports.name = function () { return dep1 + dep2; };
AMD
require(['dep1', 'dep2'], function (dep1, dep2) { return { name: function () { return dep1 + dep2; } }; });
ãããŠãAMDã«æ»ãå¿
èŠãçãããšããŠãããŸã£ããåé¡ã¯ãããŸãããr.jsãCJSã¢ãžã¥ãŒã«ãã©ããããããã«ãèšå®ã«1è¡ã ãç»é²ããå¿
èŠããããŸãã
2ã¢ãžã¥ãŒã«ãã«ããŒ
ä»æ¥ãCoffeeScriptãæžããªããŠãããã¹ãŠãããŸããããäœããã®åœ¢ã§ã¹ã¯ãªããããã§ãã¯ãåéãå§çž®ããŸãã
CJSã¢ãžã¥ãŒã«ãé©å¿ãããã«ã¯ãã³ã¬ã¯ã¿ãŒãç§ã®ããã«ã§ããã©ãããŒãå¿
èŠã§ãã ã³ã¬ã¯ã¿ãŒã¯ããã¹ãŠã®ã¢ãžã¥ãŒã«ãååšãããã©ãããã¢ãžã¥ãŒã«ã®ååãééãããã©ããããã¹ãŠã®ãã©ã°ã€ã³ã宣èšãããã©ããã確èªã§ããŸãã
ã¢ã»ã³ããªã®çµæãšããŠãäœæ¥ã«å¿
èŠãªã¢ãžã¥ãŒã«ãšã¹ã¯ãªããã®äž¡æ¹ãå«ã1ã€ã®ãã¡ã€ã«ãååŸããããšæããŸãã
ã¢ããªã±ãŒã·ã§ã³ãããã€ã¹ã¯ãªããããšããã€ãã³ã°ã§ã¯ãªããããã£ãã·ã¥ã®ããã«ãïŒããŒãããŒããŒã³ãŒããšã³ãŒããå¥ã
ã«æ¥ç¶ããïŒã«åå²ããããšã¯ãã»ãšãã©åäžããŒãžã®Webã¢ããªã±ãŒã·ã§ã³ãèšè¿°ããä»æ¥ãã£ãã·ã¥ãæŽãæµãããšãã§ãããããæå³ããããŸããã§ããåã ãŸãããªãŒã«ã€ã³ã¯ã³ã¢ã»ã³ããªã«ãããã¢ããã°ã¬ãŒãäžã«ãã¢ãžã¥ãŒã«ããŒããŒããšã®äºææ§ã®åé¡ãåãé€ãããšãã§ããŸãã
3æè»ãªæ§æã·ã¹ãã ïŒäŸåé¢ä¿ãç¶æ¿ãããã¯ã¹ã€ã³
ãã§ã«æžããããã«ãç§ã®ã¢ããªã±ãŒã·ã§ã³ã«ã¯ãããŸããŸãªããã€ã¹ããã©ãŠã¶ãŒãç°å¢ãããã³ãã±ãŒã«çšã®ã¢ã»ã³ããªããããããããŸãã äžèŠãªã³ããŒãšè²Œãä»ããèœæžããããã«æ§ãããªæ§æã·ã¹ãã ãååŸãããã£ãã®ã§ãã
ããšãã°ã
prod
configããããŸã;
dev
configã¯ããããç¶æ¿ãããããã€ãã®ã¢ãžã¥ãŒã«ã眮ãæããŸãã
prod+en
ã
dev+ru
æ··åšãããããšãã§ããæ§æ
ru
ãš
en
ããããŸãã çŸåšããå
±éãã³ããŒããŒã¹ãïŒ
prod-ru
ã
prod-en
ã
dev-ru
ã
dev-en
ïŒã®ä»£ããã«ã4ã€ã®ããã©ã€ãæ§æãã¡ã€ã«ïŒ
prod
ã
dev
ã
ru
ã
en
ïŒãããããŸããã
4 CLI
ããã¯ãäœæ¥ã®ååãè¡ããããããžã®ã€ã³ã¿ãŒãã§ãŒã¹ã§ãã ãããéåžžã«éè² è·ã§ãããã
-- ----
ã
-- ----
å¿
èŠãããå Žåãããã¯
Makefile
ã®å€èŠ³ã«è² æ
ãããå§ãããã®ãããããèµ·åããã®ã«å€ãã®æéã®ç¡é§ã䌎ããããæéãç¯çŽã§ããŸãã
é »ç¹ã«ç¹°ãè¿ãããã¢ã¯ã·ã§ã³ã¯ãå¯èœãªéãç°¡çŽ åããå¿
èŠããããŸãã ãµãã³ãã³ããšåãåŒæ°åã§ããããã©ã«ãå€ã䜿çšããå¿
èŠããããŸãã äžè¬çã«ãéçºè
ãæå°éã®ããšãèŠããŠæžãããã«ããŸãã
æ¯èŒãã
$ tool make -f path/to/build_name.js -o path/to/build.js
ãããŠ
$ tool make build_name
ãããŠä»ãããäžåºŠãªãŒãã³ã³ããªãŒããªãã§ã³ã³ãœãŒã«ã§ãã®é·ãã³ãã³ããæžãåºããšããã®ããŒã«ãå«ãå§ããŸãã 1çªç®ã®ãªãã·ã§ã³ã¯ãããã2çªç®ã®ãªãã·ã§ã³ãããæ瀺çã§ããããšã¯æããã§ãããå®éã«ã¯ã°ã©ãããã¢ãã¯ããŒã«ã®ããã«èŠããŸãã
ã¹ããŒãž6ïŒbrowserify
browserifyã¯ããã©ãŠã¶ã§Node.jsã¢ãžã¥ãŒã«ãå®è¡ã§ããããŒã«ã§ãã
browserify main.js > bundle.js
ãåç
§ããã ãã§æ©èœããŸãã
ãã°ããã®ébrowserifyã䜿çšããåŸãNode.jsç°å¢ããã©ãŠã¶ãŒã§åäœããããã«é©å¿ããããšããçã®ãŠãŒã¹ã±ãŒã¹ã«æ°ä»ããŸããã browserifyã¯ãã®ç®çã«ã¯æé©ã§ãããWebã¢ããªã±ãŒã·ã§ã³ãäœæãããçŸå®ã«ã¯é©ããŠããŸããã é©å¿ãããŠããªããµãŒãããŒãã£ã®ã¢ãžã¥ãŒã«ãããå Žåãã¢ããªã±ãŒã·ã§ã³ã®å€§éšåã®åçãªããŒããããå Žåã ãã¹ãŠãæ©èœããããã«ãã³ã³ãœãŒã«ã§ããèããªããã°ãªããŸããã§ããã
ã¹ããŒãž7ïŒLMD

ç§ã¯æ¬åœã«ãããããããŸããã§ãããã
LMD-ç§ã®äººçã楜ã«ããããŒã«ã«åãçµã¿å§ããªããã°ãªããŸããã§ããã æ¢åã®ããŒã«ãèªåã®ç®æšã«åãããŠã«ã¹ã¿ãã€ãºã§ããªããªããŸããã
ãã®çµæããããžã§ã¯ãã®ã¹ã¯ãªããéšåãçµã¿ç«ãŠãããŒã«ãéçºãããŸããã
LMDã®åºç€ãšãªãããã€ãã®æ©èœã次ã«ç€ºããŸãã
1èšå®ããã®ã¢ã»ã³ããª
æ§æã®ååšã¯é¿ããããªãã®ã§ããããåºã«ããŠæ§ç¯ããŠã¿ãŸãããïŒïŒ lmdã®åäœã¯ãã¢ãžã¥ãŒã«ãšãã©ã°ã€ã³ã®äž¡æ¹ãå«ãŸããæ§æãšãçµæã®ãã¡ã€ã«ã®ãšã¯ã¹ããŒããã¹ã«ãã£ãŠå®å
šã«æ±ºå®ãããŸãã æ§æãç¶æ¿ããä»ã®æ§æãšæ··åã§ããŸãã
ããã¯èšå®ãã©ã®ããã«èŠãããã§ã
{ "name": "My Config", "root": "../js", "output": "../build.lmd.js", "modules": { "main": "index.js" }, "optimize": true, "ie": false, "promise": true }
100åã®ã¢ãžã¥ãŒã«ãããå Žå-åã¢ãžã¥ãŒã«ãconfigã«ç»é²ããå¿
èŠã¯ãããŸããïŒ åãã¿ã€ãã®ã¢ãžã¥ãŒã«ã«å¯ŸããŠãæžãæãã«ãŒã«ããç»é²ããã ãã§ååã§ãã
{ "modules": { "main": "index.js", "<%= file %>Template": "templates/*.html" } }
極端ãªå ŽåãCJSã¢ãžã¥ãŒã«ã®åœ¢åŒã§æ§æãèšè¿°ãããã¹ãŠããã®å Žã§çæã§ããŸãã
2æœè±¡FSïŒãã¡ã€ã«ã·ã¹ãã ãžã®ãã€ã³ãã®æ¬ åŠ
äžæ¹ã§ã¯FSãžã®ãã€ã³ãã¯èªç¶ã§ãããHTTPãµãŒããŒã¯ãã¡ã€ã«ã·ã¹ãã ãäžæã«åæ ã§ããŸãã ãããããã©ãŠã¶ãŒã«ã¯ãã¡ã€ã«ã·ã¹ãã ããªããHTTPãµãŒããŒã¯ãªãœãŒã¹ãæäŸããã³ãŒãã¯ãã®URLã®ãã®ããã¹ããã¢ãžã¥ãŒã«ã§ããããšãæ¢ã«ç解ããŠããããšãèŠããŠãã䟡å€ããããŸãã ãªãœãŒã¹ã¯ãCDNã«ä»»æã®ååã§ç§»åããŠé
眮ã§ããŸãã
æœè±¡ãã¡ã€ã«ã·ã¹ãã ã®å°å
¥ã«ãããã¢ãžã¥ãŒã«ã®æœè±¡åãå¯èœã«ãªããŸãã ããšãã°ãlocale.ru.jsonãšlocale.en.jsonã®äž¡æ¹ãåãã€ã³ã¿ãŒãã§ã€ã¹ãæã£ãŠãããšããäºå®ã®ããã«é衚瀺ã«ã§ãããã±ãŒã«ã¢ãžã¥ãŒã«ããããŸãããããã¡ã€ã«ãå¥ã®ãã¡ã€ã«ã«ééçã«å€æŽã§ããŸãã
ã¢ãžã¥ãŒã«ã«ã¯å¥œããªååãä»ããŠãçžå¯Ÿãã¹ãèããã«æ¥ç¶ã§ããŸãã å€ãã®ã¢ãžã¥ãŒã«ãããããã®ã¢ãžã¥ãŒã«ã®äžã«é ãããŠãããã¡ã€ã«ãå¿ããå Žåã¯ã
lmd info
ã䜿çšããã ãã§ãã
$ lmd info build_name | grep module_name info: module_name â plain â â â info: module_name <- /Users/azproduction/project/lib/module_name.js
3ãªãŒããŒããŒããããŠããªãrequireïŒïŒããã³ãã©ã°ã€ã³
ç§ã¯requireããã¡ã¯ããªãŒã§ããããšã奜ãã§ã¯ãªãã£ãã®ã§ããã®åäœã¯ãããã«æžãçŽãããŸããã 次ã«ãåã«
require()
ãæœè±¡ãã¡ã€ã«ã·ã¹ãã ããã¢ãžã¥ãŒã«ãããŒããããã以å€ã¯äœãããŒãããŸããã
require.*()
ãã©ã°ã€ã³ã䜿çšããŠ
*
ç¬èªã®åŠçãè¡ããŸãã ããšãã°ã
require.js()
ã
$.loadScript
䌌ãJavaScriptãã¡ã€ã«
require.js()
ããŒãããŸãã
ãã©ã°ã€ã³ã¯ãæ§æã«æ瀺çã«èšè¿°ããå¿
èŠããããŸãããLMDã¯ããæ£ããã³ãŒãããèšè¿°ããå Žåã«ãã©ã°ã€ã³ãæå¹ã«ããããšãå¿ããªãã§ãã ããã
ããšãã°ããã®ã³ãŒãã§ã¯ãLMDã¯3ã€ã®ãã©ã°ã€ã³ãcssãparallelãpromiseãå¿ããªãããã«ããŸãã
require.css(['/pewpew.css', '/ololo.css']).then(function () { });
ãããããã®ã³ãŒãã§ã¯ãjsãã©ã°ã€ã³ã®ã¿
var js = require.js; js('http://site.com/file.js').then(function () { });
ç¶æ¿ãšããã¯ã¹èšå®ã䜿çšããŠããã©ã°ã€ã³ãæå¹ãŸãã¯ç¡å¹ã«ã§ããŸãã
4é©å¿ã¢ãžã¥ãŒã«
ãããžã§ã¯ãã«ã¯ãã¢ãžã¥ãŒã«ãåŒã³åºãã®ãé£ãããã¡ã€ã«ãããã€ããããŸãããä»ã®ã¢ãžã¥ãŒã«ãšåæ§ã«äœ¿çšããå¿
èŠããããŸãã LMDã¯ããã«ãæã«ä»»æã®ãã¡ã€ã«ãç°¡åã«é©åãããããããCJSã¢ãžã¥ãŒã«ãäœæã§ããŸãã ããã«ãããã¹ããã¡ã€ã«ïŒãã³ãã¬ãŒãïŒãšJSONãã¡ã€ã«ã䜿çšããããã«ããã©ã°ã€ã³ïŒRequireJSã®ãã©ã°ã€ã³ããã¹ããåç
§ïŒãŸãã¯ã¢ããã¿ãŒãç»é²ããå¿
èŠã¯ãããŸããã åãRequireJS LMDãšã¯ç°ãªãããããã®ãã¡ã€ã«ã¯æ£çŽãªã¢ãžã¥ãŒã«ã«å€æãããshimã§é©åããŸããã
çŸåšãLMDã«ã¯å€æ°ã®ãã©ã°ã€ã³ãšãããã®äœ¿çšäŸãããã³ã¢ã»ã³ããªçšã®çµã¿èŸŒã¿åæã·ã¹ãã ããããŸãã ãããŠãã¡ãããLMDã¯ç§ã®ç掻ã楜ã«ããŸãã LMDã®è©³çŽ°ã«ã€ããŠã¯ãç§ã®èšäºã®ç¯å²ãè¶
ããŠããŸãã 次åã¯ãLMDã®ãµã³ãã«ãããžã§ã¯ãã«é¢ããèšäºãæžããŸãã
æªæ¥ã¯ïŒ

ã¯ãããã¡ããããããã¯ES6ã¢ãžã¥ãŒã«ã§ãã ãããã®åœ¢åŒã¯ãä»ã®èšèªã®ã¢ãžã¥ãŒã«ã®å€ãã®åœ¢åŒãšé¡äŒŒããŠãããJavaScriptã®åå¿è
ã®æåŸ
ã«å¿ããŸãã ãããã«ã¯ãã€ã³ããŒãããšã¯ã¹ããŒããã¢ãžã¥ãŒã«ã©ãããŒïŒè€æ°ã®ãã¡ã€ã«ãé£çµããå¿
èŠãããå ŽåïŒã«å¿
èŠãªãã¹ãŠã®ã¢ãžã¥ãŒã«å±æ§ããããŸãã
CJSãšAMDã§å®å
šã«æŸéãããŸãã ãã ããçŸåšãã©ããã«å«ãŸããŠãã圢åŒã§ã¯ãå®éã®ãããžã§ã¯ãã§äœ¿çšããããšã¯å°é£ã§ãã
ã€ã³ããŒãã¯éçã§ãã ã¢ãžã¥ãŒã«ãã«ããŒã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³ã®èµ·åãé«éåããå¿
èŠããããŸãã å€éšã¢ãžã¥ãŒã«ã®ã€ã³ããŒãã¯ãããã¯ãããŸãïŒ
<script> import {get, Deferred} from "http://yandex.st/jquery/3.0/jquery.min.js"; get('/').then(console.log.bind(console)); </script>
ã»ãŒåãã§ã
<script src="http://yandex.st/jquery/3.0/jquery.min.js"> <script> var get = $.get, Deferred = $.Deferred; get('/').then(console.log.bind(console)); </script>
次ã«ã
<script async/>
ã䜿çšããŠããã¯ã解é€ã§ããŸã
ã¢ãžã¥ãŒã«ã¯åçã«ããŒããããŸãããçŸåšã¯å®å
šã§ã¯ãããŸããã
Loader.load('http://json.org/modules/json2.js', function(JSON) { alert(JSON.stringify([0, {a: true}])); });
ã¢ãžã¥ãŒã«ããŒããŒãããã€ãã®ã¢ãžã¥ãŒã«ã®ã¢ã»ã³ããªãããŒãã§ããããšãé¡ã£ãŠããŸãã ããã§ååã§ãããã
æšæºã¯çŸåšæŽ»çºã«è°è«ãããŠãããä»æ¥ãèŠãããããšã¯ææ¥ã¯ããã§ã¯ãªããããããŸããïŒããããããã§ã¯ãªãã§ãããïŒã çŸåšãã€ã³ããŒã/ãšã¯ã¹ããŒãã®ã¢ãžã¥ãŒã«ãšæ§æã¯ãä»ã®èšèªã§èŠãã®ã«æ
£ããŠãããã®ãšäŒŒãŠããŸãã å€ãã®éçºè
ãJavaScriptã䜿çšããŠãããAMDã®ãããªã¯ã€ã«ãããã¯ãèŠãã®ãçããããããã¯è¯ãããšã§ãã ä»æ¥ãECMAScriptéçºã®æ¹åã®1ã€ã¯ãèšèªãä»ã®èšèªããã®ç¿»èš³ã®ããã®äžçš®ã®ã¢ã»ã³ãã©ãŒã«å€ããããšãç®çãšããŠããŸãã ãããŠãã¢ãžã¥ãŒã«ã¯ãã®æ¹åã®äžå¯æ¬ ãªéšåã§ãã
çµè«
ä»æ¥ãJavaScriptã«ã¯ç¢ºç«ãããã¢ãžã¥ã©ãŒã·ã¹ãã ããªããšèšããŸãããã¢ãžã¥ã©ãŒãšãã¥ã¬ãŒã¿ãŒãããããŸããããES6ã¢ãžã¥ãŒã«æ§æã䜿çšããŠCJSãšAMDã§ã¢ãžã¥ãŒã«ãã³ã³ãã€ã«ããæ©äŒããããŸãã JavaScriptã«ã¯ç¬èªã®é°å²æ°ããããå€ãã®äœ¿ãæ
£ããã€ã³ããŒãã®äœ¿çšãèš±å¯ããªãå€ãã®å¶éïŒãããã¯ãŒã¯ãã¬ãŒãããã©ãã£ãã¯ãé
延ïŒããããŸãã ã¢ã»ã³ããªãšéåæããŒãã®åé¡ã¯ãäžè¬çãªã¢ãžã¥ã©ãŒãšãã¥ã¬ãŒã¿ãŒã§äœããã®åœ¢ã§è§£æ±ºãããŸãããES6éçºè
ãã©ã®ããã«è§£æ±ºãããã¯åé¡ã§ãã
ãããªãšã«
ããªããç§ã®ã¢ãžã¥ã©ãŒãã¹ãç¿åŸããŠããã°ãç§ã®å°ããªã¢ãžã¥ã©ãŒåé¡ã«èå³ããããšæããŸãã
æ¢åã®JavaScriptãã¢ãžã¥ãŒã«ããšãã®ã€ã³ãã©ã¹ãã©ã¯ãã£ãæ©èœå¥ã«åé¡ããŸããã åé¡ã§ã¯ãå€ãã®æ©èœãèæ
®ãããŸãã ã¢ãžã¥ãŒã«ã®åé¡ãèŠãŠãããã¢ãžã¥ãŒã«ã·ã¹ãã ãåé¢ããŸãã
- äŸåé¢ä¿ã®è§£æ±º
- æåå¶åŸ¡
- äŸåé¢ä¿ã¯æ§æã«æžã蟌ãŸããŸã
- äŸåé¢ä¿ã¯ã¢ãžã¥ãŒã«èªäœã«æžã蟌ãŸããŸã
- äŸåé¢ä¿ã¯ã¢ãžã¥ãŒã«ãšæ§æã«ç»é²ãããŸã
- äŸåé¢ä¿ã¢ã¯ã»ã¹
- ä»»æ
- ãã€ãããã¯
- 宣èšç
- ã¢ãžã¥ãŒã«ãããšã¯ã¹ããŒã
- æ··oticãšãã茞åº
- 匷åãªãããŒãžããšã¯ã¹ããŒã
- å³å¯ãªååã®ãèªå·±ãšã¯ã¹ããŒãã
- ã«ã¹ã¿ã ååä»ããšã¯ã¹ããŒã
- æ£çŽãªã€ã³ããŒã/ãšã¯ã¹ããŒã
- ãµã€ãã¢ãžã¥ãŒã«
- çµã¿ç«ãŠãªã
- ãã¡ã€ã«ã®é£çµããã¹ã¯ãã
- ååŠç
- éçäŸåæ§åæ
- æ§æã¢ã»ã³ããª
- ã¢ãžã¥ãŒã«ã®åæåãšè§£é
- èµ·åæã«åæåããã³è§£éãããŸã
- èµ·åæã«åæåããããªã³ããã³ãã§è§£éãããŸã
- ãªã¯ãšã¹ãã«å¿ããŠåæåããã³è§£éãããŸã
- å€éšäŸåé¢ä¿ãããŠã³ããŒããã
- é管çã¢ãžã¥ãŒã«ããŒããŒ
- ãããŒãžãã¢ãžã¥ãŒã«ããŒããŒ
- ã¢ãžã¥ãŒã«ã®åé¢
- ã¢ãžã¥ãŒã«ã¯åé¢ãããŠããŸãã
- åé¢ãããã¢ãžã¥ãŒã«
- ã¢ãžã¥ãŒã«ã¯å®å
šã«åé¢ãããŠããŸã
äŸåé¢ä¿ã®è§£æ±º
ã¢ã»ã³ããªããŒã«ãŸãã¯éçºè
ãããã®ã¢ãžã¥ãŒã«ã®éåžžã®æäœã®ããã«æ¥ç¶/åæåããå¿
èŠãããäŸåé¢ä¿ã決å®ããæ¹æ³ã äŸåé¢ä¿ã¯ãé çªã«äŸåé¢ä¿ãæã€ããšãã§ããŸãã
äŸåé¢ä¿ã®è§£æ±ºã æåå¶åŸ¡
éçºè
ã®è©ã®äŸåé¢ä¿ç®¡çã éçºè
ã¯ãæ¥ç¶ããå¿
èŠãããäŸåé¢ä¿ãåæçã«ç解ããŸãã
<script src="deps/dep1.js"/> <script src="deps/dep2.js"/> <script src="moduleName.js"/>
ãããŠããã«å¿ããŠ
main.js
var moduleName = function () { return dep1 + dep2; };

䜿çšãããµãŒãããŒãã£ã®ã©ã€ãã©ãªã¯ãããŸãã

å€ãã®ã¢ãžã¥ãŒã«ããªãããããããã¹ãŠç¬èªã®ãã®ã§ããå Žåãããã¯åé¡ãããŸãã

å€ãã®ã¢ãžã¥ãŒã«ãããå Žåããã®ãããªã³ãŒãã¯ãµããŒãã§ããŸããã

è€æ°ã®ãã¡ã€ã«=è€æ°ã®ãµãŒããŒèŠæ±
ãã¯ã€ãã¯ãã£ã«ãã«é©ããŠããŸãã
äŸåé¢ä¿ã®è§£æ±ºã äŸåé¢ä¿ã¯æ§æã«æžã蟌ãŸããŸã
äŸåé¢ä¿ã¯å€éšæ§æã«ç»é²ãããç¶æ¿ã§ããŸãã ãã®èšå®ã䜿çšããŠãäžéšã®ã¢ã»ã³ããªããŒã«ã¯ãã®ã¢ãžã¥ãŒã«ã®äŸåé¢ä¿ãããŠã³ããŒã/æ¥ç¶ããŸãã æ§æã¯ãç¹å®ã®ã¢ãžã¥ãŒã«ãšãããžã§ã¯ãå
šäœã®äž¡æ¹ã«å¯ŸããŠèšè¿°ã§ããŸãã
ãã®æ§æã¯LMDã§äœ¿çšãããŸã
{ "modules": { "main": "moduleName.js" "<%= file %>": "deps/*.js" } }
ãããŠããã«å¿ããŠ
main.js
var dep1 = require('dep1'), dep2 = require('dep2'); module.exports function () { return dep1 + dep2; };

ã¢ãžã¥ãŒã«ã¯ãã¡ã€ã«ã·ã¹ãã ã«é¢é£ä»ããããŠããŸããïŒä»»æã®ãã¡ã€ã«ã«ä»»æã®ååãä»ããããšãã§ããŸãïŒ

ã¢ãžã¥ãŒã«ã®ååãå€æŽããã«ããã®å
容ãå€æŽã§ããŸã
ãã®ãããªèšå®ãèšè¿°ããå¿
èŠãããã
è¿œå ã®ããŒã«/ã©ã€ãã©ãªãå¿
èŠã§ããäŸåé¢ä¿ã®è§£æ±ºãäŸåé¢ä¿ã¯ã¢ãžã¥ãŒã«èªäœã«æžã蟌ãŸããŸã
äŸåé¢ä¿ããã¡ã€ã«ãžã®ãã¹ãããã³å®è¡æã«ããããã©ã®ããã«åŒã³åºããããã¯ããã¡ã€ã«èªäœã§å®£èšãããŸããã¢ãžã¥ãŒã«ã¯å®éã«äœæ¥ã«å¿
èŠãªãªãœãŒã¹ã決å®ããããŒããŒã¯ããããæäŸããŸããäŸåé¢ä¿ãšäŸåé¢ä¿ã®äŸåé¢ä¿ãèªã¿èŸŒãŸãããŸã§ãã¢ãžã¥ãŒã«ã¯äœæ¥ãéå§ããŸããããã®ã¡ãœããã¯AMDïŒRequireJSïŒã䜿çšããŸã require(['deps/dep1', 'deps/dep2'], function (dep1, dep2) { return function () { return dep1 + dep2; }; });
1ã€ã®ã¢ãžã¥ãŒã«ã«å€ãã®äŸåé¢ä¿ãããå Žåããã®æ§æã¯éåžžãCommonJSå®çŸ©ã«äœäžããããããããçš®é¡ã®æªã¿ã䜿çšããŸããåé¯ require(['deps/dep1', 'deps/dep2', 'deps/dep3', 'deps/dep4', 'deps/dep5', 'deps/dep6', 'deps/dep7'], function ( dep1, dep2, dep3, dep4, dep5, dep6, dep7) { return function () { return dep1 + dep2; }; });
CommonJSå®çŸ©ã®å£å define(function (require, module, exports) { var dep1 = require('dep1'), dep2 = require('dep2'), dep3 = require('dep3'), dep4 = require('dep4'), dep5 = require('dep5'), dep6 = require('dep6'), dep7 = require('dep7'); return function () { return dep1 + dep2; }; });
ãã®äœäžã䜿çšããå ŽåãRequireJSã¯äŸåé¢ä¿ãå®æçã«æ€çŽ¢ããŸããããã¯95ïŒ
ã®ä¿¡é Œã§ããæ¹æ³ã§ããæ£çŽãªæ¹æ³ïŒASTãŸãã¯å·§åŠãªåŠçïŒã¯ããªãœãŒã¹ïŒã³ãŒããµã€ãºãšåŠçæéïŒãé床ã«æ¶è²»ããŸããããã¹ãŠã®ããŒãºãã«ããŒããããã§ããããŸãããããšãã°ãå®çŸ©æ¹æ³ãããããªãå€ãã¢ãžã¥ãŒã«ãé©å¿ãããããããŸãã¯ããçš®ã®ãæ£çŽãªã¢ãžã¥ãŒã«ããåçã«åæåãããå Žåãªã©ãåãæ¹æ³ã§æ§æãèšè¿°ããå¿
èŠãããå Žårequire('templates/' + type)
ããããŸããåçãªåæåã¯ãŸãã§ãããäž»ã«ãã³ãã¬ãŒãã®åçãªããŒãã«äœ¿çšãããŸãããå¯èœã§ãã
ã»ãšãã©ãã¹ãŠã®äŸåé¢ä¿ã®ãã¡ã€ã«ã«èšè¿°
éåæããŒãããªãã®configs
æžã蟌ã¿èšå®ããå¿
èŠã¯ãããŸããã
ãã ãããšã«ããèšå®ãæžããªããã°ãªããªãå ŽåããããŸãã
è¿œå ã®ããŒã«/ã©ã€ãã©ãªãå¿
èŠã§ãäŸåé¢ä¿ã®è§£æ±ºãäŸåé¢ä¿ã¯ã¢ãžã¥ãŒã«ãšæ§æã«ç»é²ãããŸã
äŸåé¢ä¿ã¯ããã¡ã€ã«èªäœãšç¹å¥ãªæ§æã§ç»é²ãããŸããconfigã¯ãäŸåé¢ä¿ã解決ããããã«ããã±ãŒãžãããŒãžã£ãŒã«ãã£ãŠäœ¿çšãããŸããããšãã°ãnpmããã³package.json
{ "dependencies": { "express": "3.x", "colors": "*" } }
ããã«å¿ã㊠main.js
. . , , .
package.json
.
require('pewpew.js')
,




/ , browserify
, .
äŸåé¢ä¿ãžã®ã¢ã¯ã»ã¹ãä»»æ
ãã¹ãŠã®ã¢ãžã¥ãŒã«ã¯ãã°ããŒãã«ã¹ã³ãŒããŸãã¯åå空éã«ãªãŒãã³ã«ãããŸããåã¢ãžã¥ãŒã«ã¯ãå¶éãªãã«ãã¢ããªã±ãŒã·ã§ã³ã®ããããéšåã«ã©ãããã§ãã¢ã¯ã»ã¹ã§ããŸãã var dep1 = 1; var dep2 = 2; alert(dep1 + dep2);
ã¢ãžã¥ãŒã«ã¯å€ãã¯ãããŸããã圌ãã¯å€§ããªãããŠããªãå Žåãããã¯å€§äžå€«ã
ãã¢ãžã¥ãŒã«ã®å€ãã¯ããã®ã³ãŒããç¶æã§ããªãå Žåã«ã¯
ïŒã°ããŒãã«å€æ°ãŸãã¯åå空éã®ååãæ¢ãããã«ïŒããç®ã¯ã¢ãžã¥ãŒã«ã®äŸåé¢ä¿ã決å®ããããšã¯ã§ããŸããäŸåé¢ä¿ãžã®ã¢ã¯ã»ã¹ããã€ãããã¯
ã¢ãžã¥ãŒã«ãžã®ã¢ã¯ã»ã¹ã¯ããããŒããŒããä»ããŠã®ã¿ååŸã§ããŸããrequire()
ãŸãã¯ãã¢ãžã¥ãŒã«ã®äŸåé¢ä¿ã宣èšããããšã«ããååŸdefine()
ã§ããŸãããã®æ©èœã¯ã°ããŒãã«ã«ã¢ã¯ã»ã¹ããããšãã§ããŸãã var dep1 = require('./deps/dep1'), dep2 = require('./deps/dep2'); alert(dep1 + dep2);
ãããã£ãŠã define()
require(['./deps/dep1', './deps/dep2'], function (dep1, dep2) { alert(dep1 + dep2); });
ç°¡åã«å¿ããŠãèŠã€ãã/ç解ããããã®
äŸåé¢ä¿ãžã®ã¢ã¯ã»ã¹ãç·©åãããããªããæ æ°ãªã©ãã©ã³ã¿ã€ã ããŒã¹ãèšç®ããããã®ã¢ãžã¥ãŒã«ãåæåããããšãã§ããŸã
éçã«å
šäœã®äŸåé¢ä¿ã°ã©ãã®ã»ãšãã©ãå®çŸ©ããããšãå¯èœã§ãã
ã³ãŒãã«åé·ããããããããä¿å®ã®ããã«è¯ãã®ææ°æã
è¿œå ã®ã©ã€ãã©ãªäŸåé¢ä¿ãžã®ã¢ã¯ã»ã¹ã宣èšç
ã¢ãžã¥ãŒã«ã¯ã³ãŒããèšè¿°ãããšãã«å®£èšãããåçã«ã¯ããŒããããŸãããéçã³ãŒãã¢ãã©ã€ã¶ãŒã¯ãã¢ããªã±ãŒã·ã§ã³ã®åäœã«å¿
èŠãªã¢ãžã¥ãŒã«ã®ã»ãããæ確ã«ç解ã§ããŸããã»ãšãã©ãã¹ãŠã®ã€ã³ããŒãæ§é ããã®ããã«æ©èœããŸãã import * from "dep1"; import * from "dep2";
ãŸãããã®æ¹æ³ã§ã¯ãäŸåé¢ä¿ãžã®ã¢ã¯ã»ã¹ã®å±æ§ãå²ãåœãŠãããšãã§ããéçAMDãå®çŸ©ãããŸãïŒïŒ define('module', ['./deps/dep1', './deps/dep2'], function (dep1, dep2) { });
éçã€ã³ããŒãã«ãããã³ã¬ã¯ã¿ãŒã¯äŸåé¢ä¿ãæ§ç¯ã§ããES6ã¢ãžã¥ãŒã«ãã©ã³ã¹ã¬ãŒã¿ãŒã¯ES3äºæã§ã³ãŒãããªã¡ã€ã¯ã§ããŸãã
éç解æãå¯èœïŒå®å
šãŸãã¯éšåçïŒã§
å©çšå¯èœãªæŸéES6ã¢ãžã¥ãŒã«
ãã£ãã«é©çšãã¥ã¢ã¢ãžã¥ãŒã«ãããšã¯ã¹ããŒã
ã»ãšãã©ã®å Žåãã¢ãžã¥ãŒã«ã¯ä»ã®ã¢ãžã¥ãŒã«ã䜿çšã§ãããªãœãŒã¹ãæäŸããŸããããã«ã¯ãããŒã¿ããŠãŒãã£ãªãã£ïŒæ¥ä»ãæ°å€ãi18nãªã©ã®åœ¢åŒïŒã䜿çšã§ããŸããã¢ãžã¥ãŒã«ãããšã¯ã¹ããŒããããšããã®ãããªãªãœãŒã¹ãæäŸããŠãããšããã¢ãžã¥ãŒã«ã®è¡šç€ºæ¹æ³ã決ãŸããŸãããšã¯ã¹ããŒããæ··oticãšãã茞åº
ã¢ãžã¥ãŒã«ã¯ãäœã§ããã©ãã§ãããã€ã§ããšã¯ã¹ããŒãããŸã var a = 10, b = ''; for (var i = 0; i < a; i++) { b += i; } var dep1 = b;

å°çãšæªå€¢ã®ã°ããŒãã«ãªç¯å²ãè©°ãŸãããããããã«ããŠããããã¯ååãšããŠãµããŒããããŠããŸãããšã¯ã¹ããŒãã匷åãªãããŒãžããšã¯ã¹ããŒã
IIFEãè¿œå ããŠä»¥åã®ã¡ãœãããå°ãå€æŽãããšããã®ã¡ãœãããåŸãããŸããã¢ãžã¥ãŒã«ã¯ãã©ãã«ããã®ããäœãåŒã³åºãã®ããäºåã«ç¥ã£ãŠããŸãã var dep1 = (function () { var a = 10, b = ''; for (var i = 0; i < a; i++) { b += i; } return b; })();
ãŸãã¯ãããã«ç°ãªããªãã·ã§ã³ (function () { var a = 10, b = ''; for (var i = 0; i < a; i++) { b += i; } exports.dep1 = b; })(exports);
ãŸãã¯AMDãšããåå define('dep1', [], function () { var a = 10, b = ''; for (var i = 0; i < a; i++) { b += i; } return b; });
ãã®
ãããªã¢ãžã¥ãŒã«ããã«ãããŠäœ¿çšããã®ã«ç¹å¥ãªããŒã«ã¯å¿
èŠãããŸããïŒAMDãé€ãïŒã
å¿
èŠãªãã®ã ãããšã¯ã¹ããŒããããŸãã
ã¢ãžã¥ãŒã«ã¯ããšã¯ã¹ããŒãå
ãšãã®ååãç¥ã£ãŠããŸãããšã¯ã¹ããŒããå³å¯ãªååã®ãèªå·±ãšã¯ã¹ããŒãã
ãã®ã¡ãœããã¯ããã¢ãžã¥ãŒã«ãç»é²ããããšããç¹å¥ãªæ©èœã«åºã¥ããŠready()
ããŸããã¢ãžã¥ãŒã«ã¯ãæºåãã§ãããåŒã³åºãå¿
èŠããããŸããã¢ãžã¥ãŒã«ã®ååãšãããæäŸãããªãœãŒã¹ãšãã2ã€ã®åŒæ°ãåããŸãã (function () { var a = 10, b = ''; for (var i = 0; i < a; i++) { b += i; } ready('dep1', b); })();
æ©èœã®ã¢ãžã¥ãŒã«ã®äŸåé¢ä¿ãããŒãããããã«ã¯äœ¿çšãããŠããload()
ããšåæ§require()
load('dep1', 'dep2', function (dep1, dep2) { ready('dep3', function () { return dep1 + dep2; }); });
load('dep3', do.stuff);
ã¢ãžã¥ãŒã«ã¯éåæã«ãšã¯ã¹ããŒãããããšã¯ã¹ããŒããé
ãããããšãã§ããŸãã
ã¢ãžã¥ãŒã«ã¯ã©ãã«ãããããããŸããã
ã¢ãžã¥ãŒã«èªäœã¯ãšã¯ã¹ããŒããããŸãïŒã¢ãžã¥ãŒã«ã¯ããã䜿çšããã¢ãžã¥ãŒã«ã«åŸå±ããŸãïŒã
ã¢ãžã¥ãŒã«ã¯ãã®ååãç¥ã£ãŠãããåçã«å€æŽãã
ããšãã§ã
ãŸãããšã¯ã¹ããŒããã«ã¹ã¿ã ååä»ããšã¯ã¹ããŒã
ã¢ãžã¥ãŒã«ã¯ããã®ååããããã©ãã«ããããç¥ããŸãããã¢ãžã¥ãŒã«ã®ã³ã³ã·ã¥ãŒããŒèªèº«ããã³ã³ã·ã¥ãŒããŒã®ã³ã³ããã¹ãã§åŒã³åºãããã¢ãžã¥ãŒã«ã決å®ããŸããããã¯CommonJSã¢ãžã¥ãŒã«ã§ã var a = 10, b = ''; for (var i = 0; i < a; i++) { b += i; } module.exports = b;
ãŸãã¯å¿åã®AMD define([], function () { var a = 10, b = ''; for (var i = 0; i < a; i++) { b += i; } return b; });
ã¢ãžã¥ãŒã«ã®ãšã¯ã¹ããŒãäžã«ä»»æã®ååã䜿çšã§ããŸãã var dep1 = require('deps/dep1');
圌ã¯ããã䜿çšãããšãã«åŒã³åºãããŸãã©ã®ããã«ããããã©ãã¢ãžã¥ãŒã«ãç¥ããªã
ããªãã¯ã¢ãžã¥ãŒã«ã®ååãå€æŽããå Žåã«ã®ã¿ããã¡ã€ã«ã®ååãå€æŽããå¿
èŠããã
ãçµã¿ç«ãŠããã³äœ¿çšã®ããã®ã©ã€ãã©ãªã®å¿
èŠæ§ãšã¯ã¹ããŒããæ£çŽãªã€ã³ããŒã/ãšã¯ã¹ããŒã
ã¢ãžã¥ãŒã«ã宣èšãããã®ã¡ãœããã¯ã2ã€ããã®ããã°ã©ãã³ã°èšèªã䜿çšããŸããECMAScript 6ã¢ãžã¥ãŒã«ä»æ§ã¯ããªãåã«ç»å Žããã®ã§ãé
ããæ©ãããã®ãããªæ§æã¯JavaScriptã§æäŸãããã§ããããã¢ãžã¥ãŒã«ã宣èšããŸãã module "deps" { var a = 10, b = ''; for (var i = 0; i < a; i++) { b += i; } export var dep1 = b; export var dep2 = b + 1; }
ãã€ã³ãã£ã³ã°ãªãã§ã¢ãžã¥ãŒã«ã宣èšããããšãã§ããŸãmodule {}
ã
ããã©ã«ãã®ååã䜿çšããŠãããå°ãªãæžãããšãã§ããŸã import * from "deps"; console.log(dep1);
ååã®ç«¶åã¯ãäžçš®ã®ãåå空éãã䜿çšããŠåé¿ã§ããŸã import "crypto" as ns; console.log(ns.dep1);
ã¢ãžã¥ãŒã«ã®äžéšããšã¯ã¹ããŒãã§ããŸã import {dep1} from "deps"; console.log(dep1);
䜿ãæ
£ããèŠèŠçãªå€ãã®èšèªããã®éŠŽæã¿ã®ããã€ã³ããŒã
ããã¯ECMAScript 6
ã§ããããšãã°ãTypeScriptã®ã¢ãžã¥ãŒã«ã䜿çšãããªã©ãES6ã¢ãžã¥ãŒã«ãES3äºæã³ãŒãã«å€æããå¿
èŠããããŸãããµã€ãã¢ãžã¥ãŒã«
ä»æ¥ãã¢ãžã¥ãŒã«ãå«ããã»ãŒãã¹ãŠãé²è¡äžã§ããCoffeeScriptãšAMDã䜿çšããªãå Žåã§ãããããã«ãããããžã§ã¯ããçµã¿ç«ãŠãŸãïŒãã¡ã€ã«ãé£çµããå§çž®ããŸããçµã¿ç«ãŠãªã
HTMLã®ãã¹ãŠ <script src="deps/dep1.js"/> <script src="deps/dep2.js"/> <script src="moduleName.js"/>
ããã¯åã«ãã
ããããªã¯ãšã¹ãæ°ã®å¢å ãé
ãããããã«ãã¢ããªã±ãŒã·ã§ã³ãåæ¢ããéå§ã«ãã£ãŠãµããŒããããã¢ãžã¥ãŒã«ã®æ°ãå¢ããããšã«ããã
HTMLãšã³ãã£ãã£ãšå®£èšã¢ãžã¥ãŒã«ããã·ã³ã°
æ°ãããã«ãã-æ°ãã.htmlãã¢ãžã¥ãŒã«ã®çµã¿ç«ãŠããã¡ã€ã«ã®é£çµããã¹ã¯ãã
éãã $ cat **/*.js > build.js
䜿çšãã <script src="build.js"/>
ç°¡åã§ãã
ã¢ããããŒããããã¡ã€ã«ã¯1ã€ã ãã§ãã
åã¿ã€ãã®ã¢ã»ã³ããªã«ã€ããŠãæ°ããã¹ã¯ãªãããäœæããå¿
èŠããããŸãã
ãã¡ã€ã«ã¯ãç°ãªãOSããã³FSã§ä»»æã®é åºã§ã¢ã»ã³ãã«ã§ããŸããã¢ãžã¥ãŒã«ã®çµã¿ç«ãŠãååŠç
æ¹æ³ã¯ããã¡ã€ã«å
ã®ç¹å¥ãªãã¿ã°ããæ€çŽ¢ããããšã§ã- include('path/name.js')
ãŸãã¯// include path/name.js
åæ§ã® include('deps/dep1.js'); include('deps/dep2.js'); var moduleName = function () { return dep1 + dep2; };
ãããã¯ãã¹ãŠããã®åœ¢åŒã®ç¹å¥ãªãŠãŒãã£ãªãã£ã«ãã£ãŠå±éãããŸãã var dep1 = 1; var dep2 = 2; var moduleName = function () { return dep1 + dep2; };
ãããã£ãŠããã¹ããããã¢ãžã¥ãŒã«ã«ã¯äŸç¶äŸåé¢ä¿ããããååž°çã«ããŒããããŸãã
ããã®ã¿1ãã¡ã€ã«
ãªããã®ç¶æ¿ã®configsããäœãããšã¯ã§ããŸãã
ã¢ã»ã³ããªã®åã¿ã€ãã®ããã«ã¯ããã¹ãŠã®ãªã¹ãã«æ°ãããã¡ã€ã«ãäœæããå¿
èŠãããinclude
ãªãã°ãããªããã»ããµæããªããšã®å¯èœãªã³ãŒãã®éè€ãä»ã®ã¢ãŒãã£ãã¡ã¯ã
ãã®ã¢ãžã¥ãŒã«ã«ã³ãŒãã®èª€çšã®å¯èœãªæ³šå
¥ã®æŽåæ§ãžã®ã¢ãžã¥ãŒã«ã®ãªãŒãç·ãžã®ã³ãŒãã®æ³šå
¥ã¢ãžã¥ãŒã«ã§ã¯ã"use strict"
ååã®ç«¶åããã®ä»ã®åé¡ãçºçããŸãããããå
žåçãªäŸã§ã (function () { "use strict"; var i = 3; include('dep1');
ãããŠåœŒã®äžæ¯ var i = 4, dep = 01234;
çµæãç解ããŠãããšæã;-)ã¢ãžã¥ãŒã«ã®çµã¿ç«ãŠãéçäŸåæ§åæ
äŸåé¢ä¿æ€çŽ¢ã«ããã¢ãžã¥ãŒã«ã³ã³ãã³ãã®éçåæããã®ã¡ãœããã¯ãr.jsïŒRequireJSã¢ãžã¥ãŒã«ã®ã³ã¬ã¯ã¿ãŒïŒããã³browserifyïŒCommonJSã¢ãžã¥ãŒã«ã®ã¢ããã¿ãŒããã³ãã©ãŠã¶ãŒã®Node.jsã€ã³ãã©ã¹ãã©ã¯ãã£ïŒã䜿çšããŸããASTããŒãµãŒã䜿çšããŠãdefine / requireåŒã³åºããæ¢ããäŸåé¢ä¿ãèŠã€ããincludeãšã¯ç°ãªãããããã®äŸåé¢ä¿ãã¢ãžã¥ãŒã«ã®å€åŽã«çœ®ããŸããããšãã°ããã®ãããªã¢ãžã¥ãŒã« require(['dep1', 'dep2'], function (dep1, dep2) { return function () { return dep1 + dep2; }; });
r.jsãä»ããŠãã©ã€ãããå Žåããã®ãã©ãŒã ã§ããã§ããçŽãããŸãã define('dep1', [], function () { return 1; }); define('dep2', [], function () { return 2; }); require(['dep1', 'dep2'], function (dep1, dep2) { return function () { return dep1 + dep2; }; });
åæ§ã«browserifyã«åäœããŸãããåéããããè€éãªãã©ãŒããã
ã®ã¿1ãã¡ã€ã«ã«è¡ã
ãã¹ãŠã®äŸåé¢ä¿ã¯ãã¢ãžã¥ãŒã«ã«ç»é²ãããŠãã
ã¢ã»ã³ããªã®çš®é¡ããšã«æ°ãããã¡ã€ã«ãäœæããããã·ã³ããªãã¯ãªã³ã¯ã§ããžãã¯ãè¡ãããšãå¿
èŠã§ãã
ããªããã»ããµïŒåçã¢ãžã¥ãŒã«åã«ãã£ãŠæ§ç¯ïŒããã€ãã®äŸåé¢ä¿ãèŠã€ããããšãã§ããªã
åã®æ®µèœãä¿®æ£ããã«ã¯ãããã®ã¢ãžã¥ãŒã«ãæå¹ã«ããããã«èšå®ãæžãå¿
èŠããããŸããµã€ãã¢ãžã¥ãŒã«ãæ§æã¢ã»ã³ããª
ããã§ã¯ãã¹ãŠãæããã§ããæ§æã§ã¯ãå¿
èŠãªã¢ãžã¥ãŒã«ãã³ã¬ã¯ã¿ãŒã¯ããããã¢ã»ã³ããªã«å«ããäŸåé¢ä¿ãèŠã€ããŸãããã®åŸãã¢ãã©ã€ã¶ãŒã«ãã£ãŠã¢ã»ã³ããªã®çµæãéçã«ãã§ãã¯ãããŸããã¢ãã©ã€ã¶ãŒã¯ãäœãã®è¿œå ãŸãã¯åé€ãå§ããŸãããã®ã¡ãœããã¯LMDã䜿çšããŸãã { "root": "../js", "modules": { "main": "main.js", "dep1": "deps/dep1.js", "dep2": "deps/dep2.js" } }
ãã¡ããããã®ãªãã·ã§ã³ã¯èå³æ·±ããã®ã§ããããªãã¢ãžã¥ãŒã«ãšæ§æã«åãããšã2åæžãã®ã§ããïŒïŒããã¯ç°¡åã«èª¬æã§ããŸãã LMDã¯ãã¡ã€ã«ã·ã¹ãã ãèªèãããå®éã«ã¯æ§æã¯æœè±¡ãã¡ã€ã«ã·ã¹ãã ã§ããããã«ãããçžå¯Ÿãã¹ãèæ
®ããã«ãã¢ãžã¥ãŒã«ã®è»¢é/ååå€æŽäžã«ããããžã§ã¯ãå
šäœã§ãã¹ãå®è¡ãŸãã¯å€æŽããªãã§ãã ãããæœè±¡FSã䜿çšãããšãããŒã«ãªãŒãŒã·ã§ã³ãç°å¢èšå®ã®çœ®æãããã³ãã®ä»ã®æé©åã®ããã®å®äŸ¡ãªäŸåæ§æ³šå
¥ãååŸã§ããŸãããŸããã¢ãžã¥ãŒã«ãåçã«æ¥ç¶ãããéçã¢ãã©ã€ã¶ãŒãããããç©ççã«èŠã€ããããšãã§ããªããããæ§æã§ã¢ãžã¥ãŒã«ã«é¢ããèšé²ãäœæããå¿
èŠããããŸããæ¯åconfigã«ã¢ãžã¥ãŒã«ãç»é²ããããšã¯äžæ©åŸéããããšã¯æããã§ãããããã£ãŠãLMDã§ã¯ãglob-ingã䜿çšããŠãã£ã¬ã¯ããªå
šäœããµããã£ã¬ã¯ããªã«æ¥ç¶ããããšãå¯èœã§ããæžãæãã«ãŒã«ã®äžçš®ããã®æ§æã¯ãåã®æ§æãšåãã§ãã { "root": "../js", "modules": { "<%= file %>": "**/*.js" } }
ã©ã®ãã¡ã€ã«ãå¿
èŠããå€æãããã³ãã¬ãŒããäœæããŠããã®LMDã¢ãžã¥ãŒã«ã§ã®è¡šç€ºæ¹æ³ãæå®ããŸããååã決å®ããããã«ãLMDã¯lodashã®ãã³ãã¬ãŒããšã³ãžã³ã䜿çšãããããããããªãããŒãªæ§é ãèšè¿°ã§ããŸãã { "root": "../js", "modules": { "<%= file %><%= dir[0][0].toUpperCase() %><%= dir[0].slice(1, -1) %>": "{controllers,models,views}/*.js" } }
ãã®æ¹æ³ã®çµæã¯ä»¥äžã®ãšããã§ãã
èŠèŠ-ãã¹ãŠã®ãããžã§ã¯ãããªãŒã1ã€ã®ãã¡ã€ã«ã«èšè¿°ããããšãã§ããŸã
å®å
šã«-é€å€ããŒãµãšã©ãŒ
æœè±¡ãã¡ã€ã«ã·ã¹ãã ã
èšå®æžã蟌ãå¿
èŠããã
å¿
èŠæ§ã³ã¬ã¯ã¿ãã¢ãžã¥ãŒã«ã®åæåãšè§£é
ããã¯ã倧éã®ã³ãŒããå®è¡ããããšãã«ã¢ããªã±ãŒã·ã§ã³ã®èµ·åæã®é
延ãæžããããšãã§ããéèŠãªãã€ã³ãã§ããã³ãŒããããŒãžã«å°éãããšãåæåäžã«ã³ãŒããåæåããïŒé¢æ°ãäœæããäœããã®ååã§ç»é²ãããŸãïŒãã³ãŒãã解æãããæ€èšŒãããŠããããªã解éãšå¯èœãªJITã³ã³ãã€ã«ã®ããã«ASTã«æž¡ãããŸããé¢æ°ãåŒã³åºããããšããã®ã³ãŒãã解éãããŸããé¢æ°ã¯åæåãŸãã¯è§£éãããŸãããJavaScriptæååã®ã¿ãåæåãããŸãã 'function a() {return Math.PI;}';
é¢æ°ãåæåãããŸãã function a() { return Math.PI; }
é¢æ°ã¯åæåããã解éãããŸãã function a() { return Math.PI; } a();
åé¢æ°ã®å®£èšãšãã®åŒã³åºãã«ã¯ãç¹ã«ã¢ãã€ã«ã§ã¯æéããããããããã®æéãççž®ãããšããã§ããããèµ·åæã«åæåããã³è§£éãããŸã
ã¢ãžã¥ãŒã«ã¯ãã®ãŸãŸæäŸãããããã°ã©ã ã®éå§æã«å®è¡ãããŸããããšãä»åœŒãããªããŠã ã芧ã®ãšãããã¢ãžã¥ãŒã«ã«ã¯äœæ¥ã®é床ãäœäžãããå¯èœæ§ã®ãããµã€ã¯ã«ãããã€ããããŸãã var dep1 = (function () { var a = 10, b = ''; for (var i = 0; i < a; i++) { b += i; } return b; })();
è¿œå ã®ããŒã«ã䜿çšããå¿
èŠã¯ãããŸããã
ã³ãŒãã倧ãããªãå Žåãåæåæéã¯éèŠã§ã¯ãããŸããã
ã³ãŒãã®éãå¢ãããšãã¹ã¿ãŒãã¢ããã¬ã€ãã³ã·ã衚瀺ããå§ããŸããèµ·åæã«åæåããããªã³ããã³ãã§è§£éãããŸã
AMDãšNode.jsã®ã¢ãžã¥ãŒã«ã®äž¡æ¹ã§äœ¿çšãããŠããéåžžã«äººæ°ã®ããæ¹æ³ define('dep1', [], function () { var a = 10, b = ''; for (var i = 0; i < a; i++) { b += i; } return b; });
ãã®ã¢ãžã¥ãŒã«ã¯èµ·åæã«åæåãããŸãããããã圌ã®äœã¯èŠæ±ã«å¿ããŠå®è¡ãããçµæã¯return b;
ãã£ãã·ã¥ããã次ååŒã³åºããããšãã«è§£éã¯ãã¹ããŸããã
ã¢ãžã¥ãŒã«ã®éåžžã«åŒ·åãªãã¥ãŒã«å€æŽããå¿
èŠã¯ãããŸã
倧éã®ã³ãŒããæã«ã¹ã¿ãŒãã¢ããåŸ
ã¡æéã倧å¹
ã«ççž®ãããŠããªã
è¿œå ã®ã©ã€ãã©ãªãå¿
èŠãªã¯ãšã¹ãã«å¿ããŠåæåããã³è§£éãããŸã
ã³ãŒãã®åæåãé
ãããããšãã§ããã以åã®ã¡ãœããã®å°ããªå€æŽãäž»ã«ã¢ãã€ã«ããã€ã¹ã§ã®ã³ãŒãããŠã³ããŒãã®æé©åã«äœ¿çšãããŸãããã®ãããªæé©åã¯ãRequireJSããã³LMDã§å®è¡ã§ããŸããLMDã¢ã»ã³ããªããŒã¹ïŒæ§æã§ã¯ãªãïŒ { 'dep1': '(function(){var a=10,b="";for(var i=0;i<a;i++){b+=i;}return b;})' }
äžéšã®ã¢ãžã¥ãŒã«ã«ã¢ãžã¥ãŒã«ãªãœãŒã¹ãå¿
èŠãªå Žådep1
ãLMDã¯ãã®ã³ãŒãã解éããŠåæåããŸãããã®ãããªãã®ïŒ var resources = new Function('return ' + modules['dep1'])()(require, module, exports);
ã³ãŒãã®åæåæéã¯ãnew Function
æ£çŽãªåæåãããå°ãé
ããªãå ŽåããããŸããããã®æé©åãè³¢æã«äœ¿çšããã°ãæåããæéã皌ãããšãã§ããŸããnew Function
ãšã¯ç°ãªãeval()
ãçæãããã³ãŒãã¯JITã³ã³ãã€ã©ãŒã«ãã£ãŠæé©åã§ããŸãã
ãã®æäœã¯éçºè
ã«å¯ŸããŠééçã§ããã
è¿œå ã®ã©ã€ãã©ãªã
å¿
èŠã§ããå€éšäŸåé¢ä¿ãããŠã³ããŒããã
ãã§ã«è¿°ã¹ãããã«ãJavaScript @ DOMã«ã¯ç¬èªã®é°å²æ°ããããããã¢ãžã¥ãŒã«ãããŒãããéåžžã®æ¹æ³ã¯ããã§ã¯æ©èœããŸãããã¢ãžã¥ãŒã«ã¯ãªã¢ãŒãã«ããããããã®åæããŒãã¯çŸå®çã§ã¯ãããŸããããã¹ã¯ãããã¢ããªã±ãŒã·ã§ã³ã§ãå
ã®é床ã§ãã©ã€ãã©ãªãåæçã«ãªã³ã¯ã§ããå ŽåãJavaScript @ DOMã§ã¯ãEventLoopã®ãããã¯ã«ãããããã¯ã»ãšãã©çŸå®çã§ã¯ãããŸãããäžåºŠã«ãã¹ãŠãããŒãããããšã¯ã§ããªãã®ã§ãäœããçºæããŠèŠããå¿
èŠããããŸã:)é管çã¢ãžã¥ãŒã«ããŒããŒ
éå®è¡ã¢ãžã¥ãŒã«ãšã¯ãè¿œå ã®åŠçãå¿
èŠãšããªãã³ãŒããæå³ããŸããããšãã°ããã®ãããªããŒããŒjQuery.getScript(file)
ã¯æ¬¡ã®ãããªãã®ã§ãã var script = document.createElement('script'); script.src = file; script.onload = done; document.head.appendChild(script);
è€æ°ã®ã¢ãžã¥ãŒã«ãåæã«ããŒãããå Žåããããã¯ããŒãé ã«å®è¡ãããŸãããã®ãããã¢ãžã¥ãŒã«ããªã¹ããããŠããé åºã§å®è¡ããå¿
èŠããããŸããããšãã°ãLAB.jsã©ã€ãã©ãªã¯ãXHRã䜿çšããŠåæã«ã¹ã¯ãªããã³ãŒããèªã¿èŸŒã¿ããã®ã³ãŒããé çªã«å®è¡ããŸããXHRã¯ããã®å¶éãå°å
¥ããŸãã $LAB .script("framework.js").wait() .script("plugin.framework.js");
YepNopeãscript.jsãªã©ã®ãã®ä»ã®ããŒããŒã¯ãã»ãŒåãããšãå®è¡ããŠããŸãã
å®äŸ¡ãªãœãªã¥ãŒã·ã§ã³
XHRã®äžéšã«å¶éãããããè¿œå ã®èšè¿°ããããŸãããããŒãžãã¢ãžã¥ãŒã«ããŒããŒ
æ人ã®ã¢ãžã¥ã©ãŒã·ã¹ãã ã«ã¯ç¬èªã®ããŒããŒãä»å±ããŠãããã¢ãžã¥ãŒã«ãšãã®äŸåé¢ä¿ãããŒãã§ããŸããäŸãã°ããããæ©èœãrequire()
ãšdefine()
RequireJSã®ããRequireJSã®é¢æ°require()
ã¯ãå¿
èŠãªäŸåé¢ä¿ãšäŸåé¢ä¿ã®äŸåé¢ä¿ãèªã¿èŸŒã¿ãæå®ãããé åºã§ãããã®ã¢ãžã¥ãŒã«ã®ã³ãŒããå®è¡ããŸãã require(['dep1', 'dep2'], function (dep1, dep2) { console.log(dep1 + dep2); });
ããšãã°ãLMDã«ã¯ããã³ãã«ã®ãããªãã®ããããŸã-ããã€ãã®ã¢ãžã¥ãŒã«ã1ã€ã®ãã¡ã€ã«ã«ãŸãšããããŠããŸãããã®ãã³ãã«ãããŒããããšããã¹ãŠã®ã¢ãžã¥ãŒã«ããã¹ãŠã®ã¢ãžã¥ãŒã«ã§å©çšå¯èœã«ãªããŸãã _e4fg43a({ 'dep1': function () { return 1; }, 'dep2': 2, 'string': 'Hello, <%= name %>!' });
require.bundle('name').then(function () {
ã¢ãžã¥ãŒã«ã®ããŒããšåæåã®äž¡æ¹ã®ç®¡ç;
éçºè
ã«ãšã£ãŠã»ãšãã©ééçãªããŠã³ããŒã;
è¿œå ã®ããŒã«ãšèšå®ãå¿
èŠã¢ãžã¥ãŒã«ã®åé¢
ã¢ãžã¥ãŒã«ã®ã»ãã¥ãªãã£ãŸãã¯åé¢ã¯ãäœæ¥ãäžæããéçºè
ã§ã¯ãªãéçºè
ã«å¿
èŠã§ããã¢ãžã¥ãŒã«ã®ããããã£ãžã®çŽæ¥ãã€ç¡ç§©åºãªã¢ã¯ã»ã¹ã¯ãäžé©åã«äœ¿çšããããšãã³ãŒããå°ç¡ãã«ãããå¯èœæ§ããããŸããäžæ¹ãã°ããŒãã«ã¹ã³ãŒãã«JavaScriptã®çè·¡ããªãå Žåãã³ãŒãã®ç 究è
ãäœããç解ããŠããã¬ã€ã¯ãããããšã¯ããå°é£ã«ãªããŸãããããã§ã¯æéã®åé¡ã§ããã¢ãžã¥ãŒã«ã¯åé¢ãããŠããŸãã
ã¢ãžã¥ãŒã«ãŸãã¯ãã®äžéšã¯ã°ããŒãã«ã«ã¢ã¯ã»ã¹å¯èœã§ãéçºè
ã¯ã©ãããã§ãå©çšã§ããŸãã var dep1 = (function () { var a = 10, b = ''; for (var i = 0; i < a; i++) { b += i; } return b; })();
ç¹°ãè¿ããŸãããããã¯ç°¡åã§ãã
ããŒã«ã¯äžèŠã§ãã
åå空éã«ã€ããŠèããå¿
èŠ
ããããŸããã¢ãžã¥ãŒã«ã®åæ¥ã¯ãããŸããã圌ã¯ä»äºãããäŸåé¢ä¿ã®åãåãã管çããŸããåé¢ãããã¢ãžã¥ãŒã«
ã¢ãžã¥ãŒã«ã¯ã°ããŒãã«ã«ã¢ã¯ã»ã¹ã§ããŸããããåå-ãç¥ãããšã§ååŸã§ããŸãrequire('pewpew')
ãç§ãèšã£ãããã«ãé衚瀺ã¯ã¢ãžã¥ãŒã«åŒã·ã¹ãã ã®ç®æšã§ã¯ãªããçµæã§ããAMDã¯ãããªããäœããã®åœ¢ã§ã¢ãžã¥ãŒã«ãžã®ã¢ã¯ã»ã¹ãåŸãããšãå¯èœãª2ã€ã®æ©èœããã-ãããrequire()
ããŠdefine()
ããªãœãŒã¹ãååŸããã«ã¯ãã¢ãžã¥ãŒã«ã®ã³ãŒãåãç¥ãã ãã§ååã§ãã define('dep3', ['dep1', 'dep2'], function (dep1, dep2) { return function () { return dep1 + dep2; }; });
ã¢ãžã¥ãŒã«ã¯ä»ã®ã¢ãžã¥ãŒã«ããåé¢ãããŠããããã誀ã£ãŠäœããæãªãããšã¯ãããŸããã
å¥ã®ã¢ãžã¥ãŒã«ãžã®ã¢ã¯ã»ã¹ã¯æ瀺çã«å®£èšãããŠã
ãŸããã¢ãžã¥ãŒã«ã¯å®å
šã«åé¢ãããŠããŸã
ãã®ãããªã¢ãžã¥ãŒã«ã®ç®çã¯ãå€éšããã¢ãžã¥ãŒã«ã«å°éã§ããªãããã«ããããšã§ããç§ã¯å€ãã®äººããã§ã«ãã®ãããªãã¢ãžã¥ãŒã«ããèŠãããšããããšæããäŸãã°ïŒ $(function () { var dep1 = (function () { var a = 10, b = ''; for (var i = 0; i < a; i++) { b += i; } return b; })(); $('button').click(function () { console.log(dep1); }); });
å®éãããã¯å®å
šã«éé¢ãããã¢ãžã¥ãŒã«ã§ãããå€éšããå
éšã«å°éããããšã¯äžå¯èœã§ããããããããã¯1ã€ã®ã¢ãžã¥ãŒã«ã®äŸã§ãããã®ãããªåã¢ãžã¥ãŒã«ããã¯ããŒãžã£ãã«ã©ãããããŠããå Žåããããã¯çžäºäœçšã§ããŸãããè€æ°ã®ã¢ãžã¥ãŒã«ãåé¢ããã«ã¯ãããããå
±éã®ã¹ã³ãŒãã«é
眮ããããã¹ã³ãŒãå
ã®ããã€ãã®å
±éãªãœãŒã¹ãã¹ããŒããŸãããããã®ãªãœãŒã¹ã䜿çšãããšããã®ãããªã¢ãžã¥ãŒã«ã¯äºãã«éä¿¡ã§ããŸããIEFEã§ãã®ãããªã¢ãžã¥ãŒã«ãã©ããããã ãã§ååã§ãã (function () { var dep1 = 1; var dep2 = 2; var moduleName = function () { return dep1 + dep2; }; })();
ãã®ãã«ãæ¹æ³ã§ã¯ãããšãã°jQueryã䜿çšããŸããLMDãšbrowserifyãã¢ãžã¥ãŒã«ãç°å¢ããå®å
šã«åé¢ããŸããããªãŒã«ã€ã³ã¯ã³ã¢ã»ã³ããªãšã¯ç°ãªãããããã®ã¢ãžã¥ãŒã«ã¯äºãã«ããŸãã¢ã»ã³ããªã®ãå¶åŸ¡éšåãããåé¢ãããŠããŸãã圌ãã¯ãã®ããã«åã£ãŠããŸãïŒ (function (main, modules) { function lmd_require() {}
åçŽãªã±ãŒã¹ã§ã¯ãå®å
šãªçµ¶çžãç°¡åã«éæã§ããŸãã
ä»ã®ã±ãŒã¹ã§ã¯ãè¿œå ã®ããŒã«ãå¿
èŠã§ã人æ°ã®ããJavaScriptã¢ãžã¥ãŒã«ãšãã¥ã¬ãŒã¿ãŒã®æ¯èŒè¡š
| AMDãYUI | ES6 | CJS / LMD | IEFE |
---|
äŸåé¢ä¿ã®è§£æ±º | ã¢ãžã¥ãŒã«+ config | ã¢ãžã¥ãŒã«å
| æ§æ㧠| ããã¥ã¢ã« |
---|
äŸåé¢ä¿ã¢ã¯ã»ã¹ | ãã€ããã㯠| 宣èšç | ãã€ããã㯠| ä»»æ |
---|
茞åºãã | ä»»æã®åå㧠| æ£çŽãªã€ã³ããŒã/ãšã¯ã¹ããŒã | ä»»æã®åå㧠| æ··oticãšãã/å¶åŸ¡äžèœ |
---|
ãµã€ãã¢ãžã¥ãŒã« | éç解æ | äžèŠ/é£çµ | æ§æã¢ã»ã³ã㪠| é£çµ |
---|
ã¢ãžã¥ãŒã«ã®è§£é | ãªã¯ãšã¹ãã«å¿ã㊠| ãã€ãã£ããœãªã¥ãŒã·ã§ã³ | ãªã¯ãšã¹ãã«å¿ã㊠| éå§æ |
---|
ã¢ãžã¥ãŒã«ã®åé¢ | å€ç«ãã | å€ç«ãã | å®å
šã«åé¢ | å€ç«ããŠããªã |
---|
äžè¬çãªã¢ãžã¥ãŒã«åœ¢åŒ
ãããŠæåŸã«ãä»æ¥ååšããJavaScriptã¢ãžã¥ã¬ãŒã¿ãŒã«é¢ããèæ¯æ
å ±ãããã€ã玹ä»ããŸããã¢ãžã¥ãŒã«ãªã
var moduleName = function () { return dep1 + dep2; };
åå空é
var MyNs.moduleName = function () { return MyNs.dep1 + MyNs.dep2; };
IIFEãªã¿ãŒã³
var moduleName = (function (dep1, dep2) { return function () { return dep1 + dep2; }; }(dep1, dep2));
IIFEã®èŒžåº
(function (exports, dep1, dep2) { exports.moduleName = function () { return dep1 + dep2; }; }(window, dep1, dep2));
AMD
YUIã¢ãžã¥ãŒã«ã¯ãAMDãšæå³çã«é¡äŒŒããŠããŸããç§ã¯ããããå®èšŒããŸããã define(["dep1", "dep2"], function (dep1, dep2) { return function () { return dep1 + dep2; }; });
CommonJSã®AMDã©ãããŒ
define(function (require, module, exports) { var dep1 = require('dep1'), dep2 = require('dep2'); module.exports = function () { return dep1 + dep2; }; });
Commonjs
var dep1 = require('dep1'), dep2 = require('dep2'); module.exports = function () { return dep1 + dep2; };
UMD
çŸåšããµããŒããå¿
èŠãªã¢ãžã¥ãŒã«ã«ã¯å°ãªããšã3ã€ã®åœ¢åŒãããããšãããããŸãããããžã§ã¯ããæžããŠãäœã§ãæžãããšãã§ãããªããããã¯äžã€ã®ããšã§ãããã¹ãŠã®åœ¢åŒããµããŒãããããšãæãŸãããªãŒãã³ãœãŒã¹ãããžã§ã¯ãã¯å¥ã®åé¡ã§ãããããã®ã¢ãžã¥ãŒã«ã¯ãã¹ãŠãæ¬è³ªçã«åãããšãè¡ãåãªãã©ãããŒã§ã-ãªãœãŒã¹ãååŸãããªãœãŒã¹ãæäŸããŸããå°ãåãŸã§ãUMDïŒUniversal Module Definitionãããžã§ã¯ããç»å ŽããŸãããããã¯ããã¹ãŠã®åœ¢åŒã®ãŠãããŒãµã«ã©ãããŒããæšæºåãããŸããã (function (root, factory) { if (typeof exports === 'object') {
éçºã§ããã䜿çšããã®ã¯äžçš®ã®å¥åŠãªããšã§ããããšã¯ã¹ããŒãã§ã¯æãå€ã䜿çšãããŸããèªã
- JavaScriptã¢ãžã¥ãŒã«ãã¿ãŒã³ïŒè©³çŽ°
- YUIã¢ãžã¥ãŒã«ã®äœæ
- AMDãCommonJSãES Harmonyã䜿çšããã¢ãžã¥ã©ãŒJavaScriptã®èšè¿°
- Why AMD?
- AMD is Not the Answer
- Why not AMD?
- Proposal ES6 Modules
- Playing with ECMAScript.Harmony Modules using Traceur
- Author In ES6, Transpile To ES5 As A Build-step: A Workflow For Grunt
, , .