Подтвердить что ты не робот

Почему CommonJS говорит, что он подходит для приложений без браузера?

Почему бы не использовать его как общий шаблон компонента для Javascript, включая исполняемый JavaScript Javascript?

На первый взгляд, это хороший способ модуляции проекта, над которым я сейчас работаю, который состоит из большой базы данных Javascript с множеством компонентов, некоторые из которых взаимодействуют друг с другом.

4b9b3361

Ответ 1

CommonJS определенно подходит для браузера с некоторыми оговорками. Схема модуля CommonJS довольно приятная (в моем предвзятом мнении), а также является хорошим шагом к модульной системе, предложенной для ECMAScript Harmony (запланированная следующая версия языка JavaScript). В частности, модули Harmony не будут иметь доступ к глобальному ( "оконному" ) объекту.

Причина, по которой некоторые люди утверждают, что модули CommonJS не подходят для браузера, заключается в том, что они не могут быть загружены с помощью тега <script> без какой-либо поддержки на стороне сервера. Например, представьте, что у вас есть библиотека меток, которая экспортирует функцию "convertToHTML". Затем вы можете создать модуль, который выглядит следующим образом:

var convertToHTML = require("markdown").convertToHTML;
exports.mangleSomeText = function() {
    // do something then call convertToHTML
}

Это не работает с тегом script по нескольким причинам (область не обернута, поэтому convertToHTML будет привязан к окну, требование обычно не будет определено, а экспорт должен быть создан отдельно для каждого модуль).

Клиентская библиотека с крошечной частью справки на стороне сервера позволяет легко загружать теги script. Или клиентская библиотека, загружающая script через XMLHttpRequest и выполняющая функцию eval(), хотя опыт отладки часто не так хорош.

Довольно разумное решение прямо сейчас, хотя оно также является предметом спорных дебатов среди членов CommonJS, RequireJS. Используя RequireJS, вы можете написать свой модуль следующим образом:

define(function(require, exports, module) {

var convertToHTML = require("markdown").convertToHTML;
exports.mangleSomeText = function() {
    // do something then call convertToHTML
}

});

Все, что мы сделали, это добавить, что define() бит вокруг модуля. (Вероятно, вы также можете сделать сервер довольно легко, так что вам даже не нужно вручную вводить определенную часть).

Я лично использовал RequireJS в нескольких проектах сейчас и считаю его простым способом использовать модули CommonJS без серверного бита. Есть много других решений, и если вы не полагаетесь на запуск статических JS файлов, стандартные модули CommonJS - отличный способ пойти.

(ObDisclaimer: Я начал проект CommonJS, поэтому я явно предвзято.)