Tùy chọn shim Requirejs không hoạt động


11

Tôi đang phát triển một mô-đun cho Magento2 và tôi đang sử dụng các yêu cầu để tải javascript tùy chỉnh phụ thuộc vào jquery. Tôi đang sử dụng tùy chọn shim trong requestjs-config.js để đặt sự phụ thuộc này giữa các tập lệnh tùy chỉnh và jquery. Vấn đề là sự phụ thuộc này không (luôn luôn) được đặt ra. Đôi khi jQuery tải trước tập lệnh và tất cả đều ổn nhưng đôi khi nó tải sau tập lệnh dẫn đến lỗi tập lệnh:

Uncaught ReferenceError: jQuery is not defined(anonymous function) @ jquery.easing.1.3.js:39
Uncaught ReferenceError: jQuery is not defined(anonymous function) @ jquery.flexslider-min.js:5
Uncaught TypeError: $(...).flexslider is not a function

Xem bên dưới một ví dụ về requestjs-config.js của tôi:

var config = {
    map: {
        '*': {
            'flexslider': 'Vendor_Modulejs/jquery.flexslider-min',
            'picturefill': 'Vendor_Modulejs/picturefill.min',
            'easing': 'Vendor_Modulejs/jquery.easing.1.3',
            'hoverintent': 'Vendor_Modulejs/jquery.hoverIntent',
            'fitvids': 'Vendor_Modulejs/jquery.fitvids',
            'vimeo': 'Vendor_Modulejs/jquery.vimeo.api.min'
        }
    },
    shim: {
        'flexslider': ['jquery'],
        'picturefill': ['jquery'],
        'easing': ['jquery'],
        'hoverintent': ['jquery'],
        'fitvids': ['jquery'],
        'vimeo': ['jquery']
    }
};

Đây là javascript trong tệp phtml của tôi:

require(['jquery', 'domReady!', 'picturefill', 'flexslider', 'easing', 'hoverintent', 'fitvids', 'vimeo'], function($) {
    "use strict";

    // javascript here

});

Tôi đang làm gì sai ở đây, tại sao tùy chọn shim không được tôn vinh và jQuery không phải lúc nào cũng được tải trước các tập lệnh khác.

Câu trả lời:


20

Bạn phải đặt certjs-config.js như bên dưới,

Thêm chi tiết, Liên kết tham khảo, Cách giải quyết lỗi RequireJs trong Magento 2

 var config = {
        paths: {
                'flexslider': 'Vendor_Modulejs/jquery.flexslider-min',
                'picturefill': 'Vendor_Modulejs/picturefill.min',
                'easing': 'Vendor_Modulejs/jquery.easing.1.3',
                'hoverintent': 'Vendor_Modulejs/jquery.hoverIntent',
                'fitvids': 'Vendor_Modulejs/jquery.fitvids',
                'vimeo': 'Vendor_Modulejs/jquery.vimeo.api.min'
        },
        shim: {
                'flexslider': {
                    deps: ['jquery']
                },
                'picturefill': {
                    deps: ['jquery']
                },
                'easing': {
                    deps: ['jquery']
                },
                'hoverintent': {
                    deps: ['jquery']
                },
                'fitvids': {
                    deps: ['jquery']
                },
                'vimeo': {
                    deps: ['jquery']
                }
        }
    };

Sử dụng mã trên và loại bỏ thư mục var và thử. Cảm ơn.


Điều này dường như thực hiện các mẹo thực sự và tôi đã đánh dấu đây là câu trả lời. Tôi muốn hiểu tại sao điều này làm việc mặc dù. Đây có phải là đường dẫn thay vì cấu hình bản đồ hay là cài đặt phụ thuộc cụ thể trong cấu hình shim. Tài liệu về các yêu cầu đề cập bạn có thể sử dụng một loạt các phụ thuộc trong cấu hình shim thay vì chỉ định riêng từng phụ thuộc. Vì vậy, dự đoán của tôi là đó là sự khác biệt so với bản đồ, nhưng tại sao?
Solide 17/2/2016

2
bạn có thể kiểm tra tài liệu tham khảo từ bài đăng này, stackoverflow.com/questions/19216580/requirejs-paths-vs-map
Rakesh Jesadiya 17/2/2016

1
Không bao giờ xóa / var vì nó chứa thông tin hữu ích
Tối đa

Xin chào Rakesh, bạn có thể giải thích cách mã trên hoạt động không
Jaisa

@Jaisa, tôi đã giải thích nhiều hơn trong blog của mình trong liên kết được đưa ra ở trên
Rakesh Jesadiya
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.