2017-01-11 7 views
0

Ищу здесь:Как модуль Levenshtein взаимодействует с модульной системой NodeJS?

https://github.com/gf3/Levenshtein/blob/master/lib/levenshtein.js

Я вижу, что код начинается так:

(function(root, factory){ 
    if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) { 
    define(function(){ 
     return factory(root); 
    }); 
    } else if (typeof module == 'object' && module && module.exports) { 
    module.exports = factory(root); 
    } else { 
    root.Levenshtein = factory(root); 
    } 
}(this, function(root){ 

Я никогда не видел этого раньше. Что это значит? Что означает «корень»?

Если добавить это в package.json файл моего NodeJS приложения, то как я могу использовать эту внутреннюю функцию:

// Levenshtein distance 
function Levenshtein(str_m, str_n) 

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

+0

Возможный дубликат [Что такое 'typeof define ===' function '&& define \ [' amd '\]' для использования?] (Http://stackoverflow.com/questions/30953589/what-is-typeof -define-function-defineamd-used-for) –

+0

Просто используйте его, как обычно. Вы можете заметить, что он обычно выполняет 'module.exports', если обнаруживает, что он запущен в node.js (существует объект модуля) – slebetman

ответ

0

TL; DR

Что означает "корень" означает?

root является первым аргументом, переданный в IIFE, который (как вы видите на линии 11) this. На «верхнем уровне» файла JavaScript в Node.js, this указывает на the global namespace object. В браузере он указывает на window.

Все примеры используют эту внутреннюю функцию, но я не знаю, как ее достичь.

Это не вопрос, но это то, как вы используете его в Node.js:

const Levenshtein = require('levenshtein'); 

const lev = new Levenshtein('bar', 'baz'); 
console.log(lev.distance); // => 1 

Что это значит?

Целью всего этого является то, чтобы сделать этот код работать Используете ли вы require в Node.js, модуль загрузчика AMD или <script> тега в браузере.

Если вы сломаете это, код не слишком сложно понять. Давайте начнем с анонимным function на линии 11, которая является функцией «завод», который просто возвращает Levenshtein конструктор, например, так:

function factory(root) { 
    // ... 
    function Levenshtein(str_m, str_n) { 
    // ... 
    } 
    // ... 
    return Levenshtein 
} 

(В случае модуля Левенштейн, то root аргумент в действительности никогда не используется в функции «фабрика».).

Теперь давайте вернемся к первой строке. Здесь анонимный function объявлен, который в основном работает следующим образом:

function iife(root, factory) { 
    const Levenshtein = factory(root); 

    if (anAMDLoaderIsLoadingMe()) { 
    // AMD loaders supply a `define` function 
    define(function() { return Levenshtein; }); 
    } else if (nodeJsIsLoadingMe()) { 
    // Node.js supplies the `module.exports` object 
    module.exports = Levenshtein; 
    } else { 
    // In a browser, so `root` is `window` 
    root.Levenshtein = Levenshtein; 
    } 
} 

Наконец, эти две функции используются следующим образом:

iife(this, factory); 

Вот оно!Причина, по которой эти функции используются анонимно, вместо того, чтобы давать им разумные имена, такие как iife и factory, так это то, что они не сталкиваются с другими функциями, которые вы могли бы определить (или определить другие, менее хорошо управляемые модули). Это не возможно в Node.js, но оно находится в браузере.

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

  • Нет связанных вопросов^_^