requireJS的基本用法(上)

简介: requireJS的基本用法

引言


目前项目中的前端架构采用的是RequireJS+AngularJS,小编在工作之余对这个前端框架比较感兴趣,在开始的时候对这个框架不是很懂,因为里面有很多平台自己封装的东西,所以在理解起来不是很容易,经过这一段时间在项目中的运用有了一定的理解,下面先来总结总结一下其中的一个技术点——RequireJS的基本用法。


基本介绍


RequireJS是一个JavaScript文件或者模块的加载器。它可以提高JavaScript文件的加载速度,避免不必要的堵塞。它针对于在浏览器环境中使用做过专门的优化,但它也可以在其他的JavaScript环境中使用,像Node.js一样可以在服务器上运行。说了这么多废话,其实它为我们提供了两种思路解决大量加载js文件带来的问题:


  1、模块化组织JS


  2、异步加载js文件


为什么需要用RequireJS?


当我们业务比较负载时候我们有时候需要在一个页面中引入大量的js文件,之前的ITOO中会见到一个页面引入了很多的js文件,原先我们的写法是这样的:

<script src="js/app/a.js"></script>
<script src="js/app/b.js"></script>
 <script src="js/app/c.js"></script>

这样写的有很多的缺点:


   1、页面在加载的时候从上往下开始加载和渲染的,当页面有很多分散的JS文件的时候,页面会先加载和解析头部的js文件(同步加载),此时页面渲染就被堵塞了,如果这些js文件请求的数量比多,那么网页失去响应的时间就会加长。


2、如果js文件之间是有相互依赖关系的,那么我们的js文件引入的顺序需要我们一定要注意,依赖性大的文件一定在最后引入,但是当依赖关系非常复杂的时候,代码的编写和维护就非常复杂了。


然上面引入JS时候,对于第1点:首先:我们可以放在底部去加载,把所有JS放在</body>之前去,这样就会解决了游览器堵塞的问题,其次我们可以把所有的JS文件打包成一个JS文件,但是依赖性(也就是顺序)我们还是没有办法解决掉,所以我们引入了requireJS(优点:1、实现JS文件的异步加载,避免网页被堵塞。2、管理模块之间的依赖性,便于代码的编写和维护。)。


requireJS的基本语法及用法


1、在官网上下载requireJS包,在我们页面的头部引入require.js文件,基本用法如下:

<head>
    <meta charset="UTF-8">
    <title>RequirJS测试</title>
    <script src="RequireJS/require.js" defer async="true" data-main="RequireJS/app.js"></script>
</head>


sync属性表明文件需要异步加载,IE不支持这个属性,只支持defer,所以上面把这2个属性都加上。接下来,看看requireJS启动加载脚本的初始化方式,requireJS支持属性 data-main 这个属性来加载初始化的JS文件,其中app.js文件也即是我们的入口(主)文件,如果我们的app.js文件的内容为空的话,加载顺序如下:


20160705213708346.png

定义模块文件

 

首先看一个Demo的目录结构(webstorm开发):


20160705214416740.png


RequireJS编写模块不同于其他脚本文件,它良好的使用define来定义一个作用域避免全局空间污染,它可以显示出其依赖关系,并以函数(定义此模块的那个函数)参数的形式将这些依赖进行注入。大家如果对JS中的闭包比较熟悉的话,这个东西非常的好理解,因为在我看来它就是解决js闭包解决的问题。

b.js中我们写一个简单例子:


/**
 * Created by zhenghao on 2016/7/4.
 */
define(function(){
    var add = function(x,y) {
        return x + y;
    };
    return {
        add : add
    }
});

在入口文件app.js中写入一下内容:

/**
 * Created by zhenghao on 2016/7/4.
 */
 require(['app/b'], function (m){
 console.log(m.add(1,3));
 });

我们会在浏览器的console界面看到输入4,说明我们调用成功了,我们来看一下加载顺序:

20160705215552099.png

当然我们也可以编写简单的键值对直接返回一个对象,从而解决全局变量的问题,如下:

 

a.js文件的内容:

/**
 * Created by zhenghao on 2016/7/4.
 */
define(function () {
    return {
        color: "black",
        size: "unisize"
    }
});

app.js初始化文件:

require(['app/a'], function (m){
 console.log(m);
 });

运行结果:


20160705223058086.png

直接返回一个对象,通过使用上面的方法我们可以想到可以解决全局变量概念,比如全局变量全部使用define函数包围,什么时候需要全局变量的话,直接require([‘XX’],function(XX){})这样调用下,同时所有的JS都是异步的,并不会堵塞加载。


目录
相关文章
|
数据库连接 数据库
kettle开发篇-数据库查询
kettle开发篇-数据库查询
373 0
|
SQL 设计模式 数据库
领域模型:贫血模型与充血模型的深度解析
领域模型:贫血模型与充血模型的深度解析
|
搜索推荐 前端开发 架构师
阿里高级技术专家谈开源DDD框架:COLA4.0,分离架构和组件(上)
阿里高级技术专家谈开源DDD框架:COLA4.0,分离架构和组件(上)
2825 0
阿里高级技术专家谈开源DDD框架:COLA4.0,分离架构和组件(上)
|
1月前
|
数据采集 Web App开发 人工智能
基于函数计算FC构建 Browser Tool Sandbox 详解与实操
本文介绍了如何基于阿里云函数计算(FC)构建一个安全、可控的 Browser Tool Sandbox,支持多种浏览器自动化操作方式,包括 Playwright、Puppeteer、Browser Use 和 REST API 等,为 AI Agent 安全高效地操作浏览器提供了完整的技术方案。
|
自然语言处理 前端开发 安全
当被问到你使用过iframe吗?有哪些优点和缺点?
当被问到你使用过iframe吗?有哪些优点和缺点?
579 0
|
11月前
|
前端开发 UED
next/dynamic的动态导入
next/dynamic的动态导入
|
12月前
|
存储 前端开发 JavaScript
浅拷贝和深拷贝的区别?
本文首发于微信公众号“前端徐徐”,介绍了JavaScript中浅拷贝和深拷贝的概念及其实现方法。文章首先解释了数据类型的基础,包括原始值和对象的区别,然后详细介绍了浅拷贝和深拷贝的定义、底层逻辑以及常见的实现方式,如 `Object.assign`、扩展运算符、`JSON.stringify` 和手动实现等。最后,通过对比浅拷贝和深拷贝的区别,帮助读者更好地理解和应用这两种拷贝方式。
596 0
浅拷贝和深拷贝的区别?
|
XML 前端开发 Java
Spring Boot中怎么使用BPMN
在Spring Boot中集成BPMN工作流,如Camunda,能实现业务流程自动化。以请假流程为例,步骤包括:创建Spring Boot项目并添加Camunda依赖;使用Camunda Modeler设计请假流程,涵盖提交申请、经理审批、HR记录及流程完成阶段;保存BPMN文件至`src/main/resources`目录,以便Camunda自动部署;实现流程逻辑,如通过REST API启动流程实例,并传递请假请求数据。整个过程展示了BPMN流程从设计到部署的完整周期,使业务流程自动化变得高效且直接。 **注意:**摘要已压缩至240字符内,部分内容被省略。
906 2
Spring Boot中怎么使用BPMN
LeetCode第17题电话号码的字母组合
该文章介绍了 LeetCode 第 17 题电话号码的字母组合的解法,通过分析得出可使用递归和回溯的思想解决,避免循环穷举的高循环次数,并给出了具体的编码实现,同时总结了该题较难理解,需要了解递归的本质,当嵌套循环层次多时可考虑递归。
LeetCode第17题电话号码的字母组合