Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   require как в ноде (https://javascript.ru/forum/project/25840-require-kak-v-node.html)

FINoM 17.02.2012 02:52

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;
	};

Kolyaj 17.02.2012 08:49

Цитата:

Сообщение от FINoM
require как в ноде

Нода имеет прямой доступ к файловой системе, браузер его не имеет. С учётом этого важного факта, зачем делать как в ноде?

DreamTheater 17.02.2012 11:00

http://requirejs.org/

FINoM 17.02.2012 14:11

Цитата:

Сообщение от Kolyaj
Нода имеет прямой доступ к файловой системе, браузер его не имеет. С учётом этого важного факта, зачем делать как в ноде?

Не знаю, захотелось.
Цитата:

Сообщение от DreamTheater
http://requirejs.org/

Я в курсе, спасибо.

Riim 18.02.2012 08:34

Кеширования загруженного не хватает, чтоб одно и тоже по 5 раз не грузилось.

melky 18.02.2012 11:30

а если скрипт на другом домене ?

tadjik1 18.02.2012 13:33

<script src="anotherDomain.js"></script>

Nekromancer 18.02.2012 17:07

tadjik1,
Тогда вся концепция экспортов разлетается. В общем загрузка модулей это актуально, но таким подходом написанном на коленке ничего не добиться.

FINoM 18.02.2012 18:04

Цитата:

Сообщение от Riim
Кеширования загруженного не хватает, чтоб одно и тоже по 5 раз не грузилось.

Эм, кеширование, обычно, делают на сервере.
Цитата:

Сообщение от melky
а если скрипт на другом домене ?

Сам знаешь, через YQL :D
Цитата:

Сообщение от Nekromancer
В общем загрузка модулей это актуально, но таким подходом написанном на коленке ничего не добиться.

Ну я не претендую на уникальность или полезность. Можно, например, еще и добавить загрузку списка модулей, как в requirejs.

FINoM 18.02.2012 21:32

Nekromancer, а какой подход по-твоему был бы хорош?


Часовой пояс GMT +3, время: 08:22.