Magento 2:moment未定义。

3

我正在尝试在我的Magento 2网站上使用Shipping Time JS插件,它需要moment.js和jQuery才能工作,但是它没有工作。我在shiptime.js的第49行(如下所示)中得到一个ReferenceError:moment未定义

try {
        if (moment === undefined || $ === undefined ) throw Error("please include jquery & moment.js");
    } catch (e) {
        console.log(e);
    }

我的 require.js

这是我的 requirejs-config.js 的内容,它位于 app/design/frontend/##/##/requirejs-config.js:

var config = { // eslint-disable-line no-unused-vars
packages: [{
    name: 'momentjs',
    location: 'js/',
    main: 'moment'
}],
map: {
    '*': {
        'menu': 'Magento_Theme/js/disable-menu',
        'shippingtime': 'js/shiptime'
    }
},
shim: {
   'momentjs': {
       deps: ['jquery']
   },
  'shippingtime': {
      deps: ['jquery',',momentjs']
  }
}

};

jQuery在其他地方已经加载,并且肯定被加载了(我有各种其他工作正常的jQuery库)。

==============

调试

我最初认为moment.js/shiptime.js文件没有被加载,但是当我检查源代码和网络面板时,它们确实被加载了。为了进一步测试这一点,我做了以下操作来查看moment.js是否会输出任何内容:

require(['momentjs'], function (moment) {

        console.log(moment().format('LLLL'));
    });

这里将日期输出到控制台,因此 moment.js 明显已经加载。下面是 shiptime.js 文件的代码,但它无法运行并出现了上述错误:

require(['jquery', 'shippingtime', 'momentjs'], function (moment) {
        jQuery(document).ready(function () {
            jQuery(function($) {
                jQuery('.shipping-time').shipTime();
            });
        });
    });

非常感谢您的任何建议!


你的 require.jsline 18 上似乎有一个额外的 ,deps:['jquery',',momentjs'] - dusthaines
@dusthaines 很好的发现!我已经去掉了多余的逗号,但不幸的是它仍然给我报错。 - Jas Singh
1个回答

2
自从我使用requirejs以来已经有一段时间了,但由于没有更聪明的人参与讨论,所以很高兴能帮助您继续进行故障排除。在像Magento这样的大型复杂平台中使用requirejsjQuery可能会很棘手。 在看不到您所有代码的情况下,我建议您考虑并调查以下内容:
  1. 如果需要,是否正确地初始化了jQuery的no-conflict模式?
  2. 您是否在适当的位置和方式上使用require() vs. define()
  3. 您是否熟悉在使用requirejsMagento面临的独特挑战?
  4. 您是否已经审查并遵循了关于使用requirejsmoment的复杂性的建议?
以下是一些相关阅读材料:
  1. 关于No-Conflict
  2. require() vs define()以及其他有用的见解
  3. 关于Magento 2和RequireJS
  4. 有关Moment和RequireJS的复杂性
    1. https://momentjs.com/docs/#/use-it/require-js/
    2. https://github.com/requirejs/requirejs/issues/1554#issuecomment-226269905
最后一件要尝试的事情: 在您的最终代码示例中,您将moment传递给函数,但没有传递jQuery。您是否尝试过类似以下的方法:
require(['jquery', 'momentjs', 'shippingtime'], function($, moment) {
  $(document).ready(function() {
    $('.shipping-time').shipTime();
  });
});

1
感谢提供的链接,我花了几个小时重新编写了所有内容,但我认为可能漏掉了某些东西,因为现在它按预期工作。再次感谢您的回复! :) - Jas Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接