2017-01-11 4 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

は "ルート" とは何を意味するのでしょうか?

rootthisです(あなたがライン11に見るように)このIIFEに渡される最初の引数です。 Node.jsのJavaScriptファイルの「トップレベル」でthisthe global namespace objectを指しています。ブラウザでは、windowを指しています。

すべての例ではこの内部関数を使用していますが、どのように到達するのかわかりません。

const Levenshtein = require('levenshtein'); 

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

それが何を意味する:問題ではないのですが、これはあなたがNode.jsの中でそれを使用する方法です

このすべての目的は、あなたがのNode.js、AMDモジュールローダー、またはブラウザで<script>タグでrequireを使用するかどうか、このコードを動作させるためにあります。

これを分解すると、コードは分かりにくいものではありません。

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

(レーベンシュタインモジュールの場合は、root引数が実際に使用されることはありません:そうのように、ちょうどLevenshteinコンストラクタを返す「工場」関数である、ライン11上の匿名functionで始めてみましょう)工場出荷時の機能に戻ります。

ここで最初の行に戻ってみましょう。ここでは匿名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; 
    } 
} 

最後に、これら2つの関数は次のように使用されています。それ

iife(this, factory); 

だそれ!これらの関数がiifefactoryのような分かりやすい名前を与えるのではなく、匿名で使用される理由は、あなたが定義するかもしれない他の関数と衝突しないようにするためです。これはNode.jsでは可能ではありませんが、ブラウザにあります。

関連する問題