Показать сообщение отдельно
  #1 (permalink)  
Старый 17.02.2012, 02:52
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

require как в ноде
Когда-то давно не имел представления, как сделать включение скриптов в браузере как в ноде. Сегодня опыта немного больше. Посидев пару десятков минут, сделал. Есть более функциональные импортеры модулей, этот мини скрипт создан чисто из спортивного интереса. Может быть кому-то это покажется полезным.

Функция require принимает на себя два параметра: адрес скрипта и опциональный колбек.
Если колбек не указан, то запрос на сервер будет идти синхронно, а возвращаться будет модуль. Если не указан, то возвращается null, а аргументом коллбека будет модуль.
Пример:
var module = require('module.js'); // module теперь извлекаемый модуль
//...

или
var module;
require('module.js', function( m ){
	module = m;
	//...
});


Пример файла модуля:
var local = 'local';

exports.method1 = function(){
	alert('method 1, local=' + local)
};

this.method2 = function(){
	alert('method 2')
};


Собственно, функция require:
window.require = function require(path, callback) {
	    var req = new XMLHttpRequest(),
	        module = null,
	        async = !! callback,
	        createModule = function (text) {
	            return (new Function('var exports = this;' + text + '; return this;')).call({});
	        };

	    req.open('GET', path, async);
	    req.onreadystatechange = function () {

	        if (req.readyState === 4) {
	            if (req.status === 200) {
	                module = createModule(req.responseText);
	                callback && callback(module);
	            } else {
	                throw new Error('Module ' + path + ' not found');
	            }
	        }
	    };

	    req.send(null);
	    return module;
	};
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности

Последний раз редактировалось FINoM, 17.02.2012 в 05:53.
Ответить с цитированием