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(模块对象存在)中运行,它会像往常一样导出