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

发布于 2022-09-02 00:54:25 字数 480 浏览 26 评论 0

场景:现有一个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中是否有相同的办法呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

玩世 2022-09-09 00:54:25

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

空心空情空意 2022-09-09 00:54:25

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

吻风 2022-09-09 00:54:25

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

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文