JS模块化-RequireJS

今天给大家带来js模块化-requirejs,关于js模块化的注意事项有哪些,应该如何使用requirejs?下面就是实战案例,一起来看一下。

之前一直有听说RequireJS,但是一直都没机会去了解,只知道它是一个给js做模块化的API。最近在做React,其组件化的思想和js模块化的思想不谋而合。就想在项目中应用React的同时,也把RequireJS加进来,看看会不会对页面加载或者开发有很好的效果。

What is RequireJS?

在说明什么是RequireJS之前,不得不提的就是Javascript模块化历史的背景。其实在早期,javascript作为一门新兴的脚本语言出现,有着庞大的愿景,它并不是作为一门仅仅针对客户端设计的语言。只是说后来web应用的流行,javascript作为浏览器端脚本语言而迅速传开,加上Netscape和微软的竞争将其过早的标准化。所以就导致了JS的诸多缺陷,其中一个就是模块化(但是你可以惊奇地发现其实javascript有将import,export等作为保留字,说明设计的时候其实是有考虑的,新的标准es6也让原生支持模块化了)。然后随着web应用越来越复杂,嵌入的javascript代码越来越多,还有node的兴起,模块化编程就变成了必须。

所以就有了后来Dojo工具包和Google的Closure库支持的模块系统。还有两个非常通用的标准规范,CommonJS和AMD。这里就不展开说了,我们只需要知道,实现CommonJS规范的API是同步加载模块的,而实现AMD规范的API是则是异步加载模块。
所以理论上来说,AMD规范的非阻塞加载更加适合浏览器端。而RequireJS就是AMD规范的最好实现。抄一段官方文档对RequireJS的描述:

RequireJS 是一个JavaScript模块加载器。它非常适合在浏览器中使用, 它非常适合在浏览器中使用,但它也可以用在其他脚本环境, 就像 Rhino and Node. 使用RequireJS加载模块化脚本将提高代码的加载速度和质量。

Why RequireJS?

所以,知道了RequireJS是干什么的,也差不多知道为什么我们要使用RequireJS了。不过还是总结一下用RequireJS的好处吧。

异步“加载”。我们知道,通常网站都会把script脚本的放在html的最后,这样就可以避免浏览器执行js带来的页面阻塞。使用RequireJS,会在相关的js加载后执行回调函数,这个过程是异步的,所以它不会阻塞页面。

按需加载。通过RequireJS,你可以在需要加载js逻辑的时候再加载对应 的js模块,这样避免了在初始化网页的时候发生大量的请求和数据传输,或许对于一些人来说,某些模块可能他根本就不需要,那就显得没有必要。

更加方便的模块依赖管理。相信你曾经一定遇到过因为script标签顺序问题而导致依赖关系发生错误,这个函数未定义,那个变量undefine之类的。通过RequireJS的机制,你能确保在所有的依赖模块都加载以后再执行相关的文件,所以可以起到依赖管理的作用。

更加高效的版本管理。想一想,如果你还是用的script脚本引入的方式来引入一个jQuery2.x的文件,然后你有100个页面都是这么引用的,那当你想换成jQuery3.x,那你就不得不去改这100个页面。但是如果你的requireJS有在config中做jQuery的path映射,那你只需要改一处地方即可。

当然还有一些诸如cdn加载不到js文件,可以请求本地文件等其它的优点,这里就不一一列举了。

RequireJS 使用

需要在页面中引入的文件


登录后复制

使用RequireJS,你只需要引入一个require.js即可。需要说明的是,一个比较好的实践,就是你的页面上面应该也只需要通过标签引入这一个js即可。然后你这个页面的所有业务逻辑只需要在main.js里面写(data-main属性作用后面会有讲)就可以了。其它引用的依赖怎么办?当然是通过require按需引入啊!

Require基本概述

其实Requirejs整个源文件包括注释就2000来行,其对外暴露的变量其实就三个,requirejs,require,define。

这其中requirejs 只是require的一个别名,目的是如果页面中有require其它实现了,你还是能通过使用requirejs来使用requireJS API的(本文中没有相关冲突,所以还是使用require)。

所以这意味着作为入门,你只需要掌握require,require.config,define这三样就可以了。

