代码之家  ›  专栏  ›  技术社区  ›  Adrián

JavaScript UI、requirejs和无样式内容的Flash

  •  3
  • Adrián  · 技术社区  · 12 年前

    我目前使用requirejs主要是因为它的资源加载程序。我喜欢它管理回退的方式。

    我的javascript应用程序一点也不复杂,只是一些jQuery UI小部件和其他小调整。

    我甚至不知道FOUC是什么,直到我开始学习requirejs。这是非常明显的,所以目前我正在避免它:

    var protect_from_FOUC = function(element) {
        if(typeof element === 'string') {
            element = document.querySelector(element);
        }
        element.classList.add('ui-helper-hidden');
    };
    
    <div id="main" class="main_block" role="main">
    <!-- a block affected by FOUC -->
    </div>
    <script>protect_from_FOUC('#main');</script>
    

    在我的脚本中:

    require(['jquery', 'jquery-ui' /*, ...*/], function($) {
    
    var recover_from_FOUC = function(element) {
        $(element).show({
            effect: 'blind',
            duration: 200
        }).removeClass('ui-helper-hidden');
    };
    
    $(document).ready(function() {
    
        // Themed buttons:
        $(':button, :submit, :reset, .button').button();
        // ... Some other similar changes
        recover_from_FOUC('#main');
    
    });  // document.ready
    
    });  // require
    

    这是我所拥有的最好的,我找到的所有关于这个主题的在线资源都推荐了一些类似的内容。

    我的 问题 考虑到我说的是只影响UI的脚本, 这些要求值得吗?正如我所说,我想继续使用它的资源后备系统,但整个“FOUC补丁”似乎适得其反。。。

    每个jQuery UI示例都在头部包含脚本,但互联网上的每个人都建议在关闭主体或使用异步加载程序之前包含脚本。 此建议是否仅适用于“非UI”脚本?

    在这种情况下,什么是最好的?

    请注意,尽管很接近,但这不仅仅是另一个“如何避免FOUC问题”。

    编辑: 添加我的页面和 require.config :

    <!-- This is in my head right below the meta tags and exactly in this order -->
    <link rel="shortcut icon" href="images/favicon.ico"/>
    <!-- Keep before the site css to allow overriding jquery's style -->
    <link rel="stylesheet" href="style/lib/jquery-ui/ui-lightness/jquery-ui.css"/>
    <link rel="stylesheet" href="style/lib/chosen/chosen.css"/>
    <link rel="stylesheet" href="style/lib/icheck/minimal/yellow.css">
    <link rel="stylesheet" href="style/reset.css">
    <link rel="stylesheet" href="style/style.css"/>
    
    <!-- Here I have the definition of `protect_from_FOUC` in an inline script -->
    
    <script data-main="js/main" src="js/lib/require.js"></script>
    

    在main.js中:

    require.config({
        paths: {
            // Common:
            'jquery': ['//code.jquery.com/jquery-2.0.3.min', 'lib/jquery'],
            'sugar': ['//cdnjs.cloudflare.com/ajax/libs/sugar/1.3.9/sugar.min', 'lib/sugar'],
    
            // UI:
            'jquery-ui': ['//code.jquery.com/ui/1.10.3/jquery-ui.min', 'lib/jquery-ui'],
            'autosize': ['//cdnjs.cloudflare.com/ajax/libs/autosize.js/1.17.1/autosize-min', 'lib/jquery.autosize'],
            'chosen': ['//cdnjs.cloudflare.com/ajax/libs/chosen/0.9.15/chosen.jquery.min', 'lib/chosen.jquery'],
            'icheck': ['lib/jquery.icheck'],
    
            // django i18n:
            'gettext': [translations_url + '?noext']
        },
        shim: {
            'jquery-ui': {
                deps: ['jquery']
            },
            'autosize': {
                deps: ['jquery']
            },
            'chosen': {
                deps: ['jquery']
            },
            'icheck': {
                deps: ['jquery']
            }
        }
    });
    
    require(['style', 'interaction']);
    
    2 回复  |  直到 12 年前
        1
  •  3
  •   Wyatt    12 年前

    之前剧本赞歌的原因- </body> 是因为它们阻止解析。

    这很糟糕,尤其是考虑到您的用例,在您的页面上可能有很多内容等待解析和呈现,而不是通过Javascript包含的内容。

    最后包含脚本可以让直接包含在HTML中的所有内容都能愉快地解析和呈现,而无需等待任何脚本(以及它们的整个请求周期->解析->!执行)。

    然而,这种策略存在一个问题。也就是说,在你的身体末端堆积脚本标签不允许良好的(任何?)依赖性管理。这是创建requirej的主要原因之一(还有其他目的,如代码封装、版本控制/回退、模板插件等)。

    您使用requirejs是为了一个有效的目的,否则管理起来会很痛苦,所以我肯定会说requirejs在这种情况下是“值得的”。

    至于你对“FOUC补丁”似乎适得其反的评论,我不确定你为什么会这么认为。考虑一下补丁为你提供了什么:既有流畅的加载UI,又有 未阻止的HTML 。向头部抛出阻塞脚本当然是一个有效的决定,但前提是页面上的大部分内容都取决于它们是否能尽快加载。这种情况很少发生(事实上,这是演示/开发使用之外的反模式)。

    考虑用户体验,特别是考虑一些老化智能手机的慢速连接/慢速JS解析/执行速度。异步加载不需要让这些用户在空白屏幕上停留3-5秒以上,而是允许您 感知负载时间 速度要快得多。当脚本最终可用时,UI铃声和口哨声可以与FOUC补丁一起显示。

    因此,您可以使用异步脚本提供看似快速的页面加载,并在加载时使用JS进行增强,同时使用requirejs进行依赖性管理/智能资源回退。听起来不错。

        2
  •  1
  •   Paul Grime    12 年前

    作为外部CSS阻塞渲染的后续示例。以下页面的渲染将被缓慢的外部样式表阻止(在我测试过的Chrome和FF中)。

    <!doctype html>
    
    <html>
    
    <head>
        <style>body { background: white; }</style>
        <link rel="stylesheet" type="text/css" href="http://deelay.me/0/http://rawgithub.com/gitgrimbo/6487200/raw/red.css">
        <link rel="stylesheet" type="text/css" href="http://deelay.me/5000/http://rawgithub.com/gitgrimbo/6487200/raw/blue.css">
    </head>
    
    <body>
        <h1>Top header</h1>
    
        <script>console.log(new Date()); document.write(new Date());</script>
    
        <h1>Bottom header</h1>
    </body>
    
    </html>
    

    但如果你移动两个 <link> 元素插入页面正文(作为的第一个元素 <body> ),然后从我在Chrome和FF中看到的。。。

    在Chrome中,行为与 <链接> 元素在文档的 <head> .

    在FF中,你有时会在蓝色之前看到红色背景5秒,有时你会在蓝色前面看到红色的闪光。我不知道为什么会这样。

    阻止脚本?

    Chrome和FF似乎也阻止了 <script> 由于CSS延迟而导致的块。也不确定为什么会这样。

    推荐文章