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 那点事的更多相关文章

  1. iOS 中的 HotFix 方案总结详解

    相信HotFix大家应该都很熟悉了,今天主要对于最近调研的一些方案做一些总结.iOS中的HotFix方案大致可以分为四种: WaxPatch(Alibaba) Dynamic Framework(Ap ...

  2. Lua模块

    在lua中,我们可以直接使用require(“model_name”)来载入别的文件,文件的后缀名是.lua,载入的时候直接执行那个文件了. 比如:my.lua 文件中 print(“hello wo ...

  3. JSPatch 实现原理详解

    原文地址https://github.com/bang590/JSPatch/wiki/JSPatch-%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86%E8%AF%A6%E8 ...

  4. Lua简易入门教程

    环境:lua for windows (lfW)主页:http://luaforwindows.luaforge.net/https://code.google.com/p/luaforwindows ...

  5. [转]LUA 学习笔记

    Lua 学习笔记 入门级 一.环境配置 方式一: 1.资源下载http://www.lua.org/download.html 2.用src中的源码创建了一个工程,注释调luac.c中main函数,生 ...

  6. 转:Lua简明教程

    需要注意的是:lua中的变量如果没有特殊说明,全是全局变量,那怕是语句块或是函数里. 这里很奇怪,为什么在函数内部声明的变量默认也是global的呢? 函数的返回值 和Go语言一样,可以一条语句上赋多 ...

  7. JSPatch实现原理详解

    本文转载至 http://blog.cnbang.net/tech/2808/ JSPatch以小巧的体积做到了让JS调用/替换任意OC方法,让iOS APP具备热更新的能力,在实现 JSPatch ...

  8. Lua简明教程

    这几天系统地学习了一下Lua这个脚本语言,Lua脚本是一个很轻量级的脚本,也是号称性能最高的脚本,用在很多需要性能的地方,比如:游戏脚本,nginx,wireshark的脚本,当你把他的源码下下来编译 ...

  9. [Lua快速了解一下]Lua的model

    我们可以直接使用require(“model_name”)来载入别的lua文件,文件的后缀是.lua.载入的时候就直接执行那个文件了.比如: 我们有一个hello.lua的文件: print(&quo ...

随机推荐

  1. iOS --------Crash 分析(一)

    iOS Crash 分析(文一)- 开始 1. 名词解释 1. UUID 一个字符串,在iOS上每个可执行文件或库文件都包含至少一个UUID.目的是为了唯一识别这个文件. 2. dwarfdump 苹 ...

  2. ImageView设置边框的两种方式

    转载:http://www.2cto.com/kf/201308/239945.html package cc.testimageviewbounds; import android.os.Bundl ...

  3. Java设计模式之建造者模式(Builder)

    前言: 最近一直在学习okHttp,也对其做了一些整理,okHttp和Retrofit结合大大加速我们的开发效率,源码里面采用了很多设计模式,今天我们来学习一下其中的设计模式之一建造者模式. 建造者模 ...

  4. Visual Studio常用小技巧一:代码段+快捷键+插件=效率

    用了visual studio 5年多,也该给自己做下备忘录了.每次进新的组换新的电脑,安装自己熟悉的环境又得重新配置,不做些备忘老会忘记一些东西.工具用的好,效率自然翻倍. 1,代码段 在Visua ...

  5. MAT使用--转

    原文地址: [1]http://ju.outofmemory.cn/entry/172684 [2]http://ju.outofmemory.cn/entry/129445 MAT使用入门 MAT简 ...

  6. 如何使用免费控件将Word表格中的数据导入到Excel中

    我通常使用MS Excel来存储和处理大量数据,但有时候经常会碰到一个问题—我需要的数据存储在word表格中,而不是在Excel中,这样处理起来非常麻烦,尤其是在数据比较庞大的时候, 这时我迫切地需要 ...

  7. CLR中的程序集加载

    CLR中的程序集加载 本次来讨论一下基于.net平台的CLR中的程序集加载的机制: [注:由于.net已经开源,可利用vs2015查看c#源码的具体实现] 在运行时,JIT编译器利用程序集的TypeR ...

  8. SQL Server利用递归把所有【子部门员工】汇总到【一级根节点部门】

    前言 说起这个需求,有点反常规,左边是组织机构树,右边是组织机构对应的员工列表.点击左侧组织机构时传一个组织机构ID,然后查询该组织机构以及其所属的一级节点,如果有部门直属单击节点组织机构,则挂出来员 ...

  9. 弹幕文化与HTML5

    分享人:herry 弹幕篇:弹幕文化与HTML5 说说弹幕 弹幕文化 1什么是弹幕? 弹(dàn)幕(mù)在国内兴起已经有个把年了,相信很多朋友都差不多知道弹幕这个东西. 弹幕系统最初的起源是一家日 ...

  10. 【JS】heatmap.js v1.0 到 v2.0,详细总结一下:)

    前段时间,项目要开发热力图插件,研究了heatmap.js,打算好好总结一下. 本文主要有以下几部分内容: 部分源码理解 如何迁移到v2.0 v2.0官方文档译文 关于heatmap.js介绍,请看这 ...