本文将以介绍require,require.config,data-main,define的顺序来介绍RequireJS。让比较简单的RequireJS更加简单,争取让大家只看这篇文章就能用好RequireJS。至于RequireJS是如何解决循环依赖,对于没有实现amd的模块如何通过shim来导出,如何在node中使用等问题。本文并没有提及,详细有需要可以去官方查阅。

require.js可以通过npm下载或者在官网获得。jquery同理,jquery需要下载1.7.0或以上的版本。然后把对应的代码拷入对应的文件中,给出余下两个文件的代码:

//  js/script/index.htmlnbsp;html>    Require Demo 1            

Require Demo 1 -- usage of Require()

            

                   //  js/script/main.js    require.config(        {            paths: {                'jquery': '../lib/jquery-1.7.2'            }        }    );    require(['jquery'],function ($) {             $(document).on('click','#contentBtn',function(){                $('#messagebox').html('You have access Jquery by using require()');             });    });

登录后复制

先看index.html的代码,其实比较简单,页面上在js中会用到的就是一个button和一个p标签。然后整个页面就只是一个js文件是通过标签加载的,就是require.js。注意到标签中有一个data-main属性,你现在只需要了解require.js会在加载完成以后通过回调方法去加载这个data-main里面的js文件,所以这个js文件被加载的时候,RequireJS已经加载执行完毕。

然后接着看main.js文件,里面被一个匿名立即执行函数所包括。在require.config(…)中,可以配置许多配置项,后面会有详细说明。上面在config中添加了一个path,在path配置了一个模块ID和路径的映射,这样在后续的所有函数中就可以直接通过模块ID来引入依赖,而不用再多次引入依赖多次输入路径带来的麻烦。

然后接着就是我们的require(…)函数了。上面的语法中require函数接受的第一个参数是,所依赖模块的一个数组。即使你只需要传入一个依赖,也需要把这个依赖放进数组中传入。如果你有如本例子中设置了模块ID和路径的映射,那你在传入依赖的时候就可以使用模块ID来代替路径,如果没有配置模块ID你当然也可以通过路径来引进对应的模块。接着是传入回调函数,当引入的依赖加载完毕后,这个回调函数就会被触发。如果你传入的依赖有注入变量(函数),然后在回调函数中需要用到,你就需要按照顺序在回调函数的参数中添加别名,在本例子中可以通过别名$来使用jQuery的相关API。所以有注入的模块需要放在无注入或者不需要调用模块的模块前面,方便回调函数传入别名。例子中在回调函数中为id为contentBtn的button注册监听事件,如果触发,则往id为messagebox的p标签添加相应的内容。

另外还需要额外说明的是路径,不管是在配置中写路径还是直接在require函数中写路径,你都需要了解requireJS在不同情况下的相对路径。

以下是相对路径的规则:

1.如果标签引入require.js时没有指定data-main属性,则以引入该js的html文件所在的路径为根路径。

2.如果有指定data-main属性,也就是有指定入口文件,则以入口文件所在的路径为根路径。在本例子中也就是main.js所在的script文件夹就是根路径,这也是为什么配置jQuery的时候需要返回上层目录再进入lib目录才能找到jQuery文件。

3.如果再require.config()中有配置baseUrl,则以baseUrl的路径为根路径。
以上三条优先级逐级提升,如果有重叠,后面的根路径覆盖前面的根路径。

define

讲完了如何引入模块,现在讲如何定义一个模块,require定义一个模块是通过 define = function (name, deps, callback)完成的,第一个参数是定义模块名,第二个参数是传入定义模块所需要的依赖,第三个函数则是定义模块的主函数,主函数和require的回调函数一样,同样是在依赖加载完以后再调用执行。
先看个例子:

当你没有任何依赖的时候,你可以这么写:

//   js/script/desc.jsdefine(function(){    return{        decs : 'this js will be request only if it is needed',    };})      //   然后在main.js的添加如下代码//   js/script/main.js    $('#messagebox').html('You have access Jquery by using require()');+  require(['script/desc'],function(desc){+       alert(JSON.stringify(desc));

登录后复制

再次打开网页,打开network视图,点击按钮,通过require获得的desc模块就会alert出来,同时你会发现,desc.js是按需请求的,并不是在页面一开始的时候就请求的。

总结

