【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 ...
随机推荐
- Ansible-安装-秘钥-部署-使用
本文转自:https://www.cnblogs.com/ylqh/p/5902259.html ansiblemaster:192.168.74.146 ansibleslave1 :192.168 ...
- notepad++ jstool 插件安装
notepad++ 格式化显示 网上下载 jstool 插件 放入Notepad++\安装目录的plugins位置下,重启即可使用 插件-->JSTool
- Java 使用pipeline对redis进行批量读写
code import redis.clients.jedis.Jedis; import redis.clients.jedis.Pipeline; import java.util.List; p ...
- Navicat备份、还原mysql数据库
注:本文为原创,转载请附带链接:https://www.cnblogs.com/stm32stm32
- Core Animation之基础介绍
了解了图层,现在学习核心动画. Core Animation是直接作用在CALayer上的,并非UIView. 一.使用步骤 1.使用它需要先添加QuartzCore.framework框架和引入主头 ...
- C#微信小程序服务端获取用户解密信息
using AIOWeb.Models; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.C ...
- cloudera Manager使用总结
最近在用cloudera Manager来 在几个虚拟机上进行hadoop 的安装,总结一下遇到的问题. 1 似乎没有 start-balancer.sh 命令 似乎安装包中没有这个命令 怎么 ...
- NIO,AIO,BIO
同步和异步:同步和异步关注的是消息通信机制, 同步:就是在发出一个“调用”时,在没有得到结果之前,该“调用”就不返回,但是一旦调用返回,就得到返回值了;换句话说:就是由“调用者”主动等待“调用”结果 ...
- JavaScript的三种对话框是通过调用window对象的三个方法alert(),confirm()和prompt()
第一种:alert()方法 alert()方法是这三种对话框中最容易使用的一种,她可以用来简单而明了地将alert()括号内的文本信息显示在对话框中,我们将它称为警示对话框,要显示的信息放置在括号内, ...
- 01-Javascript简介(了解)
[转]01-Javascript简介(了解) Web前端有三层: HTML:从语义的角度,描述页面结构 CSS:从审美的角度,描述样式(美化页面) JavaScript:从交互的角度,描述行为(提升用 ...