istranger/yii2-resource-smart-load

防止重新加载客户端已存在的资源(在AJAX请求中)的扩展

安装: 731

依赖: 0

建议者: 0

安全性: 0

星级: 2

关注者: 4

分支: 2

开放问题: 0

类型:yii2-extension

v1.1.2 2015-05-26 16:31 UTC

This package is auto-updated.

Last update: 2024-09-12 05:19:29 UTC


README

此扩展用于防止Yii 2重新加载客户端上已存在的资源(在AJAX请求中)。与yii 1.1.x的类似扩展yii-resource-smart-load相比,此扩展功能更丰富,请查看详细信息

要求

  • PHP 5.4.0+。
  • YiiFramework 2.0.2+

功能

  • 防止重新加载JS文件
  • 防止重新加载JS内联块
  • 防止重新加载CSS文件
  • 防止重新加载CSS内联块
  • 灵活配置禁用资源
  • 可以禁用原生JS/CSS文件过滤

限制

  • 由于扩展使用cookie和http头部,因此会增加从客户端到服务器的入流量。这对于包含大量资源文件的网站尤为重要。这可以通过更改哈希方法(查看扩展选项)进行调整。此外,还应记住,cookie的大小有限(在浏览器中)。
  • 如果用户已启用http头部的过滤(例如,在企业代理中),且浏览器不接受cookie,则扩展将不起作用。然而,我们认为此类事件的可能性很低。

