Как добавить файл JS в веб-интерфейс для всех страниц


38

Я прочитал 3 страницы результатов Google о том, как загрузить файл JS для всех страниц, и все еще не могу это сделать.

У меня есть несколько сомнений, надеюсь, кто-нибудь сможет их убрать.

  1. Нужно ли создавать модуль внутри app/codeвместе с requirejs-config.js? Или я могу requirejs-config.jsвместо этого поместить в мою тему?

  2. Что я должен положить внутрь requirejs-config.js?

  3. Как должен выглядеть код внутри моего .jsфайла? Я видел, что вы не можете использовать JQuery, document.readyи вы должны иметьdefine([

  4. Что я должен положить внутрь define([?

  5. Если у меня есть сторонние модули jQuery, нужно ли их редактировать, чтобы они работали?

  6. Нужно ли где-нибудь поместить xml, чтобы сообщить magento, что файл my.js существует?

  7. Если я создам модуль внутри app/codeсо всем кодом js, включит ли он весь материал на всех страницах? Как я могу этого достичь?

Ответы:


65

Чтобы загрузить пользовательский main.jsфайл на всех страницах (в RequireJS-способе), это хороший способ:

1) Создать main.js

Создать main.jsв папке темы

<theme_dir>/web/js/main.js

с этим содержанием:

define([
  "jquery"
], 
function($) {
  "use strict";

  // Here your custom code...
  console.log('Hola');

});

Вкратце : мы объявляем зависимости в начале, например "jquery". В качестве параметра функции мы определяем имя переменной для использования зависимости внутри функции, например "jquery" --> $. Мы поместили весь наш пользовательский код в function($) { ... }.

2) Объявить main.jsс requirejs-config.jsфайлом

Создайте requirejs-config.jsфайл в папке темы:

<theme_dir>/requirejs-config.js

с этим содержанием:

var config = {

  // When load 'requirejs' always load the following files also
  deps: [
    "js/main"
  ]

};

"js/main"это путь к нашему обычаю main.js. Расширение ".js" не требуется.

Наши requirejs-config.jsбудут объединены с другими requirejs-config.jsопределенными в Magento.

RequireJS будет загружать наш main.jsфайл на каждой странице, разрешая зависимости и загружая файлы асинхронным способом.


Необязательно: Включая стороннюю библиотеку

Это способ включения сторонних библиотек.

1) Добавить библиотеку в web/js:

<theme_dir>/web/js/vendor/jquery/slick.min.js

2) Откройте requirejs-config.jsи добавьте этот контент:

var config = {

  deps: [
    "js/main"
  ],

  // Paths defines associations from library name (used to include the library,
  // for example when using "define") and the library file path.
  paths: {
    'slick': 'js/vendor/jquery/slick.min',
  },

  // Shim: when you're loading your dependencies, requirejs loads them all
  // concurrently. You need to set up a shim to tell requirejs that the library
  // (e.g. a jQuery plugin) depends on another already being loaded (e.g. depends
  // on jQuery).
  // Exports: if the library is not AMD aware, you need to tell requirejs what 
  // to look for so it knows the script has loaded correctly. You can do this with an 
  // "exports" entry in your shim. The value must be a variable defined within
  // the library.
  shim: {
    'slick': {
      deps: ['jquery'],
      exports: 'jQuery.fn.slick',
    }
  }

};

Это выглядит сложнее, чем на самом деле.

3) Добавьте зависимость внутри main.js:

define([
  'jquery',
  'slick'
], 
function($) {

  // ...

});

Привет, Можете ли вы сказать, если я должен включить bootstrap.js здесь. Как я могу добавить это, чтобы загрузчик хорошо работал в моей теме. Благодарность!
— anujeet

1
@anujeet Вы можете включить так bootstrap.jsже, как я включил slick.jsв приведенный выше пример. Для значения shim вы можете попытаться использовать это:, 'bootstrap': { deps: ["jquery"], exports: '$.fn.popover' }как объяснено здесь: stackoverflow.com/a/13556882/3763649
— Andrea

Смотрите мой require-config.js var config = { deps: [ "js/animate", "js/incase", "js/confetti" ], paths: { "jquery.bootstrap":"js/bootstrap.min" }, shim:{ 'jquery.bootstrap':{ 'deps':['jquery'] } } }; require(["jquery",'jquery.bootstrap', 'jquery/ui', 'jquery/validate', 'mage/validation/validation', 'domReady!']); Моя миникарта перестает работать с этим
— anujeet

@anujeet Лучше открыть другой вопрос с этой проблемой, сообщив о вашем require-config.js и если у вас есть какие-либо ошибки в консоли javascript. Если вы
— Andrea

при включении большего количества js у меня появляются ошибки "js / ScrollMagic.min", "js / debug.addIndicators.min"
— yavonz15

7

Дублируйте файл:

Приложение / код / ​​Magento / Тема / просмотр / интерфейс / расположение / default_head_blocks.xml

к

app / code / your_vendor / your_theme /Magento_Theme/layout/default_head_blocks.xml

