【require.js】模块化开发
一、Require.js及AMD
Require.js:是一个非常小巧的JavaScript模块载入框架,是AMD规范最好的实现者之一。
AMD(Asynchronous Module Definition):异步模块定义规范(AMD)制定了定义模块的规则,这样模块和模块的依赖可以被异步加载。这和浏览器的异步加载模块的环境刚好适应(浏览器同步加载模块会导致性能、可用性、调试和跨域访问等问题)。
// AMD规范
// 第一个参数,id,是个字符串。它指的是定义中模块的名字,这个参数是可选的。如果没有提供该参数,模块的名字应该默认为模块加载器请求的指定脚本的名字。如果提供了该参数,模块名必须是“顶级”的和绝对的(不允许相对名字)。
// 第二个参数,dependencies,是个定义中模块所依赖模块的数组。依赖模块必须根据模块的工厂方法优先级执行,并且执行的结果应该按照依赖数组中的位置顺序以参数的形式传入(定义中模块的)工厂方法中。
// 第三个参数,factory,为模块初始化要执行的函数或对象。如果为函数,它应该只被执行一次。如果是对象,此对象应该为模块的输出值。
define(id?, dependencies?, factory);
二、Require.js使用
1、目录结构
举例中用到了个中文转换拼音的插件(GitHub地址:https://github.com/sxei/pinyinjs/),这个插件挺好用的,但由于中文中存在多音字,经常会出现不符合常规的拼音,比如(贾宝玉 => "gu bao yu")
├─scripts
│─plus
├─pinyin
│ ├─dist
│ │ ├─pinyin_dict_firstletter.js
│ │ ├─pinyin_dict_notone.js
│ │ ├─pinyin_dict_polyphone.js
│ │ └─pinyin_dict_withtone.js
│ └─pinyinUtil.js
├─jquery.js
├─plusMain.js
├─require.js
└─test.js
2、引入require.js
<script src="/scripts/plus/require.js"></script>
3、挂载模块
[1] 局部加载
//test.js
define(function () {
return {
add: function (a, b) {
alert("传参没用上,哈哈");
}
}
}); //页面代码
$(function () {
require(["/scripts/plus/test.js"], function (h) {
h.add(1, 2);
);
})
[2] 全局加载
//plusMain.js
require.config({
paths: {
jquery: "jquery",
}
}); //页面引用
<script src="/scripts/plus/require.js" data-main="/scripts/plus/plusMain" defer async="true></script>
以这种方法加载时,会默认以“/scripts/plus”为根目录,参数baseUrl可以重置根目录。
//效果相同
require.config({
baseUrl: "/scripts/plus",
paths: {
jquery: "jquery"
}
});
还可引用远端文件,也可以同时引用本地文件,当远端文件加载失败时就会加载本地文件了。
require.config({
paths: {
jquery: ["http://libs.baidu.com/jquery/2.0.3/jquery", "jquery"],
}
});
通过require
加载的模块一般都需要符合AMD规范即使用define
来申明模块,但是部分时候需要加载非AMD规范的js,这时候就需要用到另一个功能:shim。
shim解释起来也比较难理解,shim直接翻译为"垫",其实也是有这层意思的,目前我主要用在两个地方:
一个是,配置模块的依赖关系:例如,拼音插件pinyinUtil.js需要依赖字典才可以正常转换。
require.config({
paths: {
jquery: "jquery",
pinyin_dict_firstletter: "pinyin/dict/pinyin_dict_firstletter",
pinyin_dict_withtone: "pinyin/dict/pinyin_dict_withtone",
pinyin: "pinyin/pinyinUtil"
},
shim: {
pinyin: {
deps: ["pinyin_dict_firstletter", "pinyin_dict_withtone"],// 依赖模块集合
}
}
}); //可以简写成
shim: {
pinyin: ["pinyin_dict_firstletter", "pinyin_dict_withtone"]
}
也可以依赖css文件
require.config({
paths: {
select2: "select2/select2.min"
},
shim: {
select2: ["/scripts/plus/select2/select2.min.css"]
},
});
另一个是,加载非AMD模块输出,将非标准的AMD模块"垫"成可用的模块。
// test.js
(function () {
var NGY = {
Hi: function() {
alert("跨越过去之后");
}
}
window.NGY = NGY;
})(); //配置
require.config({
paths: {
ngy: "test"
},
shim: {
ngy: { exports: "NGY" }
},
}); //使用,不需要声明变量就可以直接使用
require(["ngy"], function () {
NGY.Hi();
});
4、使用require
require(["jquery", "pinyin"], function ($, pinyin) {
$("span").html("谁最可爱?");
var dl = pinyin.getPinyin('当然是我');
});
三、总结
1、更好的分离;
2、更好的代码组织方式;
3、按需加载;
4、避免命名冲突;
5、更好的依赖处理;
【require.js】模块化开发的更多相关文章
- require.js模块化开发
模块化开发的原因: 1.引入的js过多然后在加载的过程中容易出现假死的状态,导致页面会发生白屏 2.变量名的问题 在多人协作开发的时候容易出现变量名的冲突 面向对象 3.引入优先级的问题 模块化开发分 ...
- JS模块化开发----require.js
前言 前端开发中,起初只要在script标签中嵌入几十上百行代码就能实现一些基本的交互效果,后来js得到重视,应用也广泛起来了,jQuery,Ajax,Node.Js,MVC,MVVM等的助力也使得前 ...
- JS模块化开发:使用SeaJs高效构建页面
一.扯淡部分 很久很久以前,也就是刚开始接触前端的那会儿,脑袋里压根没有什么架构.重构.性能这些概念,天真地以为前端===好看的页面,甚至把js都划分到除了用来写一些美美的特效别无它用的阴暗角落里,就 ...
- JS模块化开发(三)——seaJs+grunt
1.seaJs直接构建存在的问题 由于模块之间的依赖require引用的是模块名,当多个js模块被合并成一个时,会由于找不到模块名而报错 2.seaJs+grunt开发 用到的插件:grunt-cmd ...
- 初步理解require.js模块化编程
初步理解require.js模块化编程 一.Javascript模块化编程 目前,通行的Javascript模块规范共有两种:CommonJS和AMD. 1.commonjs 2009年,美国程序员R ...
- Js模块化开发的理解
Js模块化开发的理解 模块化是一个语言发展的必经之路,其能够帮助开发者拆分和组织代码,随着前端技术的发展,前端编写的代码量也越来越大,就需要对代码有很好的管理,而模块化能够帮助开发者解决命名冲突.管理 ...
- require.js模块化
require.js简单来说就是把js代码分装模块化了 模块化 模块就是实现特定功能的一组方法.只要把不同的函数(以及记录状态的变量)简单地放在一起,就算是一个模块. 我拿一个运动框架来解释一下req ...
- js模块化开发——require.js的用法详细介绍(含jsonp)
RequireJS的目标是鼓励代码的模块化,它使用了不同于传统<script>标签脚本加载步骤.可以用它回事.优化代码,但其主要的目的还是为了代码的模块化.它鼓励在使用脚本以moudle ...
- 前端模块化 | 解读JS模块化开发中的 require、import 和 export
本篇分为两个部分 第一部分:总结了ES6出现之前,在当时现有的运行环境中,实现"模块"的方式: 第二部分:总结了ES6出现后,module成为ES6标准,客户端实现模块化的解决方案 ...
- js模块化开发——require.js学习总结
1.为什么使用require.js 作为命名空间: 作为命名空间使用: 异步加载js,避免阻塞,提高性能: js通过require加载,不必写很多script 2.require.js的加载 requ ...
随机推荐
- log4j2配置文件log4j2.xml详解(转载)
此博文转载自阿豪聊干货:https://www.cnblogs.com/hafiz/p/6170702.html 一.背景 最近由于项目的需要,我们把log4j 1.x的版本全部迁移成log4j 2. ...
- JS DOM操作(三) Window.docunment对象——操作属性
属性:是对象的性质与对象之间关系的统称.HTML中标签可以拥有属性,属性为 HTML 元素提供附加信. 属性总是以名称/值对的形式出现,比如:name="value". 属性值始终 ...
- C# Windows程序窗口置前台的几种方法
这个是从别的地方看来的,放我这里 第一种:SetForegroundWindow,这个方法时灵时不灵.有人说,在自己的程序里把自己的窗口之前一般就不灵,而置前其它程序的窗口就灵.我觉得这是有原因的:当 ...
- Java面试题阶段汇总
初级面试题 Java面试题-基础篇一 Java面试题-基础篇二 Java面试题-集合框架篇三 Java面试题-基础篇四 Java面试题-基础篇五 Java面试题-javaweb篇六 Java面试题 ...
- 3.Decorator Pattern(装饰者模式)
装饰者模式: 动态地将责任附加到对象上.想要扩展功能,装饰者提供有别于继承的另一种选择. 举例: 不知道大家学校的食堂是什么点餐制度(或者大家就直接想成吃火锅,我们要火锅料 + 配菜),我们学校的点餐 ...
- Codeforces339D(SummerTrainingDay06-A 线段树)
D. Xenia and Bit Operations time limit per test:2 seconds memory limit per test:256 megabytes input: ...
- 关于CSS和JS中用到的各种Height和Width的问题
自己记不住,列一下关于CSS和JS中用到的各类有关Height和Width属性的介绍对比. 所属类别 属性名 意义 其他 浏览器模型 Screen.height 浏览器窗口所在的屏幕的高度(单位像素) ...
- 大数据java基础day01
day01笔记 1.==操作符和equals方法 equals方法存在于Object类中,所有类的equals方法都继承于Object 2.String类的常用方法 ①.replace()替换字符串 ...
- PDO异常处理
PDO提供了三种处理错误的方式 PDO::ERRMODE_SILENT:静默模式(默认) PDO::ERRMODE_WARNING:警告模式 PDO::ERRMODE_EXCEPTION:异常模式 示 ...
- Java基础笔记(3) 进制与进制转换
---恢复内容开始--- 进制 在一般生活中,我们一直在应用的十进制,就是逢十进一,而今天我们要接触的是,计算机编程常用的进制!首先我们要知道,计算机内部运算采用的是二进制,也就是逢二进制! 1.什么 ...