require 那点事
require 提供了一个 模块管理的方案 不太熟悉的话挺多暗坑 团队引入 需谨慎 彻底熟悉后 再引入项目
ADM规范
Asynchronous Module Definition - 异步加载模块规范
解决模块化编程带来的代码加载先后顺序问题及常规异步加载代码带来的不确定因素
载入require实现模块化编程
|
1
|
<script src="/static/js/require.min.js" data-main="/static/js/shop"></script> |
data-main指定了入口配置文件shop.js,同时指定了基于shop.js的相对路径baseUrl,baseUrl可以在config配置方法内重置
require.config配置方法
baseUrl重置相对路径
|
1
2
3
|
require.config({ baseUrl : 'js/lib'}); |
paths配置待调用模块路径
|
1
2
3
4
5
6
|
require.config({ paths : { jquery : 'jquery.min', control : 'control' }}); |
已配置路径的模块的调用方式
|
1
2
3
|
require(['jquery', 'control'], function ($, Control){ return true;}); |
shim垫片
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
require.config({ paths : { underscore : 'underscore.min', backbone : 'backbone.min' }, shim : { underscore : { exports : '_' }, backbone : { deps : ['underscore'], exports : 'Backbone' } }}); |
有时我们需要使用非AMD定义模块,如jQuery,需要shim参数来帮助解决这些库的解析名称及载入顺序问题
项目入口配置文件shop.js代码展示
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
require.config({ paths : { jquery : 'jquery.min', jqmd5 : 'jquery.md5', cookie : 'public/cookie', jqui : 'jquery.ui.min', /* 前端UI框架 */ jquid : 'jquery.ui.dialog.min', /* 前端UI框架 - 模态框模块 */ jqtmpl : 'jquery.tmpl.min', /* 模版引擎 */ jqvali : 'jquery.validation.min', /* 表单验证 */ jqvalicn : 'jquery.validation.cn.min', /* 表单验证汉化 */ base : 'base', /* 基础功能 */ control : 'control', /* 控制器模块 */ login : 'login/index', /* 登录页模块 */ register : 'register/index', /* 注册页模块 */ detail : 'detail/index' /* 详情页模块 */ }});require(['control'], function (Control){ Control.cookie(); Control.template();}); |
定义模块的define方法
独立模块
|
1
2
3
4
|
define(function (){ var control = {}; return control;}); |
该模块调用不依赖其它模块
依赖模块
|
1
2
3
4
|
define(['base'], function (){ var control = {}; return control;}); |
该模块调用需要依赖base模块
项目控制器模块control.js代码展示
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
define(['jquery', 'jqmd5', 'cookie', 'base'], function (){ var control = {}; /** * 登录状态检测 */ control.cookie = function (){ setTimeout(WK.LC.syncLoginState, 100); }; /** * 模块调用及配置 */ control.template = function (){ if($('.naver').length > 0) base.naver(); if(CATEGORY == 'login') { if(MODEL == 'index'){ // 登录页 require(['login'], function (Login){ Login.form(); }); }; if(MODEL == 'register' || MODEL == 'check'){ // 注册页 require(['register'], function (Register){ Register.form(MODEL); }); }; }; if(CATEGORY == 'goods') { // 详情页 if(MODEL == 'index'){ require(['detail'], function (Detail){ // Detail.form(); }); }; }; }; return control;}); |
加载模块的require方法
异步加载
|
1
2
3
4
|
require(['control'], function (Control){ Control.cookie(); Control.template();}); |
AMD模式
定义模块的define方法和调用模块的require方法,合称AMD模式
该模式的定义模块方法清晰且不会污染全局环境,能够清楚的显示依赖关系
require是一款可以帮助我们架构好前端框架的好工具,为我们带来更为方便的模块化编程,轻松控制好模块载入的数量和顺序,并且性能优秀
require 那点事的更多相关文章
- iOS 中的 HotFix 方案总结详解
相信HotFix大家应该都很熟悉了,今天主要对于最近调研的一些方案做一些总结.iOS中的HotFix方案大致可以分为四种: WaxPatch(Alibaba) Dynamic Framework(Ap ...
- Lua模块
在lua中,我们可以直接使用require(“model_name”)来载入别的文件,文件的后缀名是.lua,载入的时候直接执行那个文件了. 比如:my.lua 文件中 print(“hello wo ...
- JSPatch 实现原理详解
原文地址https://github.com/bang590/JSPatch/wiki/JSPatch-%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86%E8%AF%A6%E8 ...
- Lua简易入门教程
环境:lua for windows (lfW)主页:http://luaforwindows.luaforge.net/https://code.google.com/p/luaforwindows ...
- [转]LUA 学习笔记
Lua 学习笔记 入门级 一.环境配置 方式一: 1.资源下载http://www.lua.org/download.html 2.用src中的源码创建了一个工程,注释调luac.c中main函数,生 ...
- 转:Lua简明教程
需要注意的是:lua中的变量如果没有特殊说明,全是全局变量,那怕是语句块或是函数里. 这里很奇怪,为什么在函数内部声明的变量默认也是global的呢? 函数的返回值 和Go语言一样,可以一条语句上赋多 ...
- JSPatch实现原理详解
本文转载至 http://blog.cnbang.net/tech/2808/ JSPatch以小巧的体积做到了让JS调用/替换任意OC方法,让iOS APP具备热更新的能力,在实现 JSPatch ...
- Lua简明教程
这几天系统地学习了一下Lua这个脚本语言,Lua脚本是一个很轻量级的脚本,也是号称性能最高的脚本,用在很多需要性能的地方,比如:游戏脚本,nginx,wireshark的脚本,当你把他的源码下下来编译 ...
- [Lua快速了解一下]Lua的model
我们可以直接使用require(“model_name”)来载入别的lua文件,文件的后缀是.lua.载入的时候就直接执行那个文件了.比如: 我们有一个hello.lua的文件: print(&quo ...
随机推荐
- WPF入门教程系列十八——WPF中的数据绑定(四)
六.排序 如果想以特定的方式对数据进行排序,可以绑定到 CollectionViewSource,而不是直接绑定到 ObjectDataProvider.CollectionViewSource 则会 ...
- ICSharpCode.SharpZipLib.dll 移植WP
由于众所周知的原因. ICSharpCode.SharpZipLib.dll在Unity移植WP的时候出现诸多API不兼容,解决方案是在在Github上面找ICSharpCode.SharpZipLi ...
- centos6.5 下搭建lamp环境
一直以为很麻烦,实际操作起来并没有遇到什么问题,yum源是163,php版本是5.3(有点老,以后再更新吧):详细步骤如下: 第一步:安装php mysql apache yum -y install ...
- Visual Studio中没有为此解决方案配置选中要生成的项目
问题: Visual Studio点击"生成解决方案"时,出现"没有为此解决方案配置选中要生成的项目". 解决方法: 菜单->生成->配置管理器-& ...
- Objective-C中的Block回调模式
在前面的博客中提到了Block的概念和使用方法,个人感觉Block最爽的用法莫过于在回调时用block.感觉比委托回调和目标方法回调用着要顺手,好不好用还得读者亲自用一下才知道.如果 读者之前用过SS ...
- Objective-C中把URL请求的参数转换为字典
上一篇博客中是把URL转换为字典,那么我们如何把URL请求中的参数封装成字典,然后再封装成数组呢?对OC中字符串操作熟练的小伙伴们应该觉得这是一个a+b的问题,没错把URL中的参数转换为字典主要是对字 ...
- [c++] Exceptions
注意优先级关系,如下: try { throw logic_error{"blah"}; } catch (exception) { // caught here! // 有点if ...
- 关于java连接mysql数据库的几个问题的解决方法。
今天就为了连接下数据库获取信息来提供给ListView使用,搞了足足5小时. 出现的问题有: 第一个是,DriverManager.getConnection(url, user, pwd),这个函数 ...
- C语言 第三章 基础编程测试与练习
1.屏幕上输出:This is a C program 2.输入两个整数,求两个数的和,如下所示:请输入第1个数:5请输入第2个数:3 3加5的和是8 3.完成华氏温度与摄氏温度间的转换,如下所示:请 ...
- DotNet的JSON序列化与反序列化
JSON(JavaScript Object Notation)JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.在现在的通信中,较多的采用JSON数据格式,JSON有 ...