11.07.2014

RequireJS и Dependency Injection (DI)

RequireJS

RequireJS

Это реализация AMD (Asynchronous Module Definition), API для объявления модулей и их асинхронной загрузки «на лету», когда они понадобятся.

require(deps, callback)

Типичный случай

			define(["jquery", "blade/object"], function ($, object) {
				// ...
			});
		

А модули всё растут...

			define(["jquery", "blade/object", "blade/fn",
				"rdapi", "oauth", "blade/jig"
			], function ($, object, fn, rdapi, oauth, jig) {
				// ...
			});
		

...и растут

			define(["jquery", "blade/object", "blade/fn", "rdapi",
				"oauth", "blade/jig", "blade/url", "dispatch", "accounts",
				"storage", "services", "widgets/AccountPanel", "widgets/TabButton",
				"widgets/AddAccount", "less", "osTheme", "jquery-ui-1.8.7.min",
				"jquery.textOverflow"
			], function ($, object, fn, rdapi, oauth, jig, url, dispatch,
				accounts, storage, services, AccountPanel, TabButton,
				AddAccount, less, osTheme) {
				// ...
			});
		

Welcome to Hell!

Что делать?

Используй DI

Используй DI

			define(function (require) {
				var $ = require("jquery");
				var object = require("blade/object");
				var fn = require("blade/fn");
				var rdapi = require("rdapi");
				// ..
			});
		

Используй DI

Так предлагает делать RequireJS.

Но почему бы не пойти дальше?

Больше DI!

Больше DI

			define(function (
				#! /*jquery=*/$,
				#! /*blade*/object,
				#! /*blade*/fn,
				#!+ // ..
				#!- /*jquery-ui-1.8.7.min*/
			) {
				// ...
			});
		

Подумайте ;]