2017-01-11 60 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){ 

我從來沒有見過這個。這是什麼意思? 「根」是什麼意思?

如果我添加這對我的應用程序的NodeJS的的package.json文件,那麼我怎麼使用這個內部函數:

// 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

只需像平常一樣使用它。您可能會注意到,如果它檢測到它在node.js中運行(模塊對象存在),它會照常執行'module.exports' – slebetman

回答

0

TL; DR

什麼是 「根」 是什麼意思?

root是傳遞給這個IIFE,它(如你在網上看到11)是this的第一個參數。在Node.js中JavaScript文件的「頂層」,this指向the global namespace object。在瀏覽器中,它指向window

所有的例子都使用這個內部函數,但我不知道如何達到它。

這不是一個問題,但是這是你如何使用它的Node.js:

const Levenshtein = require('levenshtein'); 

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

是什麼意思?

這一切的目的是無論你的Node.js,AMD的模塊加載,或在瀏覽器中<script>標籤使用require使此代碼工作。

如果將其分解,代碼不會太難理解。讓我們先從匿名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); 

這就是它!這些函數被匿名使用的原因,而不是給他們明智的名字,如iifefactory,以便它們不會與您可能定義的其他函數(或其他不太好行爲的模塊定義)衝突。這在Node.js中是不可能的,但它在瀏覽器中。