Cách thêm tệp JS ở lối vào cho tất cả các trang


38

Tôi đã đọc 3 trang Kết quả của Google về cách tải tệp JS cho tất cả các trang và vẫn không thể thực hiện được.

Tôi đã có một vài nghi ngờ, hy vọng ai đó có thể xóa chúng đi.

  1. Tôi có cần tạo một mô-đun bên trong app/codevới requirejs-config.js? Hoặc tôi có thể đặt một requirejs-config.jsbên trong chủ đề của tôi thay thế?

  2. Tôi nên đặt requirejs-config.jsgì bên trong ?

  3. Mã trông như thế nào trong .jstập tin của tôi ? Tôi thấy rằng bạn không thể sử dụng jQuery document.readyvà bạn phải có mộtdefine([

  4. Tôi nên đặt define([gì bên trong ?

  5. Nếu tôi có các mô-đun jQuery của bên thứ ba, tôi có phải chỉnh sửa chúng để làm cho chúng hoạt động không?

  6. Tôi có cần đặt xml ở đâu đó để nói với magento rằng tệp my.js tồn tại không?

  7. Nếu tôi tạo một mô-đun bên trong app/codevới tất cả mã js ở đó, nó có bao gồm tất cả nội dung trong tất cả các trang không? Làm thế nào tôi có thể đạt được điều đó?

Câu trả lời:


65

Để tải một main.jstệp tùy chỉnh trên tất cả các trang (theo cách RequireJS), đây là một cách hay:

1) Tạo main.js

Tạo main.jstrong thư mục chủ đề

<theme_dir>/web/js/main.js

với nội dung này:

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

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

});

Tóm lại : chúng tôi tuyên bố phụ thuộc khi bắt đầu, ví dụ "jquery". Chúng tôi định nghĩa là tham số của hàm, tên biến để sử dụng phụ thuộc trong hàm, vd "jquery" --> $. Chúng tôi đặt tất cả các mã tùy chỉnh của chúng tôi trong function($) { ... }.

2) Khai báo main.jsvới một requirejs-config.jstập tin

Tạo một requirejs-config.jstệp trong thư mục chủ đề:

<theme_dir>/requirejs-config.js

với nội dung này:

var config = {

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

};

"js/main"là đường dẫn đến tùy chỉnh của chúng tôi main.js. Phần mở rộng ".js" là không bắt buộc.

Chúng tôi requirejs-config.jssẽ được hợp nhất với requirejs-config.jsđịnh nghĩa khác trong Magento.

RequireJS sẽ tải main.jstệp của chúng tôi , trên mỗi trang, giải quyết các phụ thuộc và tải tệp theo cách không đồng bộ.


Tùy chọn: Bao gồm thư viện của bên thứ ba

Đây là cách để bao gồm các thư viện của bên thứ ba.

1) Thêm thư viện vào web/js:

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

2) Mở requirejs-config.jsvà thêm nội dung này:

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

};

Nó trông phức tạp hơn những gì nó thực sự là.

3) Thêm phụ thuộc trong main.js:

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

  // ...

});

Xin chào, Bạn có thể cho biết nếu tôi phải đưa bootstrap.js vào đây không. Làm thế nào tôi có thể thêm nó để bootstrap hoạt động tốt trong chủ đề của tôi. Cảm ơn!
anujeet

1
@anujeet Bạn có thể đưa bootstrap.jsvào cùng một cách tôi đưa slick.jsvào ví dụ trên. Đối với giá trị shim, bạn có thể thử sử dụng giá trị này : 'bootstrap': { deps: ["jquery"], exports: '$.fn.popover' }, như được giải thích tại đây: stackoverflow.com/a/13556882/3763649
Andrea

Xem Yêu cầu-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!']); Minicart của tôi ngừng hoạt động với điều này
anujeet

@anujeet Tốt hơn bạn nên mở một câu hỏi khác với vấn đề này, báo cáo các yêu cầu-config.js của bạn và nếu bạn có một số lỗi trong bảng điều khiển javascript. Nếu bạn liên kết câu hỏi của mình ở đây, tôi sẽ rất vui lòng giúp bạn :)
Andrea

