简介
当今最常用的JavaScript库之一是RequireJS。我参与的每个项目最近都使用了requires js,或者我建议向它们添加requires js。在本文中,我将描述requires js是什么以及它的一些基本场景。异步模块定义(AMD)
说到RequireJS,不能不提到什么是JavaScript模块,什么是AMD。
JavaScript模块只是遵循SRP(单一责任原则)的代码段,它公开了一个开放的API。在当今的JavaScript开发中,您可以将许多功能封装在模块中,在大多数项目中,每个模块都有自己的文件。这让JavaScript开发人员的生活有点困难,因为他们需要不断关注模块之间的依赖关系,并以特定的顺序加载这些模块,否则运行时会释放错误。
当您想要加载JavaScript模块时,会使用脚本标签。为了加载依赖模块,必须先加载依赖模块,然后再加载依赖模块。使用脚本标签时,需要按照这个特定的顺序安排它们的加载,脚本的加载是同步的。您可以使用async和delay关键字使加载异步,但是在加载过程中可能会丢失加载顺序。另一种选择是将所有脚本捆绑在一起,但是当您捆绑它们时,您仍然需要按照正确的顺序对它们进行排序。
AMD就是这样定义模块的,这样模块及其依赖关系可以异步加载,但是顺序是正确的。
CommonJS是对包含AMD定义的通用JavaScript模式进行标准化的尝试。我建议你在继续这篇文章之前阅读它。在下一个版本的JavaScript规范ECMAScript 6中,有输出、输入、模块的规范定义,这将成为JavaScript语言的一部分,用不了多久。这就是我们想说的需求。
要求?
requires js是一个Javascript文件和模块框架,可以从http://requirejs.org/,下载,如果使用Visual Studio也可以通过Nuget获得。它支持像node.js这样的浏览器和服务器环境。使用RequireJS,您可以顺序读取只需要相关依赖项的模块。
RequireJS所做的是在使用脚本标记加载依赖项时,加载您通过head.appendChild()函数定义的依赖项。加载依赖项后,RequireJS计算模块定义的顺序,并以正确的顺序调用它。这意味着你所需要做的就是用一个“根”来读取你需要的所有函数,然后剩下的交给RequireJS。为了正确使用这些函数,您定义的所有模块都需要使用RequireJS API,否则将无法按预期工作。
RequireJS应用编程接口存在于加载RequireJS时创建的命名空间requirejs下。它的主要API是以下三个函数:
定义-该功能为用户创建一个模块。每个模块都有唯一的模块ID,用于RequireJS的运行时函数,define函数是全局函数,不需要使用requirejs命名空间。它也是一个全局函数,不需要使用RequireJS命名空间。config-该函数用于配置RequireJS。稍后,我们将教您如何使用这些函数,但首先,让我们了解requirejs的加载过程。
数据主属性
下载requires js时,首先应该做的是了解requires js是如何开始工作的。当加载requires js时,它将使用data-main属性来搜索脚本文件(它应该与使用src加载requires js的脚本相同)。Data-main需要为所有脚本文件设置一个根路径。根据这个根路径,RequireJS将加载所有相关模块。以下脚本是使用data-main的示例:script src=' http : script/require . js ' data-main=' scripts/app . js '/script
定义根路径的另一种方法是使用配置函数,我们将在后面看到。RequireJs假设所有依赖项都是脚本,因此您不需要使用。声明脚本依赖项时使用js后缀。
配置功能
如果要将RequireJS的默认配置更改为使用自己的配置,可以使用require.configh函数。config函数需要传入一个可选的参数对象,其中包括许多配置参数选项。以下是您可以使用的一些配置:
BaseUrl——是加载模块的根路径。路径——用于映射不存在的根路径下的模块路径。Shims——在脚本/模块外配置,不使用RequireJS的函数依赖,不初始化函数。假设下划线不是由requires js定义的,但是您仍然希望由requires js使用它,那么您需要在配置中将它定义为一个填补。Deps——加载依赖关系数组以下是使用配置的示例:
require . config({//默认情况下,从脚本/应用程序baseUrl: '脚本/应用程序',//加载任何模块ID,除非模块ID以' lib ' paths: { lib: '开头./lib' },//将主干加载为shim: {“主干”: { //应该在加载主干之前加载下划线脚本依赖项. js deps: [“下划线”],//使用全局“主干”作为模块名称。exports: '主干' } } });在这个例子中,根路径被设置为scripts/app,从lib开始的每个模块都被配置在scripts/lib文件夹下,主干被加载了一个垫片依赖项。
用需求定义模块
模块是一个内部实现封装、接口公开、限制范围合理的对象。ReuqireJS提供了一个定义函数来定义模块。根据章节约定,每个Javascript文件只能定义一个模块。定义函数接受依赖数组和包含模块定义的函数。通常,模块定义函数按顺序接收前一个数组中的相关模块作为参数。例如,以下是简单的模块定义:
define(['logger'],function(logger){ return { first name : " John ',lastName: "Black ",say hello : function(){ logger . log(' hello ');} } });我们看到一个包含logger的模块依赖数组被传递给了define函数,这个模块将在后面被调用。同样,我们看到在定义的模块中有一个名为logger的参数,它将被设置为logger模块。每个模块都应该返回自己的应用编程接口。在这个例子中,我们有两个属性(名字和姓氏)和一个函数(sayHello)。然后,只要你后面定义的模块通过ID引用这个模块,就可以使用它公开的API。
使用require函数
RequireJS中另一个非常有用的函数是require函数。require函数用于加载模块依赖关系,但不创建模块。例如,下面是使用require来定义一个可以使用jQuery的函数。
require(['jquery'],函数($) { //jQuery已加载,现在可以使用});总结
在本文中,我介绍了RequireJS库,它是我用来创建每个Javascript项目的库函数之一。它不仅用于加载模块依赖和相关命令,而且RequireJS还帮助我们编写模块化的JavaScript代码,这对于代码的可扩展性和可重用性非常有利。