Допилил немного функцию, добавил пару вещей, которые несколько вышли за рамки концепции require в ноде. Кроме описанного в голове этого топика функционала
require( 'm.js' );
require( 'm.js', callback );
... появились следующие вещи.
1. Настройки:
require.settings = {
PATH: '/', // Путь к файлу, например, '/js'. Наряду с постфиксом, можно использовать, как префикс: 'js/app.' для скриптов, типа js/app.script.js
POSTFIX: '', // Говорит сам за себя. Может использоваться для сокращения длины строки: '.js' или '.module.js'
CONCAT_ALL: false, // опишу ниже
DISABLE_CATCHE: false, // добавляет ко всем скриптам рандомную строку: script.js?RANDOM
}
2. Загрузка нескольких модулей:
require( [ 'm1.js', 'm2.js' ], function( m1, m2 ) {
});
Если установить настройку
require.settings.CONCAT_ALL = true
то все модули будут соединены в один:
require( [ 'm1.js', 'm2.js' ], function( all ) {
all.m1.method1()
all.m2.method2()
});
(свойства могут перетереть друг друга, так что придется следить за тем, чтоб имена методов не совпадали)
3. Передача аргументов. Третьим аргументом служит объект, свойства которого являются глобальными для модуля.
require( 'm.js', callback, {
a: 3,
b: 4
});
// m.js
this.method = function() {
alert( a + b );
};
4. ////@ sourceURL= ...
Теперь можно узнать, в каком модуле и в какой строке возникла ошибка (но не синтаксиса). Работает в нормальных браузерах.
Это всё. Недавно вспомнил об этом скрипте, забыв, с какими трудностями мне пришлось столкнуться и столкнулся с ними снова. Решил заюзать в проекте, который начал пилить, но, в дальнейших проектах, вряд ли буду использовать (хотя, посмотрю еще). Одна из самых серьезных проблем — то, что нельзя отследить место синтаксической ошибки. Хотя, с другой стороны, мой синтаксис позволяет легко переключиться на обычное использование скриптов:
// Для упрощения покажу обычное создание конструктора. В приложении используется другой синтаксис.
Application = function() {
require( [ 'm1.js', 'm2.js' ], function() { /*...*/ }, { app: this } );
};
// m1.js
app.method1 = function() { /*...*/ }
// m2.js
app.method2 = function() { /*...*/ }
Выкладываю исключительно в ознакомительных целях, так как, возможно, кому-то что-нибудь покажется интересным. Над некоторыми штуками нужно еще поработать и добавить несколько мелочей, например: сделать асинхронную загрузку без передачи колбека, передать аргументы при синхронной загрузке, сохранять скрипты в localStorage (для того, чтоб избежать лишних запросов), но, так как я считаю сам подход недостаточно удобным, не хочу терять время зря, оставляя его в пользу другого, более важного для меня проекта. Если планы изменятся, то, как обычно, воскрешу старый топик
Как обычно, никакой документации, но, в этот раз, я и не обещаю её сделать:
https://github.com/finom/require