istranger / yii2-resource-smart-load
防止重新加载客户端已存在的资源(在AJAX请求中)的扩展
Requires
- yiisoft/yii2: *
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 中可以部分禁用原生过滤器(如果需要)。