<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <head>
        <!-- Add local resources -->
        <css src="css/my-styles.css"/>

        <!-- The following two ways to add local JavaScript files are equal -->
        <script src="Magento_Catalog::js/sample1.js"/>
        <link src="js/sample.js"/>

        <!-- Add external resources -->
        <css src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap-theme.min.css" src_type="url" />
        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js" src_type="url" />
        <link src="http://fonts.googleapis.com/css?family=Montserrat" src_type="url" /> 
    </head>
</page>

За дополнительной информацией:

http://devdocs.magento.com/guides/v2.0/frontend-dev-guide/layouts/xml-manage.html

Удачи!

КСТАТИ, прочитайте официальный интерфейс DevDocs от magento, чтобы получить основные :)


Поскольку скрипт Bootstrap требует инициализации JQuery, его включение в заголовок не будет работать. Прочтите этот официальный документ. для получения дополнительной информации. :)
— VS

6

Вы можете добавить файлы JS, используя xml, как показано ниже. Это добавит JS на всех страницах.

С пользовательским модулем:

Создайте default.xmlфайл в вашем модуле.

app/code/vendor_name/module_name/view/frontend/layout/default.xml

<?xml version="1.0"?>
<page xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <head>
        <!-- Add js using link tag-->
        <link src="js/script.js"/>

        <!-- Add js-->
        <script src="Vendor_Module::js/script.js"/>

        <!-- Add external js -->
        <script src="https://apis.google.com/js/platform.js" src_type="url" />
   </head>
</page>

2

Метод добавления js с использованием default_head_blocks.xmlфайла не будет работать для сторонних плагинов JQuery. Итак, если вы хотите добавить собственные плагины JQuery и использовать их, вам нужно будет использовать requirejs-config.jsфайл.

Чтобы ответить на ваши вопросы по одному:

1) и 2) Вам не нужно создавать модуль для добавления requirejs-config.jsфайла. Вы можете просто добавить его в это место:

app/design/frontend/<Vendor>/<theme>/requirejs-config.js

Обратитесь к этому ответу для создания правильного requirejs-config.jsфайла.

3) Вам нужно будет перечислить зависимости вашего js-файла, прежде чем писать свои сценарии.

require([
  'jquery',
  'jquery/ui'
], function($){
   // ... Your code here
}); 

Приведенный выше код говорит, что вам понадобятся jquery и jquery ui для ваших скриптов.

4) Вам не нужно использовать, define([если вы не создаете плагин JavaScript.

5) Нет, вам не нужно редактировать их, но вам нужно будет указать их зависимость с помощью requirejs-config.jsфайла. Если у вас есть owl.carousel.min.jsв <vendor>/<theme>/web/js/owl.carousel.min.js, ваш requirejs-config.jsфайл будет выглядеть следующим образом :

var config = {
    map: {
        '*': {
            owlCarouselTheme: 'js/owl.carousel.min'
        }
    },
    shim: {
        owlCarouselTheme: ['jquery']
    }
};

В приведенном выше коде, пожалуйста, помните, что .jsдля файла нет. И теперь, чтобы использовать его в вашем JS

require(['jquery', 'owlCarouselTheme'],function($){
    $(document).ready(function() {
        $(".footer.links").addClass("owl-carousel").owlCarousel({items: 1});
    });
})

Если все работает хорошо, у вас должны быть ссылки на нижний колонтитул в слайдере.

6) и 7) Просто используйте метод, предложенный @Goldy, чтобы добавить свой js. Он добавит ваш файл JS на все страницы.

Для дальнейшего чтения вы можете посмотреть этот пост

Надеюсь это поможет.


1

Вот как я добавляю библиотеку dotdotdot в мою пользовательскую тему magento2.

1. Загрузите и добавьте Js Library в свою тему, следуя по пути:

// app/design/frontend/Namespace/themename/web/js/jquery.dotdotdot.min.js

2. Создайте файл requirejs темы следующим образом и дайте знать requirejs недавно добавленную библиотеку.

// app/design/frontend/Namespace/themename/requirejs-config.js
var config = {
   map: {
       '*': {
           dotdotdot: 'js/jquery.dotdotdot.min',
       }
   }
};

3. Используйте добавленную библиотеку в основном js-файле вашей темы следующим образом:

// app/design/frontend/Namespace/themename/web/js/main.js
require([ 'jquery' , 'dotdotdot' , 'domReady!'],function($){
    $(window).load(function() {
        //custom js code
        /* $(".product-item-name").each(function(){
            $(this).dotdotdot(); 
        }); */
    });
});

4. и включите файл js вашей темы в заголовок вашего сайта следующим образом:

// app/design/frontend/Namespace/themename/Magento_Theme/layout/default_head_blocks.xml
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <head>
        <link src="js/main.js"/> 
    </head>
</page>

Вы можете добавить любую внешнюю библиотеку JS и пользовательский файл на каждую страницу в magento2.


Я пробовал это на стороне администратора, JS идет правильно, но ожидаемый результат не приходит
— Naveenbos

Хороший ответ. Собираюсь попробовать. Есть ли способ указать определенную страницу, где нужен файл js.?
— Мохаммед Джорайд

Для конкретной страницы перенесите содержимое «default_head_blocks.xml» в приведенном выше примере в ваш конкретный файл макета. Например, в случае страницы с информацией о продукте, добавьте этот XML в app / design / frontend / namespace / themename / Magento_Catalog / layout / catalog_product_view.xml
— это было
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.