javascript - RequireJS 在需要 jquery 时偶尔抛出异常

标签 javascript jquery typescript requirejs

<分区>

我在我的 .net 核心应用程序中使用 typescript ,我正在使用 requirejs 管理我的脚本。

所以我的页脚中有一个按钮,单击它时,它会调用我的 .net 核心操作,接收数据并在表面上显示结果。

_Layout.cshtml

<div class="fixed-bottom">
    <footer>
        <a id="debug_button" title="Show/hide debugging">
            <span class="fas fa-code"></span>
        </a>

    </footer>
</div>

<script src="~/lib/requirejs/require.js" data-main="/js/config"></script>

<script>
    require(['../ts/debugarea'],
        function(debugarea) {
            debugarea.buildDebugArea(false);

            $("#debug_button").click(function() {
                debugarea.buildDebugArea(true);
            });
        });
</script>

js/config.js

require.config({
    paths: {
        jquery: "../lib/jquery/dist/jquery",
        bootstrap: "../lib/bootstrap/dist/js/bootstrap",
        backbone: "../lib/backbone/backbone",
        underscore: "../lib/underscore/underscore",
        modernizr: "../lib/modernizr/src/Modernizr",
        unobtrusiveajax: "../lib/Microsoft.jQuery.Unobtrusive.Ajax/jquery.unobtrusive-ajax.min",
        CookieMonster: "../ts/http/CookieMonster",
        debugarea: "../ts/debugarea",
        signalr: "../lib/signalr/dist/browser/signalr"
    },
    shim: {
        backbone: ["jquery", "underscore"],
        bootstrap: ["jquery"],
        Modernizr: {
            exports: 'Modernizr',
        },
        unobtrusiveajax: ["jquery"],
        debugarea:['jquery']
    }
});

和 debugarea.ts

import * as $ from "jquery";

console.log("debugarea");
console.log($);

export function buildDebugArea(switchCookie): void {
    let currentCookieValue: string = CookieMonster.CookieMonster.getCookie('debugarea');

    if (switchCookie) {
        if (currentCookieValue === "")
            CookieMonster.CookieMonster.setCookie('debugarea', "true", 1);
        else
            return clearDebugArea();
    } else if (currentCookieValue === "")
        return clearDebugArea();

    $('#debuginfo').append($('<div id="cookieinfo"></div>'));

    getCookies();
    let debugbuttonIcon: JQuery<HTMLElement> = $('#debug_button > span');
    if (debugbuttonIcon.length == 0) return;

    debugbuttonIcon.addClass("bg-dark text-white");
}

90% 的工作正常,我的 debugarea.ts 控制台输出是

debugarea.ts:3 debugarea
debugarea.ts:4 ƒ ( selector, context ) {

        // The jQuery object is actually just the init constructor 'enhanced'
        // Need init if jQuery is called (just allow error to be thrown if not included)
        return new jQuery…

偶尔,在重新加载浏览器选项卡时,我会在此处收到以下错误:

require.js:1961 GET http://localhost:58006/js/jquery.js 404 (Not Found)
require.js:168 Uncaught Error: Script error for "jquery", needed by: ../ts/debugarea
http://requirejs.org/docs/errors.html#scripterror
    at makeError (require.js:168)
    at HTMLScriptElement.onScriptError (require.js:1738)

下次重新加载时,它会再次起作用。 知道这里出了什么问题吗?我错过了什么吗?

我正在使用 jQuery 3.1.1 和 RequireJS 2.3.5

编辑:这里是调试器(网络选项卡)的两个屏幕截图 - 也许它有帮助。

  1. 当它抛出异常时:

enter image description here

  1. 当它正常工作时:

enter image description here

最佳答案

<script src="~/lib/requirejs/require.js" data-main="/js/config"></script>

我相信您的问题就在这里。您正在指定 data-main 来加载 require.js,从而导致您的脚本异步加载。由于此脚本有时可能会乱序加载,因此其他脚本可能会在它之前或之后加载,这可能会破坏依赖关系。

Using data-main to load configuration is safe only when all the code that depends on this configuration is loaded through the same file you pass to data-main. This could be because you've built a bundle that contains all the modules of your app plus the configuration [...]

发件人:RequireJS sometimes fails to load jQuery

推荐的解决方案:

<script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.5/require.min.js"></script>
<script src="/js/config"></script>

<script>
require(['../ts/debugarea'],
    function(debugarea) {
        debugarea.buildDebugArea(false);

        $("#debug_button").click(function() {
            debugarea.buildDebugArea(true);
        });
    });
</script>

单独(并按顺序)加载脚本应确保在页面加载时正确满足所有依赖项。

关于javascript - RequireJS 在需要 jquery 时偶尔抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51980740/

相关文章:

javascript - 谷歌API地点搜索不工作 Node js

javascript - 淡出文本并淡入下一个 Canvas

jquery - 读取每个div内元素的值

jquery - 为什么 jQuery ui 选项卡不起作用?

javascript - 如何使用翻转插件在悬停时切换图像

javascript - Node.js httpserver.listen 方法歧义

javascript - 日期选择器作为倒计时的输入

javascript - 在声明文件中描述 mixins

redux-localstorage 的 TypeScript 类型问题,persistState 不是一个函数

javascript - 重新加载页面时,生产 URL 中的 Angular 2 会被破坏