JavaScript捆绑是一种优化技术,可用于减少JavaScript文件的服务器请求数。它是通过将多个JavaScript文件合并到一个文件中来减少页面请求的数量来实现的。默认情况下,Magento 2允许通过在主题文件的exclude
节点中指定相应文件来排除特定JavaScript文件的捆绑etc/view.xml
。但是,有时候这还不够。
我们假设由于其实现的具体细节,我们需要禁用特定页面的JavaScript捆绑。或者,例如,这只是一个临时解决方案,以防您不想在整个网站上禁用JavaScript捆绑,同时在启用JavaScript捆绑后调查并尝试修复某些页面上出现的某些问题。为此目的,有一个简单快速的解决方案。但是,它需要一点点编码。
默认资产配置类Magento\Framework\View\Asset\Config
用于检索JS捆绑,JS和CSS合并,HTML缩小的配置。每页都会检查这些配置。默认情况下,从相应的系统配置值中检索配置。尽管如此,您可以根据需要提供自己的资产配置实现。资产配置必须在Magento\Framework\View\Asset\ConfigInterface
接口中实现。
但是,我们不会在我们的案例中深入挖掘。我们只想实现一个简单的解决方案来禁用某些页面的JS捆绑。让它成为愿望清单页面。因此,我们可以为该Magento\Framework\View\Asset\ConfigInterface::isBundlingJsFiles
方法使用“after”插件,只是为了查看资产配置的工作原理。首先,我们需要为以下内容定义插件类Magento\Framework\View\Asset\ConfigInterface
:
1 2 3 4 5 6 7 8 9 10 | <?xml version="1.0"?> <!-- File: app/code/Atwix/BundlingExclusionExtended/etc/frontend/di.xml --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <type name="Magento\Framework\View\Asset\ConfigInterface"> <plugin name="disable_bundling_for_page_sample" type="Atwix\BundlingExclusionExtended\Plugin\DisableBundlingForPageSamplePlugin" /> </type> </config> |
插件类的源代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | <?php /* File: app/code/Atwix/BundlingExclusionExtended/Plugin/DisableBundlingForPageSamplePlugin.php */ namespace Atwix\BundlingExclusionExtended\Plugin; use Magento\Framework\App\Request\Http as HttpRequest; use Magento\Framework\App\RequestInterface; use Magento\Framework\View\Asset\Config as AssetConfig; /** * Class AssetConfigPlugin */ class DisableBundlingForPageSamplePlugin { /** * Sample Action Name */ const ACTION_NAME = 'wishlist_index_index'; /** * Request * * @var RequestInterface|HttpRequest */ protected $request; /** * DisableCheckoutJsBundlingPlugin constructor * * @param RequestInterface $httpRequest */ public function __construct(RequestInterface $httpRequest) { $this->request = $httpRequest; } /** * Plugin for isBundlingJsFiles method * Disable JS bundling for particular page * * @param AssetConfig $subject * @param boolean $result * * @return boolean */ public function afterIsBundlingJsFiles(AssetConfig $subject, $result) { if ($this->request->getFullActionName() == self::ACTION_NAME) { return false; } return $result; } } |
在我们的插件方法中,我们将请求的完整控制器操作名称与我们需要排除JS绑定的页面的完整控制器操作名称进行比较。如果值匹配,那么我们通过返回负布尔值(false
)来强制禁用当前控制器操作的JS绑定。
通过这种方式,您还可以通过扩展以下方法来影响其他资产配置:
Magento\Framework\View\Asset\ConfigInterface::isMergeCssFiles
Magento\Framework\View\Asset\ConfigInterface::isMergeJsFiles
Magento\Framework\View\Asset\ConfigInterface::isMinifyHtml
注意,在管理JavaScript捆绑或类似配置时应该小心。不正确使用此类设置可能会导致额外的服务器负载。因此,如果您确切知道您想要做什么以及为什么要这样做,那么最好继续进行。
完整模块的源代码可以在Atwix_BundlingExclusionExtended GIT存储库中找到。
我希望这篇简短的教程对你有用。谢谢阅读!