zoukankan      html  css  js  c++  java
  • requireJS

    requireJS 

    
        
    
        // 是否忽略 CSS 资源文件中的 @import 指令
        cssImportIgnore: null,
        
        //参与压缩的主模块,默认情况下会将paths模块中定义的模块都压缩合并到改模块中,通过exclude 可以排除参与压缩的模块,其中模块的地址都是相对于baseUrl的地址。
        modules: [{ 
            name: 'index',
            exclude: ['c']
        }],
        
        // 包裹模块
        wrap: true,
        
        // 自定义包裹模块,顾名思义就是使用特定内容去包裹modules指定的合并模块内容,如此一来 define/require 就不再是全局变量,在 end 中可以暴露一些全局变量供整个函数使用
        wrap: {
             start: "(function() {",
             end: "}(window));"
         },
    
        removeCombined: false,
        
        //如果shim配置在requirejs运行过程中被使用的话,需要在这里重复声明,这样才能将依赖模块正确引入。
        shim: {} 
        
         // 载入requireJS 的配置文件,从而使用其中的paths 以及 shim 属性值。通过指定该属性,可以省去我们在bulid.js中重复定义 paths 与 shim属性。
        mainConfigFile:"js/app.js",
    })
    

    以上环节都准备好了之后,就可以在终端中允许打包压缩命令: node r.js -o build.js

    其它问题

    timeout超时问题

    该问题一般是 waitSeconds 属性值导致,解决的方法有两个,一个是将 waitSeconds的值设置更长时间,比如17s,另一个就是将其值设置为0,让其永不超时。

    循环依赖问题

    何为循环依赖?
    如果存在两个模块,moduleA 与 moduleB, 如果 moduleA 依赖 moduleB ,moduleB也依赖了moduleA,并且这中情况下,便是循环依赖。
    循环依赖导致的问题!
    如果两个模块循环依赖,并且A中有调用B中的方法,而B中也有调用A中的方法,那么此时,A调用B正常,但是B中调用A方法,则会返回 undefined 异常。
    如何解决循环依赖的问题?
    通过 require([],fn) 解决
    此时在模块B中,我们通过引入 require 依赖,然后再通过 require() 方法去载入模块A,并在回调中去执行。

    define(['require','jquery'],function(require,$){
    
        function bFunction(){
            alert('this is b module');
        }
    
        require(['moduleA'],function(m){
            m() // 执行传递过来方法
        });
    
        return bFunction;
    });
    

    这里要引起我们注意的地方就是依赖的'module'模块,它是一个预先定义好的值,引入该值,在当前模块下便可以调用 require 方法。

    通过 exports 解决

    define(['exports','jquery'],function(exports,$){
    
        function bFunction(){
            exports.aFunction();
            alert('this is b module');
        }
    
        exports.bFunction = bFunction;
    });

    相同的这里依赖的 module 模块也是一个预先定义好的值,,引入该值,在当前模块下便可以调用 exports 对象设定当前模块的返回值。
    而通过 exports 所解决的循环依赖问题,有一个需要注意的地方,那就是方法的执行必须要放入到当前定义方法的回调中,因为我们不能确定 moduleA 与 moduleB的加载顺序。

    CDN回退

    如果我们不确定一个模块的加载正确,我们可以在 require.config()方法中将模块的地址替换为一个数组,数组的元素,便是同一模块的多个地址。

    requirejs.config({
        paths: {
            jquery: [
                '//cdnjs.cloudflare.com/ajax/libs/jquery/2.0.0/jquery.min.js',
                'lib/jquery'
            ]
        }
    });

    定义AMD插件

    有时候我们自己编写的一款插件,我们需要它能够在任何环境中都能起作用,比如在引入requireJS的AMD环境下可以作为符合AMD规范的插件,进行模块式加载调用,而在普通的浏览器环境中也可以正常的执行。
    想实现这一功能,其实很简单,只需要按照下例格式去编写插件即可。

    // say.js 基于JQ扩展的插件。
    (function(global,factory){
        if(typeof define === 'function' && define.amd){
            define(['jquery','exports'],function($,exports){
                return factory($)
            });
        }else{
            factory(global,$)
        }
    }(window,function($){
        var name = "shenguotao";
        $.say = function(v){
            alert(v);
        }
        return {
            name:name
        }
    }));
    
    // index.js
    define(['a'],function($,a){
        $.alert(a.name);
    })
    

    关于require的预定义模块

    关于这个问题,我们上面也有说到,这里就进行一次总结。
    我们可以这样理解,对于 requireJS 来说,除了我们自己使用require.config()定义的模块,它内部也有自己预先定义好的模块,比如:require,exports,modules ,在使用时,我们无需在 require.config() 去中定义,而是可以直接在依赖中引入使用,比如:

    //index.js
    define(['jquery','config','require','exports','module'],function($,config,require,exports,module){
      $(function(){
          require.config(config); // 载入配置文件
          exports.data = 'index Module Return Value' //定义模块的返回值。
          modules.config().color; // 接受在配置文件中为该模块配置的参数数据。
      })
    });

    关于require加载CSS的问题

    requireJS不仅仅只加载JS文件,实际上它还可以加载CSS样式文件,但是这需要借助一个requireJS插件才能实现。
    下载地址:require-css.js

    使用上,有两种方式,一种在配置参数中进行声明:

    var require = {
        baseUrl:'js/',
        paths:{
            'index':'index',
            'a':'a'
        },
        shim:{
            'a':{
                deps:['css!../css/a.css']
            }
        },
        deps:['index']
    };
    //index.js
    define(['a']); // 载入模块不执行任何操作。

    另一种是直接在模块中进行依赖声明

    define(['css!../css/a.css']);

    最后说下我个人对 css!../css/index.css 的理解吧,首先 ! 是插件与插件参数的分割符号,因此"css"就是插件的模块名,requireJS会先去检查 css 这个模块是否有在配置文件中声明,如果没有则会默认在 baseUrl 指向的路径下去载入,而分隔符右边的 '../css/a.css' 就是插件要使用的参数,这里便是要载入的css文件地址。


    http://requirejs.org/docs/api.html // 这是require的英文版官网,建议来这里学习,中文版太多翻译问题。
    https://segmentfault.com/a/1190000002401665 //对require的配置参数讲解的很详细

  • 相关阅读:
    udacity android 实践笔记: lesson 4 part b
    iosiPhone屏幕尺寸、分辨率及适配
    【基础练习】【区间DP】codevs2102 石子归并2(环形)题解
    Spring Boot MyBatis 连接数据库
    知乎日报 API 分析
    Dijkstra算法
    win7远程桌面连接不上,解决办法
    ECharts图表中级入门之formatter:夜谈关于ECharts图表内的数据格式化方法
    myeclipse 连接svn服务器验证位置时发生错误 404 forbidden
    极路由系列 刷机方法
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/6624137.html
Copyright © 2011-2022 走看看