requireJS如何在define中按需加载模块?

场景:现有一个common.js模块为通用模块,代码为:

define(function(require, exports, module){
    if(浏览器版本 < IE9){
        require('html5');//加载html5.js插件
    }
});

然后在A.html、B.html、C.html中都加载了common.js:
<script>require(['common'])/script>,
现在问题来了,会发现if(浏览器版本 < IE9)返回的是真还是假,始终都会加载html5.js,之前提了一个问题,为什么包裹在if语句中的require始终会执行呢?
在seajs中有require.async()可以真正按需加载,那么在requireJS中是否有相同的办法呢?

阅读 6.8k
3 个回答

requirejs遵循AMD规范,主要思想肯定就是异步加载咯,seajs遵循CMD规范,自然可以真正按需加载
如果你强行要按需加载的效果,我觉得那还是用seajs吧
不过你说的if中不能加载我还真没测出来这个bug

<script>
            var isIE = (document.all) ? true : false;
            if(isIE){
                requirejs(['lib/GooFunc.js']);
            }
        </script>
        

我这样写if中是不执行的!

题主的问题我还是没有遇到,这样if也是可以控制的

clipboard.png

新手上路,请多包涵

requirejs遵循AMD规范,但是也是可以在代码中使用CMD规范去写的,所以楼上建议用seajs没有必要,楼主提的问题,这里就是去判断然后按需加载。

因为requirejs运行时,会将代码转化为字符串,然后去匹配
callback.toString()

    .replace(commentRegExp, commentReplace) //去除注释
    .replace(cjsRequireRegExp, function (match, dep) {
            deps.push(dep); //匹配出所有调用require的模块
    });

所以不论你有没有执行代码,都会去加载对应js,依赖前置

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