Come aggiungere il file JS in frontend per tutte le pagine


38

Ho letto 3 pagine di risultati di Google su come caricare un file JS per tutte le pagine e non riesco ancora a farlo.

Ho qualche dubbio, spero che qualcuno possa cancellarli.

  1. Devo creare un modulo all'interno app/codecon il requirejs-config.js? O invece posso inserire un requirejs-config.jstema all'interno del mio tema?

  2. Cosa devo mettere dentro requirejs-config.js?

  3. Come dovrebbe apparire il codice all'interno del mio .jsfile? Ho visto che non puoi usare jQuery document.readye devi avere undefine([

  4. Cosa devo mettere dentro define([?

  5. Se ho moduli jQuery di terze parti, devo modificarli per farli funzionare?

  6. Devo mettere XML da qualche parte per dire a magento che esiste il file my.js?

  7. Se creo un modulo all'interno app/codecon tutto il codice js lì, includerebbe tutto il materiale in tutte le pagine? Come posso raggiungerlo?

Risposte:


65

Per caricare un main.jsfile personalizzato su tutte le pagine (nel modo RequireJS) questo è un buon modo:

1) Crea main.js

Crea main.jsall'interno della cartella del tema

<theme_dir>/web/js/main.js

con questo contenuto:

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

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

});

In breve : dichiariamo le dipendenze all'inizio, ad es "jquery". Definiamo come parametro della funzione il nome della variabile per l'utilizzo della dipendenza all'interno della funzione, ad es "jquery" --> $. Inseriamo tutto il nostro codice personalizzato all'interno function($) { ... }.

2) Dichiarare main.jscon un requirejs-config.jsfile

Crea un requirejs-config.jsfile nella cartella del tema:

<theme_dir>/requirejs-config.js

con questo contenuto:

var config = {

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

};

"js/main"è il percorso verso la nostra abitudine main.js. L'estensione ".js" non è richiesta.

La nostra requirejs-config.jssarà unita ad altre requirejs-config.jsdefinite in Magento.

RequireJS caricherà il nostro main.jsfile, su ogni pagina, risolvendo le dipendenze e caricando i file in modo asincrono.


Opzionale: Inclusa libreria di terze parti

Questo è il modo di includere librerie di terze parti.

1) Aggiungi la libreria in web/js:

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

2) Apri requirejs-config.jse aggiungi questo contenuto:

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

};

Sembra più complicato di quello che è in realtà.

3) Aggiungi la dipendenza all'interno di main.js:

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

  // ...

});

Ciao, puoi dire se devo includere bootstrap.js qui. Come posso aggiungerlo in modo che bootstrap funzioni bene nel mio tema. Grazie!
venerdì

1
@anujeet Puoi includerlo bootstrap.jsnello stesso modo in cui ho incluso slick.jsnell'esempio sopra. Per il valore dello spessore puoi provare a usare questo 'bootstrap': { deps: ["jquery"], exports: '$.fn.popover' }:, come spiegato qui: stackoverflow.com/a/13556882/3763649
Andrea

Vedi il mio richiedono-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!']); mio minicart smette di funzionare con questo
anujeet

@anujeet Meglio aprire un'altra domanda con questo problema, segnalando il tuo request-config.js e se hai qualche errore nella console javascript. Se colleghi la tua domanda qui sarò felice di aiutarti :)
Andrea,

quando includi più js ho errori "js / ScrollMagic.min", "js / debug.addIndicators.min"
yavonz15

7

Duplica il file:

app / code / Magento / a tema / vedere / frontend / layout / default_head_blocks.xml

A

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>

Per maggiori informazioni:

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

In bocca al lupo!

A proposito, leggi il frontend devdocs ufficiale di magento per ottenere le basi :)


Perché lo script di Bootstrap richiede che JQuery sia inizializzato, incluso nella testa non funzionerà. Leggi questo documento ufficiale. per maggiori informazioni. :)
VS

6

È possibile aggiungere file JS utilizzando XML come di seguito. Questo aggiungerà js in tutte le pagine.

Con modulo personalizzato:

Crea default.xmlfile nel tuo modulo.

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

Il metodo per aggiungere js usando il default_head_blocks.xmlfile non funzionerà con plugin JQuery di terze parti. Pertanto, se si desidera aggiungere plug-in JQuery personalizzati e utilizzarli, sarà necessario utilizzare il requirejs-config.jsfile.

Per rispondere alle tue domande una ad una:

1) & 2) Non è necessario creare un modulo per aggiungere il requirejs-config.jsfile. Puoi semplicemente aggiungerlo in questa posizione:

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

Fare riferimento a questa risposta per creare un requirejs-config.jsfile corretto .

3) Dovrai elencare le dipendenze del tuo file js prima di scrivere i tuoi script.

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

Il codice sopra dice che avrai bisogno di jquery e jquery ui per i tuoi script.

4) Non è necessario utilizzare il define([se non si crea un plug-in JavaScript.

5) No, non è necessario modificarli ma è necessario specificare la loro dipendenza utilizzando il requirejs-config.jsfile. Se avete owl.carousel.min.jsnel <vendor>/<theme>/web/js/owl.carousel.min.jsvostro requirejs-config.jsfile sarà simile a questa:

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

Nel codice sopra, ricorda che non esiste un .jsfile. E ora usarlo nel tuo js

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

Se tutto funziona bene, dovresti avere i tuoi collegamenti a piè di pagina in un dispositivo di scorrimento.

6) & 7) Usa semplicemente il metodo suggerito da @Goldy per aggiungere il tuo js. Aggiungerà il tuo file js a tutte le pagine.

Per ulteriori letture, puoi guardare questo post

Spero che sia di aiuto.


1

Ecco come aggiungo la libreria dotdotdot nel mio tema personalizzato magento2.

1. Scarica e aggiungi Js Library nel tuo tema seguendo il percorso:

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

2. Creare il file requestjs di un tema come segue e far conoscere ai necessjs la libreria appena aggiunta.

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

3. Usa la libreria aggiunta nel file js principale del tuo tema come segue:

// 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. e includi il file js del tuo tema nella testa del tuo sito come segue:

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

Puoi aggiungere qualsiasi libreria JS esterna e file personalizzato su ogni pagina in magento2.


Ho provato che questo è lato amministratore, js sta arrivando correttamente ma il risultato atteso non sta arrivando
Naveenbos,

Bella risposta. Lo proverò. C'è un modo per specificare una determinata pagina in cui è necessario il file js.?
Mohammed Joraid

Per una pagina specifica, sposta il contenuto "default_head_blocks.xml" nell'esempio sopra nel tuo file di layout specifico. Ad esempio, nel caso della pagina dei dettagli del prodotto, aggiungi quell'xml in app / design / frontend / Namespace / themename / Magento_Catalog / layout / catalog_product_view.xml
saiid
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.