RequireJS初探

什么是RequireJS?

/* ---

RequireJS 是一个JavaScript模块加载器。它非常适合在浏览器中使用, 它非常适合在浏览器中使用,但它也可以用在其他脚本环境, 就像 Rhino and Node. 使用RequireJS加载模块化脚本将提高代码的加载速度和质量。

IE 6+ .......... 兼容 ?
Firefox 2+ ..... 兼容 ?
Safari 3.2+ .... 兼容 ?
Chrome 3+ ...... 兼容 ?
Opera 10+ ...... 兼容 ?

开始使用 或者看看 API

--- */

http://www.requirejs.cn/home.html

https://github.com/jrburke/requirejs

一句话, 它是为了JS模块化而生,是代码逻辑封装的手段,  目的是为了减少代码复杂度,提高代码可维护性, 满足设计上要求的高内聚+低耦合。

为浏览器环境而生,提高js加载速度。

为什么要有RequireJS?

http://www.requirejs.cn/docs/why.html

遇到的问题

  • Web sites are turning into Web apps

  • Code complexity grows as the site gets bigger
  • Assembly gets harder
  • Developer wants discrete JS files/modules
  • Deployment wants optimized code in just one or a few HTTP calls

---- 翻译 ----

1、 web站点转变为 web应用

2、代码复杂度随着站点的变大而增长

3、组装(页面代码)更加困难

4、开发者需要分离js文件和模块

5、部署活动需要优化过的代码存储在一个文件中, 或者少些HTTP请求。

解决方案:

Front-end developers need a solution with:

  • Some sort of #include/import/require

  • ability to load nested dependencies
  • ease of use for developer but then backed by an optimization tool that helps deployment

---- 翻译 ----

前端开发者需要一个满足如下条件的解决方案:

1、一些类似 include import require 等经典模块方法

2、有能力加载嵌套依赖

3、对于开发者易用, 同时也可以被(用于部署的)优化工具支持。

---- 模块化进化史 -----

原始

-在一个页面还很简单的时候, 一个同事添加了一个js函数  function xx

后由于新增需求, 另外一个同事处于另外目的, 添加了一个相同名称的函数 function xx, 内容实现不一样, 这样就悲剧了, 第一个同事实现的 函数被冲掉了, 因为它们都定义在 全局环境中。

IIFE == imediately invoked function expression  立刻执行函数表达式

组织规范要求, 每个人开发的相关内容做为一个模块, 必须放在一个IIFE的函数体中,

(fuction(){

funciton XX(){}

})();

这样两个同事开发代码都不会相互影响对方, 但是这样定义的函数, 不能再全局环境的其他代码中调用, 因为在IIFE中的函数只在其函数体中生效, 可以作为window一个属性开放出去,

但是其仍然有个缺点, 就是两个模块之间的依赖无法体现, 如果后面一个同事的开发模块, 依赖前一个同事的, 这样后面同事写的代码必须在 前一个同事代码 之后, 否则就会调用失败。

module时代

随着web页面内容越来越大, 前端代码越来越复杂,且有复杂的代码依赖关系。 就需要今天的主题事物出场。

AMD vs CommonJS

模块化标准包括 commonjs和requirejs, requireJS满足AMD标准, 为啥采用AMD?

因为主要是此标准为异步加载设计, 故适合浏览器远程加载若干模块的js文件。

而commonjs标准,加载文件为同步模式, 一个一个执行, 适合加载本地文件, nodejs实现满足此标准。

两个标准的详细描述见:

http://www.commonjs.org/

http://www.requirejs.org/docs/whyamd.html

怎么使用RequireJS?

http://requirejs.org/docs/api.html

定义模块,新建一个文件, 按照api规范定义模块实现, 模块返回为对象

//Inside file my/shirt.js:
define({
    color: "black",
    size: "unisize"
});

如果还有些定制逻辑,则有可以使用函数,作为模块实现作用域:

//my/shirt.js now does setup work
//before returning its module definition.
define(function () {
    //Do setup work here

    return {
        color: "black",
        size: "unisize"
    }
});
 

如果模块对其他模块有依赖

//my/shirt.js now has some dependencies, a cart and inventory
//module in the same directory as shirt.js
define(["./cart", "./inventory"], function(cart, inventory) {
        //return an object to define the "my/shirt" module.
        return {
            color: "blue",
            size: "large",
            addToCart: function() {
                inventory.decrement(this);
                cart.add(this);
            }
        }
    }
);

模块也可以返回函数

//A module definition inside foo/title.js. It uses
//my/cart and my/inventory modules from before,
//but since foo/title.js is in a different directory than
//the "my" modules, it uses the "my" in the module dependency
//name to find them. The "my" part of the name can be mapped
//to any directory, but by default, it is assumed to be a
//sibling to the "foo" directory.
define(["my/cart", "my/inventory"],
    function(cart, inventory) {
        //return a function to define "foo/title".
        //It gets or sets the window title.
        return function(title) {
            return title ? (window.title = title) :
                   inventory.storeName + ‘ ‘ + cart.name;
        }
    }
);

还可以自定义模块名称

    //Explicitly defines the "foo/title" module:
    define("foo/title",
        ["my/cart", "my/inventory"],
        function(cart, inventory) {
            //Define foo/title object in here.
       }
    );

