2016-02-11 2 views
0

Я взял это изCommonJS модуль модели

Flux architecture

var AppDispatcher = require('../dispatcher/AppDispatcher'); 
var EventEmitter = require('events').EventEmitter; 
var TodoConstants = require('../constants/TodoConstants'); 
var assign = require('object-assign'); 

var CHANGE_EVENT = 'change'; 

var _todos = {}; // collection of todo items 

/** 
* Create a TODO item. 
* @param {string} text The content of the TODO 
*/ 
function create(text) { 
    // Using the current timestamp in place of a real id. 
    var id = Date.now(); 
    _todos[id] = { 
    id: id, 
    complete: false, 
    text: text 
    }; 
} 

/** 
* Delete a TODO item. 
* @param {string} id 
*/ 
function destroy(id) { 
    delete _todos[id]; 
} 

var TodoStore = assign({}, EventEmitter.prototype, { 

    /** 
    * Get the entire collection of TODOs. 
    * @return {object} 
    */ 
    getAll: function() { 
    return _todos; 
    }, 

    emitChange: function() { 
    this.emit(CHANGE_EVENT); 
    }, 

    /** 
    * @param {function} callback 
    */ 
    addChangeListener: function(callback) { 
    this.on(CHANGE_EVENT, callback); 
    }, 

    /** 
    * @param {function} callback 
    */ 
    removeChangeListener: function(callback) { 
    this.removeListener(CHANGE_EVENT, callback); 
    }, 

    dispatcherIndex: AppDispatcher.register(function(payload) { 
    var action = payload.action; 
    var text; 

    switch(action.actionType) { 
     case TodoConstants.TODO_CREATE: 
     text = action.text.trim(); 
     if (text !== '') { 
      create(text); 
      TodoStore.emitChange(); 
     } 
     break; 

     case TodoConstants.TODO_DESTROY: 
     destroy(action.id); 
     TodoStore.emitChange(); 
     break; 

     // add more cases for other actionTypes, like TODO_UPDATE, etc. 
    } 

    return true; // No errors. Needed by promise in Dispatcher. 
    }) 

}); 

, где он говорит

Есть несколько важных вещей, чтобы отметить в приведенном выше коде. Для начала мы поддерживаем личную структуру данных, называемую _todos. Этот объект содержит все индивидуальные предметы. Поскольку эта переменная живет вне класса, но в пределах закрытия модуля она остается частной - ее нельзя напрямую изменить извне модуля. Это помогает нам сохранить отдельный интерфейс ввода/вывода для потока данных, делая невозможным обновление хранилища без использования действия.

Жирная часть неясна для меня. Как может интерпретатор js знать, что все эти коды находятся внутри закрытия модуля, а не в области глобальных переменных? Откуда начинается замыкание модуля и где заканчивается?

Насколько я знаю

Область действия переменного, объявленные с варом является текущим контекстом исполнения, который является либо функция вшита или для переменных, объявленных вне какой-либо функции, глобальных.

Любые объяснения?

ответ

3

Вы на самом деле не хватает последней строки из экстракта вы цитируемого:

module.exports = TodoStore; 

CommonJS является API для определения модулей, которые используют следующие условные обозначения:

  • Каждый файл определяет модуль и выполняется в изолированной среде; то есть переменные, которые он определяет, не будут доступны извне модуля.
  • Чтобы импортировать другие модули, глобальная переменная require становится доступной для модуля, что позволяет импортировать другие модули
  • Таким же образом, переменная module становится доступной для модуля, так что он может установить свой exports атрибут для определения того, что должно быть экспортировано вашим модулем; значение, которое вы установили для module.exports в своем модуле a.js - это именно то, что вернет require('./a').

Каждая среда JS, которая реализует CommonJS, должна знать эти правила. Разумеется, это Node.js, но также такие связки, как Browserify и Webpack, которые будут упаковывать ваши коды, чтобы эти соглашения соблюдались.

Таким образом, вы можете контролировать, какая часть вашего модуля будет экспортирована.

P.S. : обратите внимание, что вы также можете использовать exports var, чтобы определить свой экспорт, и что его использование немного отличается от module.exports.См. this StackOverflow question and answer для получения более подробной информации

+0

так что это конвенция CommonJS. спасибо – Nemus

1
Common JS pattern uses the constructor function to define your utilities. 

    It is defined in the form of class. 

    var moduleName = function(){ 

    //private variables 

    //public functions 
    this.method1 = function(){ 
    //logic1 goes here 
    }; 

    this.method2 = function(){ 
    //logic2 goes here 
    }; 

    }; 

    So we are going to export the class to other modules using 

    module.exports = moduleName; 

    So that other modules can 
    import it , 
    instantiate it and then 
    use the functionality. 

    How to use it? 

    var module = require('moduleName'); //importing the module created above 

    Here the module definition is fetched,executed and then available in 'module' 
    variable. 
    this variable name can be anything 
    var objectOfModule = new module(); //instance is created 

    objectOfModule .method1(); //use1 

    console.log(objectOfModule .method2()); //use2 

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