JS模块化规范AMD之RequireJS

1.基本操作

  1. 加载 JavaScript 文件(入口文件)

    RequireJS以一个相对于baseUrl的地址来加载所有的代码

    <script data-main="scripts/main.js" src="scripts/require.js"></script>
    
  2. 相关配置
    requirejs.config({
    
        baseUrl: ‘js/lib‘,
    
        paths: {
            app: ‘../app‘
        }
    });
    
    requirejs([‘jquery‘, ‘canvas‘, ‘app/sub‘],
    function   ($,        canvas,   sub) {
        //jQuery, canvas and the app/sub module are all
        //loaded and can be used here now.
    });
    

2.模块相关

  1. 简单的值对

    define({
    
        color: "black",
        size: "unisize"
    });
    
  2. 没有任何依赖的函数式定义
    define(function () {
    
        return {
            color: "black",
            size: "unisize"
        }
    });
    
  3. 存在依赖的函数式定义
    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);
                }
            }
        }
    );
    

4.将模块定义为一个函数

    define(["my/cart", "my/inventory"],
        function(cart, inventory) {

            return function(title) {
                return title ? (window.title = title) :
                       inventory.storeName + ‘ ‘ + cart.name;
            }
        }
    );

3.简单包装CommonJS来定义模块

define(function(require, exports, module) {
    var a = require(‘a‘),
        b = require(‘b‘);

    //Return the module value
    return function () {};
    }
);

4. 定义一个命名模块(jquery中使用)

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

jquery:

if ( typeof define === "function" && define.amd ) {
    define( "jquery", [], function() {
        return jQuery;
    } );
}

5.JSONP服务依赖

为了在RequireJS中使用JSON服务,须要将callback参数的值指定为"define"。这意味着你可将获取到的JSONP URL的值看成是一个模块定义。

下面是一个调用JSONP API端点的示例。该示例中,JSONP的callback参数为"callback",因此"callback=define"告诉API将JSON响应包裹到一个"define()"中:

require(["http://example.com/api/data.json?callback=define"],
    function (data) {
        //The data object will be the API response for the
        //JSONP data call.
        console.log(data);
    }
);

仅支持返回值类型为JSON object的JSONP服务,其他返回类型如数组、字串、数字等都不能支持。

6.压缩合并

  1. 常规压缩合并

    node r.js -o baseUrl=js name=main out=built.js
    

    有外部CDN的情况

    //表示paths.jquery不参与合并,压缩。这时生成的built.js
    node r.js -o baseUrl=js name=main out=built.js paths.jquery=empty:  也就不包含它了。
    

    合并成大文件,设置配置文件

    ({
        appDir: "./",
        baseUrl: "js",
        dir: "../r6-built",
        paths: {
            jquery: ‘empty:‘
        },
        modules: [
            {
                name: "page1"
            },
            {
                name: "page2"
            }
        ]
    })
    

    命令

    node r.js -o build.js
    
  2. 合并压缩CSS
    node r.js -o cssIn=css/main.css out=css/built.css
    

    还可以使用optimizeCss参数设置来配置是否压缩及压缩选项。

    optimizeCss的取值有

    none  不压缩,仅合并
    
    standard  标准压缩 去换行、空格、注释
    
    standard.keepLines  除标准压缩外,保留换行
    
    standard.keepComments  除标准压缩外,保留注释
    
    standard.keepComments.keepLines  除标准压缩外,保留换行和注释
    

    示例:

    node r.js -o cssIn=css/main.css out=css/built.css optimizeCss=standard
    

    压缩后built.css整个为一行了。

