Jak dodać plik JS w interfejsie dla wszystkich stron


38

Przeczytałem 3 strony wyników Google o tym, jak załadować plik JS dla wszystkich stron i nadal nie jestem w stanie tego zrobić.

Mam kilka wątpliwości, mam nadzieję, że ktoś je rozwiąże.

  1. Czy muszę utworzyć moduł wewnątrz app/codeza pomocą requirejs-config.js? Czy mogę requirejs-config.jszamiast tego wstawić do środka motyw?

  2. Co powinienem włożyć do środka requirejs-config.js?

  3. Jak powinien wyglądać kod w moim .jspliku? Widziałem, że nie możesz używać jQuery document.readyi musisz miećdefine([

  4. Co powinienem włożyć do środka define([?

  5. Jeśli mam moduły jQuery innych firm, czy muszę je edytować, aby działały?

  6. Czy muszę gdzieś umieścić xml, aby poinformować magento, że plik my.js istnieje?

  7. Jeśli utworzę moduł app/codez całym kodem js, czy zawiera on wszystkie elementy na wszystkich stronach? Jak mogę to osiągnąć?

Odpowiedzi:


65

Aby załadować main.jsplik niestandardowy na wszystkie strony (w sposób RequireJS), jest to dobry sposób:

1) Utwórz main.js

Utwórz main.jsw folderze motywu

<theme_dir>/web/js/main.js

z tą zawartością:

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

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

});

W skrócie : deklarujemy zależności na początku, np "jquery". Jako parametr funkcji definiujemy nazwę zmiennej do wykorzystania zależności w funkcji, np "jquery" --> $. Umieszczamy w nim cały nasz niestandardowy kod function($) { ... }.

2) Zadeklaruj main.jsza pomocą requirejs-config.jspliku

Utwórz requirejs-config.jsplik w folderze motywu:

<theme_dir>/requirejs-config.js

z tą zawartością:

var config = {

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

};

"js/main"jest ścieżką do naszego zwyczaju main.js. Rozszerzenie „.js” nie jest wymagane.

Nasze requirejs-config.jszostaną połączone z innymi requirejs-config.jszdefiniowanymi w Magento.

RequireJS załaduje nasz main.jsplik na każdej stronie, rozwiązując zależności i ładując pliki w sposób asynchroniczny.


Opcjonalnie: w tym biblioteka innej firmy

W ten sposób można włączyć biblioteki stron trzecich.

1) Dodaj bibliotekę w web/js:

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

2) Otwórz requirejs-config.jsi dodaj tę treść:

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',
    }
  }

};

Wygląda na bardziej skomplikowane niż w rzeczywistości.

3) Dodaj zależność w ramach main.js:

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

  // ...

});

Cześć. Czy możesz powiedzieć, czy muszę tutaj dołączyć plik bootstrap.js. Jak mogę go dodać, aby bootstrap działał dobrze w moim motywie. Dzięki!
— anujeet

1
@anujeet Możesz uwzględnić bootstrap.jsw taki sam sposób, jak slick.jsw powyższym przykładzie. Dla wartości shim można spróbować użyć tego: 'bootstrap': { deps: ["jquery"], exports: '$.fn.popover' }jak wyjaśniono tutaj: stackoverflow.com/a/13556882/3763649
— Andrea

Zobacz mój wymagany-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!']); Mój minicart przestaje z tym
— pracować

@anujeet Lepiej otwórz kolejne pytanie z tym problemem, zgłaszając swój plik config-config.js i jeśli masz jakieś błędy w konsoli javascript. Jeśli podasz tutaj swoje pytanie, chętnie Ci pomogę :)
— Andrea

kiedy dołączam więcej js mam błędy „js / ScrollMagic.min”, „js / debug.addIndicators.min”
— yavonz15

6

Możesz dodać pliki JS za pomocą xml jak poniżej. Spowoduje to dodanie js na wszystkich stronach.

Z niestandardowym modułem:

Utwórz default.xmlplik w swoim module.

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>

6

Duplikuj plik:

app / code / Magento / Theme / view / frontend / layout / default_head_blocks.xml

Do

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>

Po więcej informacji:

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

Powodzenia!

BTW przeczytał frontend devdocs oficjalny z magento, aby uzyskać podstawowe :)


Ponieważ skrypt Bootstrap wymaga zainicjowania JQuery, włączenie go w głowie nie będzie działać. Przeczytaj ten oficjalny dokument. po więcej informacji. :)
— VS

2

Metoda dodawania js przy użyciu default_head_blocks.xmlpliku nie będzie działać w przypadku wtyczek JQuery innych firm. Jeśli więc chcesz dodać niestandardowe wtyczki JQuery i korzystać z nich, musisz użyć requirejs-config.jspliku.

Aby odpowiadać na pytania jeden po drugim:

1) i 2) Nie musisz tworzyć modułu, aby dodać requirejs-config.jsplik. Możesz po prostu dodać go w tej lokalizacji:

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

Zapoznaj się z tą odpowiedzią, aby utworzyć odpowiedni requirejs-config.jsplik.

3) Przed napisaniem skryptów musisz podać zależności pliku js.

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

Powyższy kod mówi, że będziesz potrzebować jquery i jquery ui dla swoich skryptów.

4) Nie musisz używać, define([chyba że tworzysz wtyczkę javascript.

5) Nie, nie musisz ich edytować, ale musisz określić ich zależność za pomocą requirejs-config.jspliku. Jeśli masz owl.carousel.min.jsw <vendor>/<theme>/web/js/owl.carousel.min.jsTwój requirejs-config.jsplik będzie wyglądał następująco:

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

W powyższym kodzie pamiętaj, że nie ma .jspliku. A teraz, aby użyć go w swoim js

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

Jeśli wszystko działa dobrze, linki stopki powinny znajdować się w suwaku.

6) i 7) Wystarczy użyć metody sugerowanej przez @Goldy, aby dodać swoją wersję js. Spowoduje to dodanie pliku js do wszystkich stron.

Do dalszego czytania możesz zajrzeć na ten post

Mam nadzieję że to pomoże.


1

W ten sposób dodaję bibliotekę dotdotdot do niestandardowego motywu magento2.

1. Pobierz i dodaj bibliotekę Js do swojego motywu, postępując zgodnie ze ścieżką:

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

2. Utwórz plik wymagań dla motywu w następujący sposób i powiadom go o nowo dodanej bibliotece.

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

3. Użyj dodanej biblioteki w głównym pliku js kompozycji w następujący sposób:

// 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. i dołącz plik js motywu do głowy witryny w następujący sposób:

// 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>

Możesz dodać dowolną zewnętrzną bibliotekę JS i niestandardowy plik na każdej stronie w magento2.


Próbowałem to jest po stronie administratora, js nadchodzi poprawnie, ale oczekiwany wynik nie nadchodzi
— Naveenbos

Niezła odpowiedź. Spróbuję Czy istnieje sposób określenia określonej strony, na której potrzebny jest plik js.?
— Mohammed Joraid

W przypadku określonej strony przenieś zawartość „default_head_blocks.xml” w powyższym przykładzie do określonego pliku układu. Na przykład w przypadku strony ze szczegółami produktu dodaj ten plik xml w aplikacji / design / frontend / Namespace / themename / Magento_Catalog / layout / catalog_product_view.xml
— saiid
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.