Levenshtein模块如何与NodeJS模块系统交互?

时间:2017-01-11 22:02:49

标签: node.js levenshtein-distance

我在这里看:

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){

我以前从未见过这个。这是什么意思?什么" root"意思?

如果我将它添加到我的NodeJS应用程序的package.json文件中,那么我该如何使用这个内部函数:

 // Levenshtein distance
 function Levenshtein( str_m, str_n )

所有示例都使用此内部函数,但我不知道如何实现它。

1 个答案:

答案 0 :(得分:0)

TL; DR

  

" root"意思?

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中使用require,在浏览器中使用AMD模块加载器还是<script>标记。

如果你将其分解,那么代码就太难理解了。让我们从第11行的匿名function开始,这是一个&#34;工厂&#34;只返回Levenshtein构造函数的函数,如下所示:

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

(在Levenshtein模块的情况下,root参数实际上从未在&#34;工厂&#34;函数中使用。去图。)

现在让我们回到第一行。这里声明了一个匿名的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中是不可能的,但它在浏览器中。