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. js中的块作用域

    今天我们来一起研究下JavaScript中的变量作用域问题,话不多说,直接上代码. <script type="text/javascript"> (function( ...

  2. Laravel 5.3 auth中间件底层实现详解

    1. 注册认证中间件, 在文件 app/Http/Kernel.php 内完成: protected $routeMiddleware = [ 'auth' => \Illuminate\Aut ...

  3. 前端MVC框架Backbone 1.1.0源码分析系列

    Backbone.js 是一个在JavaScript环境下的 模型-视图-控制器 (MVC) 框架.任何接触较大规模项目的开发人员一定会苦恼于各种琐碎的事件回调逻辑.以及金字塔般的代码.而且,在传统的 ...

  4. 使用karma测试平时写的小demo(arguments为例)

    有人说前端自动化测试非常困难,我觉得确实如此.在项目中,我个人也不放心写的测试,还是要手动测试.但是我们平时写demo学习时,完全可以使用自动化测试. 传统demo 1,新建一个html 2,写入js ...

  5. IOS开发之自定义Button(集成三种回调模式)

    前面在做东西的时候都用到了storyboard,在今天的代码中就纯手写代码自己用封装个Button.这个Button继承于UIView类,在封装的时候用上啦OC中的三种回调模式:目标动作回调,委托回调 ...

  6. EntityFramework 7 如何查看执行的 SQL 代码?

    EF 其他版本:EntityFramework 如何查看执行的 SQL 代码? 在 EF7 中,并没有 Context.Database.Log 属性访问方式,但改变更加强大了,我们可以使用下面方式配 ...

  7. spring @import和@importResource

    @ImportResource in spring imports application xml in configuration file which is using @Configuratio ...

  8. 1Z0-053 争议题目解析501

    1Z0-053 争议题目解析501 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 501.Note the output of the following query; SQL&g ...

  9. 用JAVA实现插值查询的方法(算近似值,区间求法)

    插值查询:如果有这样一张表,有一列叫水位,有一列叫库容,比如下面的图. 我现在想做这么一件事情:对于这个测站而言,当我输入某一个水位或者库容的时候,想要查询到对应的水位或者库容呢? 而这个值不一定是存 ...

  10. 【PHP面向对象(OOP)编程入门教程】23.自动加载类 __autoload()函数

    很多开发者写面向对象的应用程序时,对每个类的定义建立一个 PHP 源文件.一个很大的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件的列表. 在软件开发的系统中,不可能把所有的类都写在 ...