khi bao gồm nhiều js hơn, tôi có lỗi "js / ScrollMagic.min", "js / debug.addIndicators.min"
yavonz15

6

Bạn có thể thêm các tệp JS bằng xml như bên dưới. Điều này sẽ thêm js trong tất cả các trang.

Với mô-đun tùy chỉnh:

Tạo default.xmltập tin trong mô-đun của bạn.

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

Sao y tệp:

ứng dụng / mã / Magento / Chủ đề / view / frontend / layout / default_head_blocks.xml

Đến

ứng dụng / mã / 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>

Để biết thêm thông tin:

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

Chúc may mắn!

BTW đọc chính thức devdocs frontend từ magento để có được cơ bản :)


Bởi vì tập lệnh của Bootstrap yêu cầu khởi tạo JQuery, bao gồm cả tập lệnh trong phần đầu sẽ không hoạt động. Đọc tài liệu chính thức này . để biết thêm. :)
VS

2

Phương pháp thêm js bằng default_head_blocks.xmltệp sẽ không hoạt động đối với các plugin JQuery của bên thứ 3. Vì vậy, nếu bạn muốn thêm các trình cắm JQuery tùy chỉnh và sử dụng chúng, bạn sẽ cần sử dụng requirejs-config.jstệp.

Để trả lời từng câu hỏi của bạn:

1) & 2) Bạn không cần tạo mô-đun để thêm requirejs-config.jstệp. Bạn chỉ có thể thêm nó ở vị trí này:

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

Tham khảo câu trả lời này để tạo một requirejs-config.jstập tin thích hợp .

3) Bạn sẽ cần liệt kê các phụ thuộc của tệp js trước khi bạn viết tập lệnh.

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

Đoạn mã trên nói rằng bạn sẽ cần jquery và jquery ui cho các tập lệnh của bạn.

4) Bạn không cần sử dụng define([trừ khi bạn đang tạo plugin javascript.

5) Không, bạn không cần chỉnh sửa chúng nhưng bạn sẽ cần chỉ định sự phụ thuộc của chúng bằng requirejs-config.jstệp. Nếu bạn có owl.carousel.min.jstrong <vendor>/<theme>/web/js/owl.carousel.min.js, bạn requirejs-config.jstập tin sẽ trông như thế này:

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

Trong đoạn mã trên, xin nhớ rằng không có .jstệp nào. Và bây giờ để sử dụng nó trong js của bạn

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

Nếu mọi thứ hoạt động tốt, bạn nên có các liên kết chân trang của mình trong một thanh trượt.

6) & 7) Chỉ cần sử dụng phương pháp được đề xuất bởi @Goldy để thêm js của bạn. Nó sẽ thêm tập tin js của bạn vào tất cả các trang.

Để đọc thêm, bạn có thể xem bài viết này

Hi vọng điêu nay co ich.


1

Đây là cách tôi thêm thư viện dotdotdot trong chủ đề tùy chỉnh magento2 của mình.

1. Tải xuống và thêm Thư viện Js trong chủ đề của bạn theo đường dẫn:

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

2. Tạo tệp requestjs của một chủ đề như sau và cho những người yêu cầu biết thư viện mới được thêm vào.

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

3. Sử dụng thư viện đã thêm trong tệp js chính của chủ đề của bạn như sau:

// 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. và bao gồm tệp js của chủ đề trong đầu trang web của bạn như sau:

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

Bạn có thể thêm bất kỳ thư viện JS bên ngoài và tệp tùy chỉnh trên mỗi trang trong magento2.


Tôi đã thử đây là phía quản trị viên, js đang đến một cách chính xác nhưng kết quả dự kiến ​​sẽ không đến
Naveenbos

Câu trả lời tốt đẹp. Hãy thử nó. Có cách nào để chỉ định một trang nhất định trong đó tệp js là cần thiết.?
Mohammed Joraid

Đối với một trang cụ thể, hãy di chuyển nội dung "default_head_blocks.xml" trong ví dụ trên vào tệp bố cục cụ thể của bạn. Ví dụ: trong trường hợp trang chi tiết sản phẩm, hãy thêm xml đó vào app / design / frontend / Namespace / themename / Magento_Catalog / layout / catalog_product_view.xml
saiid
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.