Используйте require-config.js для загрузки файлов, необходимых на всех страницах

9

Я знаю, как использовать require-config.jsв пользовательских темах, но я хотел бы использовать пользовательский файл JavaScript ( myfile.js) на всех страницах. В какой каталог мне добавить require-config.jsи как его использовать, чтобы он работал как надо?

Пожалуйста, не ссылайтесь на официальную страницу Magento.

Anitr
источник
Вы можете напрямую вызвать js внутри тега макета заголовка xml, и вы получите js на каждой странице.
Ракеш Джесадия,
Спасибо за ваш ответ. Но если я хотел бы использовать require-config и загружать файлы с ним, а не как в Magento 1?
Anitr
Его поддержка также доступна в magento 2, вы можете проверить файл layout-theme layout / default_head_block.xml
Rakesh Jesadiya
Да, я знаю. Но я хочу использовать require-config.js правильным способом.
Anitr

Ответы:

17

requirejs-config.jsиспользует для создания отображения ресурсов JavaScript . Мы можем найти все требуют конфиги в: pub/static/_requirejs.

Насколько я знаю, правильный способ загрузки нашего собственного скрипта через Require Js: использование шаблона для вызова нашего скрипта . Мы создадим новый шаблон с Magento\Framework\View\Element\Templateего классом блока.

Если мы хотим загрузить js-файлы на всех страницах и не хотим создавать новый модуль, наш блок должен ссылаться на модуль Magento Theme before.body.endилиafter.body.start container внутри него default.xml.

введите описание изображения здесь

приложение / дизайн / интерфейс / Vendor / Тема / Magento_Theme / макет / default.xml

<?xml version="1.0"?>

<page layout="3columns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">

    <referenceContainer name="after.body.start">
        <block class="Magento\Framework\View\Element\Template" name="custom.js" template="Magento_Theme::custom_js.phtml"/>
    </referenceContainer>

</page>

приложение / дизайн / интерфейс / Vendor / Тема / requirejs-config.js

var config = {
    map: {
        '*': {
            customScript:'Magento_Theme/js/customscript'
        }
    }
};

приложение / дизайн / интерфейс / Vendor / Тема / Magento_Theme / веб / JS / customscript.js

define('jquery', function($) {

    //Your code here
    //alert('Here');

    }(jQuery)
);

Наш шаблон будет вызывать наш скрипт: app / design / frontend / Vendor / Theme / Magento_Theme / templates / custom_js.phtml

<script>// <![CDATA[
    require([
        'jquery',
        'customScript'
    ], function ($, script) {
        //Your code here
        //alert('Here');
    });
    // ]]>
</script>

Очистите Magento Cache и запустите статическое развертывание контента: php bin/magento setup:static-content:deploy

Хоа ТруонгДинь
источник
Я \app\design\frontend\Enim\blank\Magento_CatalogWidget\templates\product\widget\content\grid.phtmlвключаю свой скрипт , но у меня есть requirejs-config.js и скрипт в папке Theme (app / design / frontend / Vendor / Theme / requirejs-config.js). Это нормально? Проблема в том, что я вызываю свой сценарий из разных мест.
Anitr
Ваш скрипт влияет только при templa‌​tes\product\widget\c‌​ontent\grid.phtmlвызове шаблона .
Khoa TruongDinh
Да, все в порядке - проблема с этим: magento.stackexchange.com/questions/149019/… , мне интересно, связана ли эта проблема с вызовом requirejs.
Anitr
@KhoaTruongDinh Я немного смущен этим. Я еще не проверил должным образом, но прав ли я, считая, что функция in custom_js.phtmlрассматривается как обычный обратный вызов, выполняемый после выполнения кода, содержащегося в customscript.js? Или мне нужно выполнить код, объявленный customscript.jsвнутри функции в custom_js.phtml?
Наводнение Джошуа
1
@KhoaTruongDinh Мне также интересно, почему в ответе Иветы говорится, что вы after.body.startдолжны измениться на before.body.end?
Наводнение Джошуа
5

Файл Requirejs-config: app / code / Vendor / Module / view / frontend / requirejs-config.js

var config = {
    paths: {            
         'myfile': "Vendor_Modulename/js/myfile"
      },   
    shim: {
    'myfile': {
        deps: ['jquery']
    }
  }
} 

Ваш файл js должен находиться в: app / code / Vendor / Module / view / frontend / web / js / myfile.js

Теперь вы можете использовать в любом месте вашего файла шаблона следующим способом:

<srcipt>
 require(["jquery","myfile"],function($,myfile){
     $(document).ready(function(){
        //call your js here...
     })
 })
</script>
Ракеш Джесадия
источник
Да, это правильно. Но я спросил, знает ли кто-нибудь, как использовать его в папке «Тема», независимо от модуля - он должен быть загружен по всей странице, а не только в одном модуле.
Anitr
Вы также можете использовать его в папке темы, просто позвоните по вышеуказанному сценарию, и вы можете использовать свой js
Rakesh Jesadiya
пожалуйста, дайте мне знать, если у вас есть какие-либо проблемы
Ракеш Джесадия
Это работает, спасибо. Но, тем не менее, у меня возникают проблемы с некоторыми другими вещами: magento.stackexchange.com/questions/149019/…
Anitr
Привет, пожалуйста, дайте мне знать, куда поместить файл первого шага?
Прия
2

Есть более легкая версия с использованием deps. Зависимости в requirejs-config.js загрузят ваш файл при самой загрузке requirejs (везде в магазине). Вот пример того, как должен выглядеть ваш requirejs-config.js :

var config = {
    // When load 'requirejs' always load the following files also
    deps: [
        'common-js'
    ],

    // Library file path.
    paths: {
        'common-js': 'js/Your-File-Name'
    },

    // The rest of your config file ...
Андрей
источник
1

В качестве альтернативного подхода к рекомендации Khoa, которая является отличной практикой для разработчиков Magento, вы можете вставить свой JavaScript в файл .phtml следующим образом:

<srcipt>
require(["jquery"],function($){
 $(document).ready(function(){
    your script here...
 })
});
</script>

Затем свяжите ваш phtml-файл с default.xml, как описано в ответе Khoa, хотя я бы порекомендовал добавить его в before.body.end. И затем вызовите свой JS-скрипт из copyright.phtml , например так:

<script>
jQuery(document).ready(function($) {
..call your script here ..
});
</script>

copyright.phtml загружается на каждую страницу, даже на такие страницы, как оформление заказа, где нижний колонтитул опущен.

Ивета Аллогенес
источник