标签: deferred-loading

CSS交付优化:如何推迟css加载?

我正在尝试针对开发人员的Google文档优化CSS交付https://developers.google.com/speed/docs/insights/OptimizeCSSDelivery#example

正如您在内联一个小CSS文件的示例中所看到的那样,内联中的内核中的关键CSS和原始的small.css在页面加载后加载.

<html>
  <head>
    <style>
      .blue{color:blue;}
    </style>
    </head>
  <body>
    <div class="blue">
      Hello, world!
    </div>
  </body>
</html>
<noscript><link rel="stylesheet" href="small.css"></noscript>
Run Code Online (Sandbox Code Playgroud)

关于这个例子的问题:

如何在页面加载后加载大型css文件?

html javascript css deferred-loading google-pagespeed

59
推荐指数
7
解决办法
8万
查看次数

推迟加载和解析PrimeFaces JavaScript文件

在使用Google PageSpeed分析JSF 2.1 + PrimeFaces 4.0 webapp的性能时,它建议推迟解析JavaScript文件.在一个测试页面<p:layout>,并用表格<p:watermark><p:fileUpload>它看起来像如下...

<p:layout>
    <p:layoutUnit position="west" size="100">Test</p:layoutUnit>
    <p:layoutUnit position="center">
        <h:form enctype="multipart/form-data">
            <p:inputText id="input" />
            <p:watermark for="input" value="watermark" />
            <p:focus for="input" />
            <p:fileUpload/>
            <p:commandButton value="submit" />
        </h:form>
    </p:layoutUnit>
</p:layout>
Run Code Online (Sandbox Code Playgroud)

...它列出了可以推迟的以下JavaScript文件:

  • primefaces.js (219.5KiB)
  • jquery-plugins.js (191.8KiB)
  • jquery.js (95.3KiB)
  • layout.js (76.4KiB)
  • fileupload.js (23.8KiB)
  • watermark.js (4.7KiB)

它链接到此Google开发人员文章,其中解释了延迟加载以及如何实现它.你基本上需要<script>onload事件期间动态创建所需的window.在最简单的形式下,旧的和错误的浏览器被完全忽略,它看起来像这样:

<script>
    window.addEventListener("load", function() {
        var script = document.createElement("script");
        script.src = "filename.js";
        document.head.appendChild(script);
    }, false);
</script>
Run Code Online (Sandbox Code Playgroud)

好吧,如果您可以控制这些脚本,这是可行的,但所列出的脚本都被JSF强制自动包含.此外,PrimeFaces呈现一堆内嵌的脚本到HTML被直接调用输出$(xxx)从 …

javascript jsf deferred-loading primefaces jsf-2

41
推荐指数
1
解决办法
9154
查看次数

样式表上允许的DEFER或ASYNC包括?

我知道脚本文件可以在资源包含上使用DEFER和ASYNC关键字.这些关键字是否也适用于样式表(即CSS)包括?

语法可能是:

<link rel="stylesheet" type="text/css" href="./path/to/style.css" defer />
Run Code Online (Sandbox Code Playgroud)

我只是不知道是否允许.

html css asynchronous deferred-loading

29
推荐指数
4
解决办法
3万
查看次数

通过延迟图像加速页面加载

我正在创建一个包含大量大图像的页面,所以我自然希望确保页面加载没有太多麻烦.我在这里阅读这篇文章http://24ways.org/2010/speed-up-your-site-with-delayed-content

推迟的方法如下(从页面中提取,不介意URL)

<div>
    <h4>
        <a href="http://allinthehead.com/" data-gravatar-hash="13734b0cb20708f79e730809c29c3c48">
            Drew McLellan
        </a>
    </h4>
</div>
Run Code Online (Sandbox Code Playgroud)

然后一段js负责图像加载