DEMO

定义了两个模块, 和一个app, 依赖两个模块, 调用并执行:

https://github.com/fanqingsong/code-snippet/tree/master/web

one.js

//Inside one.js:
define(function() {
        return function(title) {
            return console.log(‘one module called‘);
        }
    }
);

two.js

//Inside two.js:
define(function() {
        return function(title) {
            return console.log(‘two module called‘);
        }
    }
);

app.js

requirejs.config({
    //By default load any module IDs from ./
    baseUrl: ‘./‘,
});

// Start the main app logic.
requirejs([‘one‘, ‘two‘],
function   (one, two) {
    one();
    two();
});

demo.html

<html>
<head>
        <!--This sets the baseUrl to the "scripts" directory, and
            loads a script that will have a module ID of ‘main‘-->
        <script data-main="./app.js" src="./require.js"></script>
        <style>

</style>
</head>
<body>
        <h1>hello world!</h1>
</body>
</html>

打印:

时间: 2024-10-11 04:57:33

RequireJS初探的相关文章

requirejs 初探

作为一个前端模块化设计和加载的框架,我们该好好理解下. 引用 <script data-main='.. 主文件路径,相对于要请求的页面' src='requirejs地址'>假如我们主文件时main.js 我们需要引用jquery,underscore,backbone require.config({ baseUrl : 'js的基本路径',//可以忽略 paths   : { 'jquery': 'jquery.min', 'underscore': 'underscore', 'bac

requirejs、backbone.js配置

requirejs初探参考资料官网:http://requirejs.org中文译文:http://makingmobile.org/docs/tools/requirejs-api-zhreuqirejs.backbone的配置例子 (function(){ require.config({ baseUrl: "../js", paths: { jquery: "libs/jquery.min", underscore: "libs/underscore

RequireJS 2.0初探

就在前天晚上RequireJS发布了一个大版本,直接从version1.0.8升级到了2.0.随后的几小时James Burke又迅速的将版本调整为2.0.1,当然其配套的打包压缩工具r.js也同时升级到了2.0.1.此次变化较大,代码也进行了重构,层次更清晰可读.功能上主要变化如下: 1,延迟模块的执行. 这是一个很大变化,以前模块加载后factory立马执行.性能上肯定有一些损耗.2.0修改实现,再没人诟病AMD的模块是立即执行的.现在也可以等到require的时候才执行. 2,config

从273二手车的M站点初探js模块化编程

前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数据. 273这个M站点是产品推荐我看的.第一眼看这个产品时我就再想他们这个三次加载和翻页按钮的方式,那么小分页的pageIndex是怎么计算的.所以就顺便看了下源码. 提到看源码时用到了Chrome浏览器的格式化工具(还是朋友推荐我的,不过这个格式化按钮的确不明显,不会的话自行百度). 三次加载和分

初探百度F.I.S — 由工具到解决方案

1. 前言 阅兵放假三天,我哪儿也没去,宅着看了一些东东:git命令行.svn命令以及下面的主角——百度FIS.对看过的git.svn的命令也做了一些总结,请参见:<git命令学习笔记>和<svn命令学习笔记> 另外,我是开源富文本编辑器 wangEditor 的作者,欢迎大家关注我的项目.下文也会结合我在开发该编辑器过程中的经历,来对比说百度FIS 在查看下文之前,可以先说一下我初探百度FIS,对它的一个总结——由工具到解决方案.不知道大家对“工具”和“解决方案”这两个词如何理解

requireJS

1.用于ADM(基于模块的异步加载JavaScript代码的机制)js模块开发 2.下载requireJS 3.好处: 1)有效防止命名冲突(js多时可能很多全局变量容易重复) 2)声明不同的js文件之间的依赖 3)模块化的开发 4.常用方法: requirejs.config:为模块指定别名 requirejs:将写好的模块引入并编写主代码 define:编写模块,在相应地方来引用 5.例子: 1)引入模块入口data-main是入口;<script data-main="js/main

进阶之初探nodeJS

一.前言 在"初探nodeJS"随笔中,我们对于node有了一个大致地了解,并在最后也通过一个示例,了解了如何快速地开启一个简单的服务器. 今儿,再次看了该篇随笔,发现该随笔理论知识稍多,适合初级入门node,固萌生一个想法--想在该篇随笔中,通过一步步编写一个稍大一点的node示例,让我们在整体上更加全面地了解node. so,该篇随笔是建立在"初探nodeJS"之上的,固取名为"进阶之初探nodeJS". 好了,侃了这多,那么我们即将实现一个

requireJS(一)

一:为什么要使用requireJS? 很久之前,我们所有的JS文件写到一个js文件里面去进行加载,但是当业务越来越复杂的时候,需要分成多个JS文件进行加载,比如在页面中head内分别引入a.js,b.js,c.js等,如下所示: <script src="js/app/a.js"></script> <script src="js/app/b.js"></script> <script src="js/

JS模块化工具requirejs教程02

基本API require会定义三个变量:define,require,requirejs,其中require === requirejs,一般使用require更简短 define 从名字就可以看出这个api是用来定义一个模块 require 加载依赖模块,并执行加载完后的回调函数 前一篇中的a.js: define(function(){ function fun1(){ alert("it works"); } fun1(); }) 通过define函数定义了一个模块,然后再页面