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

Node.js Levenshtein模块如何与NodeJS模块系统交互?,node.js,levenshtein-distance,Node.js,Levenshtein Distance,我在这里看: 我看到代码是这样开始的: (function(root, factory){ if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) { define(function(){ return factory(root); }); } else if (typeof module == 'object' &

我在这里看:

我看到代码是这样开始的:

(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 )
所有的例子都使用这个内部函数,但我不知道如何实现它

TL;博士 “根”是什么意思

root
是传递给this的第一个参数,它(如第11行所示)是
this
。在Node.js中JavaScript文件的“顶层”,此指向。在浏览器中,它指向
窗口

所有的例子都使用这个内部函数,但我不知道如何实现它

这不是一个问题,但这是如何在Node.js中使用它的:

const Levenshtein = require('levenshtein');

const lev = new Levenshtein('bar', 'baz');
console.log(lev.distance); // => 1
这是什么意思

所有这些的目的都是为了使此代码能够工作,无论您是在Node.js中使用
require
、AMD模块加载器还是在浏览器中使用
标记

如果你把它分解,代码就不难理解了。让我们从第11行的匿名
函数开始,它是一个“工厂”函数,只返回
Levenshtein
构造函数,如下所示:

function factory(root) {
  // ...
  function Levenshtein( str_m, str_n ) {
    // ...
  }
  // ...
  return Levenshtein
}
(在Levenshtein模块的情况下,
root
参数从未在“factory”函数中实际使用。如图所示。)

现在让我们回到第一行。这里声明了一个匿名
函数
,其基本工作原理如下:

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);
最后,这两个函数的使用方式如下:

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中是不可能的,但在浏览器中是可能的。

TL;博士 “根”是什么意思

root
是传递给this的第一个参数,它(如第11行所示)是
this
。在Node.js中JavaScript文件的“顶层”,此
指向。在浏览器中,它指向
窗口

所有的例子都使用这个内部函数,但我不知道如何实现它

这不是一个问题,但这是如何在Node.js中使用它的:

const Levenshtein = require('levenshtein');

const lev = new Levenshtein('bar', 'baz');
console.log(lev.distance); // => 1
这是什么意思

所有这些的目的都是为了使此代码能够工作,无论您是在Node.js中使用
require
、AMD模块加载器还是在浏览器中使用
标记

如果你把它分解,代码就不难理解了。让我们从第11行的匿名
函数开始,它是一个“工厂”函数,只返回
Levenshtein
构造函数,如下所示:

function factory(root) {
  // ...
  function Levenshtein( str_m, str_n ) {
    // ...
  }
  // ...
  return Levenshtein
}
(在Levenshtein模块的情况下,
root
参数从未在“factory”函数中实际使用。如图所示。)

现在让我们回到第一行。这里声明了一个匿名
函数
,其基本工作原理如下:

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);
最后,这两个函数的使用方式如下:

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中是不可能的,但在浏览器中是可能的。

可能与Node.js重复,就像正常使用一样。您可能会注意到,如果它检测到它正在node.js(module object exist)中运行,它会像往常一样导出
module.exports
,这可能是正常使用的重复。您可能会注意到,如果它检测到它正在node.js(模块对象存在)中运行,它会像往常一样导出