$(window).load(function() {
    $('a[data-gravatar-hash]').prepend(function(index){
        var hash = $(this).attr('data-gravatar-hash')
        return '<img width="100" height="100" alt="" src="http://www.gravatar.com/avatar.php?size=100&amp;gravatar_id=' + hash + '">'
    });
});
Run Code Online (Sandbox Code Playgroud)

我不打算为每个图像执行此操作,但对于某些我不需要在页面加载时显示的图像.

这是最好的方式还是有更好的方法通过延迟图像来实现更快的页面加载?

谢谢

javascript jquery deferred-loading

27
推荐指数
2
解决办法
3万
查看次数

理解jQuery Deferred.pipe()

我正在尝试为以下场景实现jQuery Deferred.pipe()方法:

  1. 通过$ .ajax()在DB中添加用户
  2. 获取是否正确添加用户的响应.
  3. 如果成功添加,请通过$ .ajax()从服务器获取所有用户列表
  4. 通过jQuery模板显示列表

这是我尝试过的东西:

var addUserSuccess = function( data ) {
    if ( data.returnCode !== "success" ) {
        return $.Deferred().reject('Error saving user');
    }
    getUsers();
}

var addUser = function() {
    return $.ajax(url, {
        type: "POST",
        data: { username: 'test' },
        contentType: "application/json",
        dataType: "json"
    });
}

var displayUsers = function( data ) {
    $('#myTmpl').tmpl(data.d).appendTo('#myDiv');
}

var getUsers = function () {
    return $.ajax(url, {
        type: "GET",
        data: {},
        contentType: "application/json",
        dataType: "json"
    });
}

$.when(addUser()).pipe(addUserSuccess).then(displayUsers) …
Run Code Online (Sandbox Code Playgroud)

jquery deferred-loading deferred-execution

20
推荐指数
1
解决办法
9118
查看次数

有没有理由不使用<script defer> TODAY?

曾几何时,有很多激烈的争论<script><head><body>.

许多SO帖子已经指出了最佳实践/经验法则<script><body>不阻止html解析器之前放置前端,从而更快地获得第一次屏幕绘制和更快的客户端DOM访问,从而获得更好的用户体验.

这必须是重复的("□")╯

等等...... 现在<script>可以deferred,实际上已经有一段时间了!

老帖说

延迟脚本可能会导致JS依赖问题

不,它不会.它在解析DOM时立即保留执行顺序.

它不适用于跨供应商

是的,它曾经是,但今天它几乎得到了所有主要浏览器供应商的支持:http://caniuse.com/#search=defer,除了评论指出IE <10之外可能还有一些问题.

然而,它提供的好处似乎是显而易见的,至少在我看来,因为它在早期(在开始解析DOM之前)并行下载脚本,因此不需要稍后请求脚本并缩短整个脚本所需的时间.页面互动.

简而言之,这个问题类似于:任何不使用的好理由

<head>
...
<script src='cdn/to/jquery' defer>
<script src='cdn/to/bootstrap' defer>
<script src='script/depends/on/jqueryandbootstrap' defer>
</head>
Run Code Online (Sandbox Code Playgroud)

而是使用这个:

<body>
...
<script src='cdn/to/jquery'>
<script src='cdn/to/bootstrap'>
<script src='script/depends/on/jqueryandbootstrap'>
</body>
Run Code Online (Sandbox Code Playgroud)

注意:这可能是一个有很多讨论的"古老"话题.但是,随着Web技术的快速发展,浏览器供应商更好地与新的Web规范保持一致,许多旧的stackoverflow答案可能无法保持最新​​.

javascript html5 external-script deferred-loading

15
推荐指数
1
解决办法
1720
查看次数

Javascript非阻塞脚本,为什么不简单地将所有脚本放在</ body>标签之前?

为了避免javascript阻止网页呈现,我们不能只是简单地在结束</body>标记之前加载/执行所有的JS文件/代码吗?

