2015-10-01 2 views
1

Итак, я использую модули в личном проекте по обычным причинам (защита пространства имен и обработка зависимостей (требуется) и общедоступное определение API (экспорт)). Я написал собственный метод моего требует() и я использую стандартный шаблон модуля - то есть:Javascript CommonJS - где находится модуль?

var myModule = (function() { 
    var exports = {}; 

    function sayHello() { 
     return "hi"; 
    } 
    exports.sayHello = sayHello; 

    return exports; 
})(); 

Так что я хочу, чтобы стандартизировать свои вещи на CommonJS стандартной (это для серверного JS и мой вопрос не о стандартах CommonJS и других модулях). Все, что я читал о CommonJS, говорит о том, что модуль выглядит так:

function sayHello() { 
    return "hi"; 
} 
exports.sayHello = sayHello 

И все! Но это не модуль. Что-то должно обернуть это в качестве реального модуля! Я не нашел ни одного сайта, обсуждающего модули CommonJS, в котором говорится, как это превращается в настоящий модуль. Я что-то теряю, что все остальные знают?

Так что мои вопросы:

Что делать обертывание? - то есть, что превращает его в настоящий модуль? Я предполагаю, что библиотека какая-то.

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

Является ли переменная «export» в глобальном масштабе? Если нет, то, что предоставляет объект экспорта модулю, если он явно не объявлен в теле кода модуля? И кто это делает - вызывающий модуль?

Dang. Это было просто, когда я написал это сам. Теперь это похоже на волшебство. Ссылка на некоторую исчерпывающую документацию была бы отличной.

Примечание: Я знаю очень мало о Node.js и не намерены использовать его в этом проекте, так что если вы ответите, пожалуйста, не отвечайте на Node.js-говорить.

+0

«Что делает обертывание?» - Это зависит от среды хоста. Реализации браузера будут отличаться от реализаций Node.js, которые будут отличаться от реализаций WSH и так далее. – Quentin

+1

* Я написал свой собственный метод require() * - Как вы это сделали? Что это делает? и почему вы изобретаете колесо? – Amit

+0

NodeJS несовместим с CommonJS для вас. Среда браузера * не будет * делать это и использовать шаблоны CommonJS в них, вам понадобится пакет JavaScript, такой как Browserify или Webpack (по крайней мере до ES6 приземляется во всех основных браузерах) –

ответ

1

Что делает упаковка?

Узел есть. Он может обращаться к файловой системе, поэтому он кэширует код из всех необходимых файлов и доставляет его в пространства имён, которые ему нужны.

Как выглядит этот окончательный, обернутый, модуль CommonJS?

Фактический код, где модули обернуты, вероятно, будет в module.js, что файл ядра в lib папке установки узла.

Является ли переменная «export» в глобальном масштабе?

exports является собственностью объекта module внутри файла. module - это глобальная область внутри этого файла. Свойство exports - это то, что возвращается модулем к требуемому ему коду.

Главное, чтобы помнить, что принцип CommonJS встроен в модульный код узла. В V8 нет волшебной реализации, которая диктует, что module.exports - это «вещь». Это может измениться, когда внедрение модулей ES6 станет нормой.

Возможно, вам будет полезно прочитать this.

Возможно, вам еще более полезно отказаться от вашего поиска, чтобы переписать require(). :-)

+0

Спасибо, shennan. Слишком поздно отказаться от моих поисков, чтобы переписать require() - это уже сделано! Это было на самом деле необходимо, потому что я использую Nashorn, поэтому, чтобы подражать тому, что делает Node (и т. Д.), Мне нужно было иметь дело с управлением зависимостями. –

+1

эта link очень BTW. Супер полезно. –

+0

@ misterblinky в этом случае, https://avatar-js.java.net/. Я не пытался его использовать. Я просто знаю, что это дело. Кроме того, http://nodyn.io/ –

Смежные вопросы