body>*:first-child { margin-top: 0 !important }
body>*:last-child { margin-bottom: 0 !important }
p,blockquote,ul,ol,dl,table,pre { margin: 15px 0 }
h1,h2,h3,h4,h5,h6 { padding: 0; font-weight: bold }
h1 tt,h1 code,h2 tt,h2 code,h3 tt,h3 code,h4 tt,h4 code,h5 tt,h5 code,h6 tt,h6 code { font-size: inherit }
body>h2:first-child,body>h1:first-child,body>h1:first-child+h2,body>h3:first-child,body>h4:first-child,body>h5:first-child,body>h6:first-child { margin-top: 0; padding-top: 0 }
a:first-child h1,a:first-child h2,a:first-child h3,a:first-child h4,a:first-child h5,a:first-child h6 { margin-top: 0; padding-top: 0 }
h1+p,h2+p,h3+p,h4+p,h5+p,h6+p { margin-top: 10px }
a { color: #4183C4; text-decoration: none }
a:hover { text-decoration: underline }
ul,ol { padding-left: 30px }
ul li>:first-child,ol li>:first-child,ul li ul:first-of-type,ol li ol:first-of-type,ul li ol:first-of-type,ol li ul:first-of-type { margin-top: 0px }
ul ul,ul ol,ol ol,ol ul { margin-bottom: 0 }
dl { padding: 0 }
dl dt { font-size: 14px; font-weight: bold; font-style: italic; padding: 0; margin: 15px 0 5px }
dl dt:first-child { padding: 0 }
dl dt>:first-child { margin-top: 0px }
dl dt>:last-child { margin-bottom: 0px }
dl dd { margin: 0 0 15px; padding: 0 15px }
dl dd>:first-child { margin-top: 0px }
dl dd>:last-child { margin-bottom: 0px }
pre,code,tt { font-size: 12px; font-family: Consolas, "Liberation Mono", Courier, monospace }
code,tt { margin: 0 0px; padding: 0px 0px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8 }
pre>code { margin: 0; padding: 0; white-space: pre; border: none; background: transparent }
pre { background-color: #f8f8f8; border: 1px solid #ccc; font-size: 13px; line-height: 19px; overflow: auto; padding: 6px 10px }
pre code,pre tt { background-color: transparent; border: none }
kbd { background-color: #DDDDDD; background-image: linear-gradient(#F1F1F1, #DDDDDD); background-repeat: repeat-x; border-color: #DDDDDD #CCCCCC #CCCCCC #DDDDDD; border-style: solid; border-width: 1px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; line-height: 10px; padding: 1px 4px }
blockquote { border-left: 4px solid #DDD; padding: 0 15px; color: #777 }
blockquote>:first-child { margin-top: 0px }
blockquote>:last-child { margin-bottom: 0px }
hr { clear: both; margin: 15px 0; height: 0px; overflow: hidden; border: none; background: transparent; border-bottom: 4px solid #ddd; padding: 0 }
.postBody a:link, .postBody a:visited, .postBody a:active ,.postBody a,.postBody a:hover, { text-decoration: none }
a:hover { cursor: pointer }
img { max-width: 100% }

时间: 2024-11-09 17:28:36

JS模块化规范AMD之RequireJS的相关文章

js模块化规范—AMD规范

AMD规范说明 AMD全称是:Asynchronous Module Definition(异步模块定义),github地址 是专门用于浏览器端, 模块的加载是异步的 AMD规范基本语法 定义暴露模块 //定义没有依赖的模块 define(function(){ return 模块 }) //定义有依赖的模块,module1和m1一一对应 define(['module1', 'module2'], function(m1, m2){ return 模块 }) 引入使用模块 require(['

JS模块化规范CMD之SeaJS

1. 在接触规范之前,我们用模块化来封装代码大多为如下: ;(function (形参模块名, 依赖项, 依赖项) { // 通过 形参模块名 修改模块 window.模块名 = 形参模块名 })(window.模块名 || {}, 依赖项, 依赖项) 分号是什么作用? 答:为了防止前面的代码没有添加分号造成语法解析错误,也可能会是 "!", "+" 等 为什么要将代码放入一个自执行函数中 答:为了避免全局命名空间污染,核心就是利用函数的私有作用域 为什么将依赖项作

js模块化开发——AMD规范

这个系列的第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块. 七.模块的规范 先想一想,为什么模块很重要? 因为有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块. 但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有你的写法,我有我的写法,岂不是乱了套!考虑到Javascript模块现在还没有官方规范,这一点就更重要了. 目前,通行的Javascript模块规范共有两种:CommonJS和AMD.我主要介绍AMD,但是要先从Co

js模块化规范—概念和模块化进化史以及模块化的问题

模块的概念 一个复杂的项目开发中,会写很多js文件,一个js文件执行某些特定的功能,那么每个js都可以称为一个模块,这就是模块的概念 每个js模块内部数据/实现是私有的, 只是向外部暴露一些接口(方法)与外部其它模块通信 模块化的进化史 全局function模式:将不同的功能封装成不同的全局函数 问题: Global被污染了, 很容易引起命名冲突 //数据 let data = 'atguigu.com' //操作数据的函数 function foo() { console.log(`foo()

js模块化规范

1. CommonJS 用于服务端模块化编程,比如nodejs就采用此规范: 一个文件就是一个模块,require方法用来加载模块,该方法读取一个文件并执行,最后返回文件内部的module.exports对象: require是默认读取.js文件的,所以require(模块名)可以不写后缀: 同步加载,由于服务端加载的模块一般在本地,所以可以这样:但是在客户器端如果一个模块过大就会导致页面"假死": module.exports属性表示当前模块对外输出的接口,其他文件加载该模块,实际上

JS模块化历程

这是一篇关于js模块化历程的长长的流水账,记录js模块化思想的诞生与变迁,展望ES6模块化标准的未来.经历过这段历史的人或许会感到沧桑,没经历过的人也应该知道这段历史. 一.无模块时代 在ajax还未提出之前,JS还主要用来在网页上进行表单校验.实现简单的动画效果等等,你可以回想一下那个网页上到处有公告块飘来飘去的时代. 这个时候并没有前端工程师,服务端工程师只需在页面上随便写写js就能搞定需求.那个时候的前端代码大概像这样: if(xx){ //....... } else{ //xxxxxx

关于js模块化历程的长长的流水账

无模块时代 在ajax还未提出之前,js还只是一种“玩具语言”,由Brendan Eich花了不到十天时间发明,用来在网页上进行表单校验.实现简单的动画效果等等,你可以回想一下那个网页上到处有公告块飘来飘去的时代. 这个时候并没有前端工程师,服务端工程师只需在页面上随便写写js就能搞定需求.那个时候的前端代码大概像这样: if(xx){ //.......} else{ //xxxxxxxxxxx} for(var i=0; i<10; i++){ //........} element.onc

js 模块化历程

作者:吕大豹 网址:http://www.cnblogs.com/lvdabao/p/js-modules-develop.html 这是一篇关于js模块化历程的长长的流水账,记录js模块化思想的诞生与变迁,展望ES6模块化标准的未来.经历过这段历史的人或许会感到沧桑,没经历过的人也应该知道这段历史. 无模块时代 在ajax还未提出之前,js还只是一种“玩具语言”,由Brendan Eich花了不到十天时间发明,用来在网页上进行表单校验.实现简单的动画效果等等,你可以回想一下那个网页上到处有公告

JS模块化开发:使用SeaJs高效构建页面

一.扯淡部分 很久很久以前,也就是刚开始接触前端的那会儿,脑袋里压根没有什么架构.重构.性能这些概念,天真地以为前端===好看的页面,甚至把js都划分到除了用来写一些美美的特效别无它用的阴暗角落里,就更别说会知道js还有面向对象,设计模式,MVC,MVVM,模块化,构建工具等等这些高大上的概念了.现在想想还真是Too young too naive.前两天某大神在群里分享他招聘前端的心得的时候就说,就是那些以为能写两个页面就可以自称前端的人拉低了行业水平.这样看来前两年我还真的扯了不少后腿呢……