安装

  • 通过composer安装:将以下行添加到您的composer.json文件中("require"部分)"istranger/yii2-resource-smart-load": "*"(请参阅Packagist页面
  • 在配置文件中添加(默认为/config/web.php)
'components' => [
    // ...
    'view' => [
        'class'           => 'istranger\rSmartLoad\View',
        'smartLoadConfig' => [
            // Hashing method for resource names (if string value),
            // see possible values: https://php.ac.cn/manual/en/function.hash.php#104987
            // Can be assigned "callable", for example: function ($str) { return hash('sha256', $str); }
            // 'hashMethod'               => 'md5', // default = 'crc32b'

            // Types of resources, that will be tracked by current extension
            // If =null, include all resource types: ['jsFile', 'cssFile', 'jsInline', 'cssInline']
            // 'resourceTypes'            => ['jsFile', 'jsInline'],  // default = ['jsFile']

            // Enable log on server and client side (debug mode)
            // 'enableLog'                => true, // default = false

            // Activate "smart" disabling of resources on all pages
            // 'activateOnAllPages'       => true, // default = true

            // List of resources, that always should be loaded on client
            // (by name, hash, or full URL)
            // 'alwaysReloadableResources' => ['bootstrap.js'],  // default = []

            // Disable native script filter 
            // (only for resource types specified in 'resourceTypes')
            // 'disableNativeScriptFilter' => false, // default = true
        ]
    ],
    // ...
],

使用方法

典型用例

默认情况下,此扩展仅禁用js文件的重新加载,css文件和js/css内联块不受跟踪(请参阅选项resourceTypes)。但您(小心!)可以禁用其他资源类型。

也就是说,页面上的每个“跟踪”资源将只加载一次,即使它以后从该页面上移除。因此,所有在首次加载时绑定的JS回调都应使用jQuery方法.on()绑定到全局容器(例如,document)。

在随后的AJAX请求中,已加载的CSS内联块(或CSS文件)可能被新内容替换,因此,如果您在配置CSS样式时遇到问题,请配置排除项(见下文)。

高级用例

为了分析已禁用/已加载的脚本,方便使用选项enableLog,它将在浏览器控制台输出有用的调试信息。

    'enableLog' => true, // default = false

您可以使用方法(请参阅示例)更灵活地管理某些页面上的资源加载。

  • Yii::$app->view->getRSmartLoad()->disableLoadedResources(array $types = null); 禁止加载已在客户端加载的资源。调用此方法将禁用加载“客户端”资源,即使它们在调用此方法之后注册。
  • Yii::$app->view->getRSmartLoad()->disableResources(array $resourceList, array $types = null); 禁止加载指定的资源。调用此方法将禁用指定的资源,即使它们在调用此方法之后注册。资源列表可以包含
    • 对于JS/CSS文件:完整URL、基本名或哈希值
    • 对于JS/CSS内联块:块的内容或哈希值
    • array('*') - 禁用所有资源

这些方法可以在任何操作中调用。参数$types是一个数组,包含应从页面中排除的跟踪资源类型。默认情况下(=null),跟踪所有类型。
可以使用常量定义数组

    array(
        RSmartLoad::RESOURCE_TYPE_JS_FILE,      // = 'jsFile'
        RSmartLoad::RESOURCE_TYPE_JS_INLINE,    // = 'jsInline'
        RSmartLoad::RESOURCE_TYPE_CSS_FILE,     // = 'cssFile'
        RSmartLoad::RESOURCE_TYPE_CSS_INLINE,   // = 'cssInline'
    )

此限制比 $resourceList 具有更高的优先级。

此外,您可以将 activateOnAllPages = false 设置,并且扩展将在所有页面上禁用。您需要手动配置某些页面(借助这些方法)禁用资源的设置。

或者,您可以配置资源排除列表

    'alwaysReloadableResources' => ['bootstrap.js']  // default = []

这些资源将始终在客户端加载。每个资源都可以表示为

  • 资源文件:作为 hash,或 full URL,或 basename
  • 资源内联块:作为 hash,或 资源内容

可以通过扩展的全局对象中的浏览器控制台获取特定资源的哈希(enableLog == true)。例如

yii.resourceSmartLoad.resources = {
    "89cb8371": {
        "resource": "/test_yii2/basic/web/assets/a5ccee6b/jquery.js",
        "hash": "89cb8371",
        "source": "2015-02-14 12:27:08,
            GET,
            url = http://test.dev/test_yii2/basic/web/index.php?r=site%2Fabout,
            referrer = http://test.dev/test_yii2/basic/web/index.php"
    },
    "4cc53fc1": {
        "resource": "/test_yii2/basic/web/assets/94203850/css/bootstrap.css",
        "hash": "4cc53fc1",
        "source": "2015-02-14 12:27:08,
            GET,
            url = http://test.dev/test_yii2/basic/web/index.php?r=site%2Fabout,
            referrer = http://test.dev/test_yii2/basic/web/index.php"
    },
    "b66631ac": {
        "resource": "jQuery('#w1').yiiGridView({\"filterUrl\":\"/test_yii2/basic/web/index.php?r=user%2Findex\",\"filterSelect...",
        "hash": "b66631ac",
        "source": "2015-02-14 12:27:12,
            GET/AJAX,
            url = http://test.dev/test_yii2/basic/web/index.php?r=user%2Findex,
            referrer = http://test.dev/test_yii2/basic/web/index.php?r=site%2Fabout"
    },
    "125a821d": {
        "resource": "<style>body {font-size: 110%;}</style>",
        "hash": "125a821d",
        "source": "2015-02-14 12:27:11,
            GET/AJAX,
            url = http://test.dev/test_yii2/basic/web/index.php?r=site%2Fcontact,
            referrer = http://test.dev/test_yii2/basic/web/index.php?r=site%2Fabout"
    }
}

示例

控制器动作中的使用示例(假设 activateOnAllPages = false)。

禁用所有 CSS 内联块的加载

Yii::$app->view->getRSmartLoad()->disableResources(['*'], [RSmartLoad::RESOURCE_TYPE_CSS_INLINE]);

注意:指定的资源将从页面上的所有请求中排除(不仅仅是 AJAX)。

禁用特定资源文件的加载(对于所有 AJAX 请求)

if(Yii::$app->request->isAjax){
    Yii::$app->view->getRSmartLoad()->disableResources(['yii.gridView.js', 'bootstrap.css']);
}

注意:在正常请求(非 AJAX)中,这些文件将被包含在页面中。

根据类型限制禁用特定资源文件

Yii::$app->view->getRSmartLoad()->disableResources(['yii.gridView.js', 'bootstrap.css'],[
    RSmartLoad::RESOURCE_TYPE_CSS_INLINE,
    RSmartLoad::RESOURCE_TYPE_JS_FILE
]);

注意:只有 'yii.gridView.js' 会被禁用,因为类型限制比 $resourceList 具有更高的优先级。

禁用已经存在于客户端的 JS 内联块和 JS 文件

$view->getRSmartLoad()->disableLoadedResources(['*'], [
    RSmartLoad::RESOURCE_TYPE_JS_INLINE, 
    RSmartLoad::RESOURCE_TYPE_JS_FILE
]);

注意:只有在 AJAX 请求中才能禁用资源。

禁用所有已经存在于客户端的资源

$view->getRSmartLoad()->disableLoadedResources(['*']);

测试

测试将在之后进行。

类似扩展。原生资源过滤脚本

为了防止 Yii 1.1.x 的脚本重新加载,您可以使用 nlsclientscript

Yii 2 核心中使用了类似的方法。

然而,有一些差异

  • 扩展使用了不同的算法:在 AJAX 请求中,在收到内容后 在客户端 删除重复的资源文件(而不是像我们的实现那样在服务器上)。我们认为我们的方法是概念上更正确的。

  • 我们的实现(故意)不删除直接包含在 html 代码中(未通过 View 注册)的资源。在这种情况下,我们认为这些资源非常必要。

  • 原生过滤器不会删除重复的 CSS 文件。但是这没有问题,因为大多数浏览器不会重新加载文件。

  • 原生过滤器不能阻止 JS/CSS 内联块的重新加载。

我们的扩展不会干扰原生过滤器。它们可以一起使用或单独使用。在我们的扩展选项 disableNativeScriptFilter 中可以部分禁用原生过滤器(如果需要)。