只有在呈现所有页面之后才会下载和执行所有JS文件和代码,因此需要像本文中建议的那样加载JS文件的非阻塞技术.他基本上建议使用如下代码:

document.getElementsByTagName("head")[0].appendChild(script);

为了在渲染网页的同时推迟脚本,从而导致网页的快速渲染速度.

但是,如果不使用这种类型的非阻塞技术(或其他类似技术),我们不会通过简单地将所有JS文件(要加载/执行)放在结束</body>标记之前来实现相同的非阻塞结果吗?

我更惊讶,因为作者(在同一篇文章中)建议将他的代码放在结束</body>标记之前(参见文章的"脚本放置"部分),所以他基本上是在结束</body>标记之前加载脚本.他的代码需要什么呢?

我很困惑,任何帮助表示感谢,谢谢!


UPDATE

仅供参考,Google Analytics正在使用类似的非阻止技术来加载其跟踪代码:

<script type="text/javascript">
...
(function() 
{
   var ga = document.createElement('script');
   ga.type = 'text/javascript';
   ga.async = true;
   ga.src = 'your-script-name-here.js';
   var s = document.getElementsByTagName('script')[0];
   s.parentNode.insertBefore(ga, s); //why do they insert it before the 1st script instead of appending to body/head could be the hint for another question.
})();
</script>
</head>
Run Code Online (Sandbox Code Playgroud)

javascript nonblocking deferred-loading

13
推荐指数
1
解决办法
2197
查看次数

强制绑定到DataSource的复选框在尚未查看时进行更新

这是一个测试框架,用于显示我在做什么:

  1. 创建一个新项目
  2. 添加选项卡式控件
  3. 在标签1上放一个按钮
  4. 在选项卡2上放置一个复选框
  5. 将此代码粘贴到其代码中

(使用控件的默认名称)

public partial class Form1 : Form
{
    private List<bool> boolList = new List<bool>();
    BindingSource bs = new BindingSource();
    public Form1()
    {
        InitializeComponent();
        boolList.Add(false);
        bs.DataSource = boolList;
        checkBox1.DataBindings.Add("Checked", bs, "");
        this.button1.Click += new System.EventHandler(this.button1_Click);
        this.checkBox1.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged);

    }
    bool updating = false;
    private void button1_Click(object sender, EventArgs e)
    {
        updating = true;
        boolList[0] = true;
        bs.ResetBindings(false);
        Application.DoEvents();
        updating = false;
    }

    private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        if (!updating)
            MessageBox.Show("CheckChanged fired outside …
Run Code Online (Sandbox Code Playgroud)

c# controls deferred-loading winforms

12
推荐指数
1
解决办法
3044
查看次数

GWT:延迟加载外部JS资源

我有一个小部件取决于一些外部JS文件,我想懒惰加载所有这些外部资源.我已经使用代码拆分来延迟加载与小部件有关的GWT代码,但是script无论如何都加载了使用标签在gwt.xml中定义的JS文件,这是不可取的.

是否有按需加载这些外部资源的标准GWT方式?我可以使用原始JS自己做,但我宁愿不花时间在这上面.

gwt deferred-loading

11
推荐指数
1
解决办法
5756
查看次数

模块是否阻止了使用 DOMContentLoaded 侦听器的需要?

document.addEventListener('DOMContentLoaded', () => { 

});
Run Code Online (Sandbox Code Playgroud)

我读到这个事件侦听器确保对于常规脚本,JS 不会引用尚未加载的节点。内容DOMContentLoaded 被触发执行)。

我还读过一个模块 DOMContentLoaded被触发之前被执行(由于defer它内置的属性)。

我使用的模块似乎不需要DOMContentLoaded监听器。我可以确认DOMContentLoaded他们不需要监听器来正确访问节点吗?

另外,我想不出如何测试这个,所以我在这里问。如果你知道我怎么做,请分享!

javascript script-tag deferred-loading

10
推荐指数
1
解决办法
364
查看次数