以上就是关于关于RequireJS简单使用的介绍了,大家有需要可以直接看源码,大概就2000多行,不看具体实现,看它对几个函数声明的描述,对使用起来也是很有帮助的,你会发现有一些连官方文档都没提及到的一些特性(比如require()方法可以直接传入config配置作为第一个参数)。

另外,说一点小插曲,如果需要查阅RequireJS官方的API,有条件的还是建议直接访问英文官方文档。如果说中文的官方文档说还停留在老版本,翻译得比较生涩难懂就算了。一些很明显有错误的描述就真的是责任问题了。我在看中文文档的时候真是各种难移理解,后来直接看英文文档,则顺畅很多。

相信看了这些案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

相关阅读:

用Video.js实现H5直播界面

JS代码怎样实现记住账号密码

JavaScript基础心法 数据类型

以上就是JS模块化-RequireJS的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2784884.html

(0)
上一篇 2025年3月8日 17:16:30
下一篇 2025年3月8日 17:16:39

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 怎样在Android开发中与js进行交互

    这次给大家带来怎样在android开发中与js进行交互,android开发中与js进行交互的注意事项有哪些,下面就是实战案例,一起来看一下。 我们在开发Android应用的时候,很多的时候需要跟网页打交道,假如我们现在在做一个外卖app,在…

    编程技术 2025年3月8日
    200
  • 在Python中如何执行ExecJs语句

    这次给大家带来在python中如何执行execjs语句,在python中执行execjs语句的python有哪些,下面就是实战案例,一起来看一下。 execjs模块 在网页数据提取的日常中,经常有一些有用的信息以json的格式存放在网页的源…

    2025年3月8日
    200
  • js中的作用域链和原型链以及原型继承

    在js 中, 有两条链子,作用域链和原型链,作用域链相对容易理解点,而原型链就相对复杂了,我们今天就来详细的讲讲这复杂的原型链以及原型继承。我们直接进入正题吧! 作用域链 作用域链相对容易理解,两点     1、函数限定变量作用域,就是说,…

    2025年3月8日 编程技术
    200
  • 使用Pixi.js的总结

    这次给大家带来使用pixi.js的总结,使用pixi.js的注意事项有哪些,下面就是实战案例,一起来看一下。 Pixi.js是一个用JavaScript写的2D渲染引擎,可以用来在浏览器里做交互图形、动画和游戏等的“富视觉”应用,主打支持硬…

    编程技术 2025年3月8日
    200
  • js回调简单代码示例

    本文主要和大家分享一段简单的代码,是关于js回调简单代码示例,希望这段代码能帮助到大家。 function test(callback) {   var data = “aaa”;  typeof callback == ‘function…

    编程技术 2025年3月8日
    200
  • nodej中的xml2js需要如何使用

    这次给大家带来nodej中的xml2js需要如何使用,使用nodej中的xml2js的注意事项有哪些,下面就是实战案例,一起来看一下。 nodejs json与xml相互转化的工具—xml2js 下载方法 npm install…

    编程技术 2025年3月8日
    200
  • js绘制抛物线代码分享

    本文主要和大家分享js绘制抛物线代码,我们先和大大家展示效果图,具体方法大家来一起看代码吧,希望能帮助到大家。 效果图: nbsp;HTML>        抛物线运动效果     body { overflow: hidden; }…

    2025年3月8日
    200
  • js数组判断实例代码

    本文主要和大家分享js数组判断实例代码,希望能帮助到大家。 1.检测其构造函数是否为数组,利用constructor来进行判断,constructor 属性返回对创建此对象的数组函数的引用,代码如下: 运行结果如下: 2.运用instanc…

    2025年3月8日 编程技术
    200
  • JS执行环境实例简介

    “执行环境”,听到这个名词,可能变得很头大!并且不少文献中又叫做“执行上下文”,不过实际上是一个东西。书籍和资料中也往往讲得特别复杂,这可是js中一个难以理解得地方啊,别急,本篇文章尝试用通俗浅显的语言阐述这个概念。 一、例子解说执行环境 …

    编程技术 2025年3月8日
    200
  • JS插入排序详解

    原理:对整个为排序的数列分为两个部分,一部分是已经排序好的,一部分是没有排序好的,每次都从还未排序好的数列中去除一个数,插入到已经排序好的数列之中,直到未排序的数列为零; * 在排序过程中,一般默认将数列的第一个数作为已经排序好的数列,将剩…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论