嘿伙计们,我对 js 很陌生,基本上我正在尝试通过在线挖掘一些 js 插件并阅读好书来学习实用的 js。现在我正在挖掘插件(tinyscroll.js)的源代码并看到以下代码行:
if(typeof define == 'function' && define.amd) {
define(function(){ return tinyscrollbar; });
}
else if(typeof module === 'object' && module.exports) {
module.exports = tinyscrollbar;
}
else {
window.tinyscrollbar = tinyscrollbar;
}
Run Code Online (Sandbox Code Playgroud)
我在很多插件中似乎都有类似的代码行,作为一个大佬,这些代码行对我来说没有多大意义,因为我知道它是 if else 语句的组合,但是,我不知道有什么用这些线将会是。我有根据的猜测是(并且经过一些测试后,通过的条件是最后一个else。)。那么为什么前面的 2 个条件呢?
我用 google 搜索 difine.amd 并得到了一堆链接,上面写着“异步模块定义(AMD)”和以下解释:
异步模块定义 (AMD) 是一种 JavaScript 规范,它定义了一个 API,用于定义代码模块及其依赖项,并在需要时异步加载它们。
但我还是很纠结。
有人可以告诉我为什么下面的 if 和 else if 行吗?
if(typeof define == 'function' && define.amd) {
define(function(){ return tinyscrollbar; });
}
else if(typeof module === 'object' && module.exports) {
module.exports = tinyscrollbar;
}
Run Code Online (Sandbox Code Playgroud)
谢谢 。
这是一个老问题,但我认为值得回答,因为当程序员第一次查看 javascript 库并尝试找出库的内部内容并理解代码时,通常会出现这个问题。您给出的顺序略有不同,我喜欢的是:
if (typeof define === "function" & define.amd )
this.myLib = myLib, define(myLib);
else if (typeof module === "object" && module.exports)
module.exports = myLib;
else
this.myLib = myLib;
Run Code Online (Sandbox Code Playgroud)
首先要了解的是,可以开发一个库来部署在不同的环境中:在 amd 加载器中、在“ javascript 机器”(想想 node.js)中或在浏览器中。
所以这段代码基本上是一种通过优先模式导出 javascript 库的方法。
在我的代码中,如果定义了“ define ”并且我们位于 amd 环境中,那么我将使用 Define 导出我的库(如 中所示define(myLib))并将其添加到“ this ”。这通常是您在 AMD 中导出模块时要做的事情。Require.js 有一个关于 AMD 的很好的教程,看看:
http://requirejs.org/docs/whyamd.html#amd
然后,如果存在“ module ”并且存在“ module.exports ”,那么我会将我的库添加到 module.exports 中。如果您在 Node.js 模块中部署库,这通常是需要的。您可以在此处找到 module.export 的介绍性教程:http://www.sitepoint.com/understanding-module-exports-exports-node-js/
否则,我只会将我的库添加到“ this<script scr="..."> ”,当您只是通过网页中的标签添加 .js 库时通常会出现这种情况。在这种情况下,人们可以使用window.myLib = myLib,但我更喜欢使用this.myLib = myLib。
| 归档时间: |
|
| 查看次数: |
892 次 |
| 最近记录: |