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

FINoM 10.05.2012 22:44

Цитата:

Сообщение от B~Vladi
XML тут всё же лучше. Например, можно изначально писать js, html и css в одном файле, не думая о экранировании.

Для меня загадка, к чему это может понадобиться.

Kolyaj 10.05.2012 23:37

Цитата:

Сообщение от FINoM
Для меня загадка, к чему это может понадобиться.

Я пишу JS, HTML и CSS в одном файле. Но внутри JS, а не XML.

B~Vladi 11.05.2012 00:26

Цитата:

Сообщение от Kolyaj
Но внутри JS, а не XML.

Если ты один пишешь то да. Верстаки не очень любят в JS лазить. Из тех кого я знал.

Цитата:

Сообщение от FINoM
Для меня загадка

Для меня загадка - почему все так не любят XML :)

Kolyaj 11.05.2012 10:07

Цитата:

Сообщение от B~Vladi
Верстаки не очень любят в JS лазить.

Я никогда не понимал, как можно делать интерфейсы, когда один человек пишет HTML, другой -- JS. Это хрень какая-то.
В Яндексе, конечно, годами так жили, но сейчас курс на унификацию специалистов.

Ну и HTML в моём случае всё таки является обычным HTML-ем, просто в файле с расширением .js лежит и в одинарных кавычках. Вебшторм его также подсвечивает и автодополняет.

B~Vladi 11.05.2012 10:12

Цитата:

Сообщение от Kolyaj
Я никогда не понимал, как можно делать интерфейсы, когда один человек пишет HTML, другой -- JS.

Я так работал, вполне успешно, если верстак не мудак :)

FINoM 08.05.2013 03:55

Допилил немного функцию, добавил пару вещей, которые несколько вышли за рамки концепции 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

qwerty-клавиатура 08.05.2013 20:20

а зачем оно нужно? да и node этот require напрягает, он конченный, автор не мог сделать как в python'е

devote 08.05.2013 20:29

Цитата:

Сообщение от qwerty-клавиатура
а зачем оно нужно?

для
Цитата:

Сообщение от FINoM
исключительно в ознакомительных целях


qwerty-клавиатура 08.05.2013 20:52

function loadScript(url, cb) {
    var d = document, 
        s = d.createElement('script');
    s.src = url;
    s.onload = cb;
    d.head.appendChild(s);
}

function loadScripts(urls, cb) {
    loadScript( urls.shift(), function() {
        if (urls.length) {
            return loadScripts(urls, cb);
        }
        
        cb && cb();
    } );
}

FINoM 08.05.2013 22:57

В моей функции возможна асинхронность и изолированность (при желании).

Немного об изолированности. Скажем, у нас есть некая библиотека, написанная сторонним разработчиком, и которая использует объект window, но, на самом деле, в нем не нуждается:
// lib.js
window.method1 = function() { /*1*/ };
window.method2 = function() { /*2*/ };

В таком случае можно заменить window на собственный объект, который служит пространством имен:
var lib = {};
require( 'lib.js', function() {
	console.log( window.method1, window.method2 ); //undefined undefined
	console.log( lib.method1, lib.method2 ); //function() { /*1*/ } function() { /*2*/ }
}, { window: lib } );

Еще раз повторюсь, функция выложена в ознакомительных целях и просто-напросто показывает, что в JS можно сделать «еще и так».

FINoM 08.05.2013 23:00

Кстати, меня всегда разочаровывало отсутствие в JS возможности подмены глобального объекта, даже небогоугодный with не срабатывает.


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