我正在阅读我最近下载的用于WebGL矩阵数学的库中的一些代码。但是,我很难理解此功能的作用。这来自glMatrix.js库。
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
(global = global || self, factory(global.glMatrix = {}));
}(this, function (exports)
工厂参数/功能是什么?出口来自何处?有人可以逐步指导我完成此功能吗?
编辑:这只是代码的第一部分,这就是开括号从未关闭的原因。
答案 0 :(得分:2)
这是一个称为UMD的设计模式,它是IIFE设计模式的更高级版本。它们都包装了您的代码,创建了一个新的私有范围。两者之间的主要区别在于this.setState({ string: this.arrayStr, uint: this.arrayUint }, () => {
var json = JSON.stringify(this.state);
console.log(json);
});
更抽象,并且将在UMD
和node.js
中运行,而不仅仅是浏览器。
您要在问题中显示的第一行和最后一行基本上是amd
部分(减去末尾是因为您已将其裁剪)。您正在调用IIFE
,并传递iife
又名global
对象和window
函数,而您只能在代码中看到factory
部分。>
以下部分检查您使用的环境是节点,amd还是常规function (exports)
,以便它们将在每个环境要求中定义模块,即JS
仅需要您设置{{ 1}}对象,node
需要您使用exports
函数,而在普通amd
中,您只需将对象添加到define
或JS
对象中。 / p>
window
在node和amd中,您不需要命名导出,因为您只需要该文件,即global
,但是在JS中,您需要从全局对象中检索,这就是为什么它仅是一个需要被命名为typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
(global = global || self, factory(global.glMatrix = {}));
。该行将const glMatrix = require("./common.js");
属性添加到全局对象(最初是一个空对象),然后将其作为参数传递给您的factory(global.glMatrix = {})
函数,该函数将附加您应该能够使用的所有函数,值和类从范围之外访问。
glMatrix
模式的实现可能因库而异。例如,这是一种无需传递任何参数到factory
UMD
在节点中,您可以仅创建一个新文件并导出所需的任何内容。然后,Node将把这些导出与文件而不是属性关联(这在浏览器JS中会发生)。例如,一个名为IIFE
的文件,其内容如下:
(function() {
var global = this;
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
(global = global || self, factory(global.foo = {}));
function factory(exports) {
exports.bar = function() {
console.log("Hello World!");
};
}
})();
foo.bar();
可以从另一个文件访问,如下所示:
foo.js
或者您可以使用Destructuring直接访问属性:
function bar() {
console.log("Hello World!");
}
exports.bar = bar;
答案 1 :(得分:1)
什么是出厂参数/功能
这是该函数的第二个参数…的开头在所包含的代码的最后一行中定义。其余的都剪掉了。
出口来自哪里
调用时。此处:factory(global.glMatrix = {})