最近几天我一直在和requirejs玩。我试图理解定义和需求之间的区别。
定义似乎允许模块分离,并允许遵循依赖性顺序。但它会下载开始所需的所有文件。虽然仅需要时才加载需要的内容。
可以将两者一起使用吗?应将它们分别用于什么目的?
最近几天我一直在和requirejs玩。我试图理解定义和需求之间的区别。
定义似乎允许模块分离,并允许遵循依赖性顺序。但它会下载开始所需的所有文件。虽然仅需要时才加载需要的内容。
可以将两者一起使用吗?应将它们分别用于什么目的?
Answers:
从require.js 源代码(1902行)中:
/**
* The function that handles definitions of modules. Differs from
* require() in that a string for the module should be the first argument,
* and the function to execute after dependencies are loaded should
* return a value to define the module corresponding to the first argument's
* name.
*/
该define()
函数接受两个可选参数(代表模块ID的字符串和所需模块的数组)和一个必需参数(工厂方法)。
工厂方法的返回必须返回模块的实现(与模块模式相同)。
该require()
函数不必返回新模块的实现。
使用define()
您正在问类似“运行作为参数传递的函数,并将任何返回值分配给我传递的ID,但在检查这些依赖项是否加载之前”之类的东西。
使用require()
您的意思是“我传递的函数具有以下依赖关系,请在运行之前检查这些依赖关系是否已加载”。
该require()
函数是您使用已定义模块的地方,以确保已定义模块,但您不在那里定义新模块。
define()
),直到有一个require([])
调用它或依赖它的东西为止。” github.com/jrburke/requirejs/wiki/...
用于定义模块的“ define”方法和用于处理依赖项加载的“ require”方法
define用于根据提案使用以下签名定义已命名或未命名的模块:
define(
module_id /*optional*/,
[dependencies] /*optional*/,
definition function /*function for instantiating the module or object*/
);
另一方面,如果您希望动态获取依赖项,则require通常用于在顶级JavaScript文件或模块内加载代码
有关更多信息,请参阅https://addyosmani.com/writing-modular-js/。
通用规则:
当您要定义将被重用的模块时,可以使用define
您可以使用require来简单地加载依赖项
//sample1.js file : module definition
define(function() {
var sample1 = {};
//do your stuff
return sample1;
});
//sample2.js file : module definition and also has a dependency on jQuery and sample1.js
define(['jquery', 'sample1'], function($,sample1) {
var sample2 = {
getSample1:sample1.getSomeData();
};
var selectSomeElement = $('#someElementId');
//do your stuff....
return sample2;
});
//calling in any file (mainly in entry file)
require(['sample2'], function(sample2) {
// sample1 will be loaded also
});
希望这对您有所帮助。