【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 ...
随机推荐
- js的继承方式分别适合哪些应用场景?
一.原型链 利用 Person.prototype = new Animal("Human") 实现继承: static式继承.能继承Animal.prototype.不可多重继承 ...
- 小程序获取地址授权的修改 wx.openSetting需点击
开发者可以通过 wx.openSetting 接口来打开小程序设置界面并返回用户的设置结果.在原来的 wx.openSetting 接口中,我们允许开发者直接调用此接口,但目前我们发现有不少开发者滥用 ...
- Java设计模式学习记录-代理模式
代理模式 代理模式是常见设计模式的一种,代理模式的定义是:为其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起 ...
- WPF备忘录(5)怎样修改模板中的控件
首先,想问大家一个问题,你们如果要给一个Button添加背景图片会怎么做?(呵呵,这个问题又点小白哈) 是这样吗? <Button Height="57" Horizonta ...
- Visual studio 2017 Installer 打包.netframework
前几步和网上其他教程一样的.主要是把.net framework 打包进安装程序里,如果选的是“从与我的应用程序相同的位置下载系统必备组件”,会提示 ERROR: 要在“系统必备”对话框中启用“从与我 ...
- C#里面的事物回滚,解决同步数据插入时出现重复数据
什么是事物回滚: 举个栗子,你在你家的银行分行取钱,取完钱数据要同步,而且可能每个分行都有一个存储这些数据的数据库,分行的这些 存取的记录都需要实时同步,如果你取完500刚好断电了,好嘛,分行可能刚记 ...
- MVC--DefaultModelBinder解析request参数
转载:http://www.cnblogs.com/leotsai/p/ASPNET-MVC-DefaultModelBinder.html 看到很多ASP.NET MVC项目还在从request.q ...
- python移位运算符
1,二进制方式 >>> bin( 1 ) '0b1' >>> bin( 10 ) '0b1010' >>> a = 0b10 >>&g ...
- PHP解决中文乱码
在php中,中文乱码非常头疼,很麻烦,所以根据在编程的经验,总结以下方法(以utf_8为例), 1.php中在头部header设置编码方式 header("Content-type:text ...
- Wireshark wireshake数据包分割及捕包过滤器介绍
wireshake数据包分割及捕包过滤器介绍 by:授客 QQ:1033553122 wireshake自带工具editcap分割数据包 操作: 进入到目录,然后 editcap.exe -c < ...