Magento 2使用RequireJS库来使用JavaScript。该库使用异步依赖项加载模型-AMD。这使您可以优化加载包含JavaScript文件的页面所需的时间。另外,通过管理JavaScript资源依赖性,我们摆脱了已加载库的重复。

JavaScript资源的存储位置
JavaScript组件
Define vs require
在PHTML模板中插入JS组件
选择器上初始化组件
在带参数的选择器上初始化组件
在JavaScript中选择器上初始化组件

JavaScript资源的存储位置

  • lib/web/ -此文件夹包含Magento中使用的库。这些可以是第三方库,例如jquery,underscore.js,knockout.js,也可以是基于/mage/文件夹中的Magento库。
  • app/code/[Vendor]/[Module]/view/[areaName]/web/ —模块中使用的javascript文件的路径;
  • app/design/[areaName]/[VendorTheme]/[themeName]/web/ -主题中使用的javascript文件的路径;
  • app/design/[areaName]/[VendorTheme]/[themeName]/[Vendor]_[Module]/web/ -模块的继承javascript文件的路径。

JavaScript组件

JS组件是作为AMD模块的RequireJS模块。这种方法使我们可以将逻辑封装在模块中,而不会阻塞全局名称空间。模块也可以使用其他模块。

这是一个简单的RequireJS模块的示例:

requirejs([], function() {
   alert("Hello World!");
});


现在,在加载页面时,您将看到弹出“ Hello world”!

让我们连接jQuery和mage/cookies:

define([
  "jquery",
  "mage/cookies"
], function($){
  ...
});


如您所见,您需要以数组的形式指定必要的模块以连接这些模块。然后RequireJs将按照声明模块的顺序将模块传递给函数。

Define vs require

如果要创建模块,应用程序的其他部分将依赖该模块,则需要使用define()。如果我们的模块仅使用其他模块,则使用require()。

在PHTML模板中插入JS组件

根据任务,您可以使用两个选项之一来表示:

  • 使用data-mage-init属性
  • 使用<script type =“text/x-magento-init”/>标记

让我们弄清楚哪些选项可用以及何时可以使用它们。假设您只需要一个简单的JS文件连接,而无需指定参数或组件。

PHTML中JS的简单连接:


<script type="text/x-magento-init">
{
   "*": {
       "Vendor_Module/js/myfile": {}
   }
}
</script>


在这个案例中,文件的路径为:

Vendor/Module/view/frontend/web/js/myfile.js

其中您的代码:

require([],
function(){
   "use strict";
   //your js goes here
});

在选择器上初始化组件

有两种方法可以做到这一点:

1)在data-mage-init属性中初始化组件。例如:

<div id="element-id" data-mage-init='{"Vendor_Module/js/myfile":{}}'></div>


2)使用具有<script type =”text/x-magento-init”属性的标签。例如:

<script type="text/x-magento-init">
{
   "#element-id": { 
       "Vendor_Module/js/myfile": {} 
   } 
} 
</script>


在这个案例中,文件的路径为:

Vendor/Module/view/frontend/web/js/jsfilename.js

其中您的代码:

define(['uiComponent'],
function (Component) {
   'use strict';
   return Component.extend({
       initialize: function (config, node) {
           // some code
       }
   });
});

在带参数的选择器上初始化组件

初始化组件时,向其发送参数(由php动态确定)也很重要。

1)data-mage-init

<div id="element-id" data-mage-init='{"Vendor_Module/js/myfile":{"parameter":"value","status":<?php echo $block->getStatus(); ?>
}}'></div>


2)使用具有<script type =”text/x-magento-init”属性的标签。例如:

<script type="text/x-magento-init">
{
   "#element-id": { 
       "Vendor_Module/js/myfile1": {
           "parameter":"value",
           "status":<?php echo $block->getStatus(); ?>
       } 
   }
} 
</script>

在JavaScript中的选择器上初始化组件

如果我们没有使用php获取动态参数,则可以在javascript文件中的选择器上初始化组件。

例如:

vendor/magento/module-swatches/view/adminhtml/web/js/visual.js

…
$('[data-role=swatch-visual-options-container]').sortable({
  distance: 8,
  tolerance: 'pointer',
  cancel: 'input, button',
  axis: 'y',
  ....
  }
});
...