将moment.js与lang文件和require.js一起使用

Joh*_*ieb 10 javascript requirejs momentjs

我目前正在尝试使用带有require.js的moment.js库,但我仍然无法理解这样一个项目的正确设置.这是我在main.js文件中的操作:

requirejs.config({
    baseUrl: 'app',

        paths: {
            // ... more parameters (all Backbone related)
            'moment': 'lib/moment',
            'moment_de': 'lib/lang/de',
        },

    shim: {
        'moment' : {
            deps: [],
        },

        'moment_de': {
            deps: ['moment'],
        },

        // ... more parameters (all Backbone related)
    }
});
Run Code Online (Sandbox Code Playgroud)

我正在使用单独的模块进行配置.该模块如下所示:

define(['moment', 'moment_de'], function(moment, de) {

    moment.lang('de');

    var configuration = {}
    // ...    
    return configuration;
});
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我正在尝试更改此文件中的moment对象的全局语言,但我遇到以下错误消息:

Uncaught Error: Module name "../moment" has not been loaded yet for context: _. Use require([])
Run Code Online (Sandbox Code Playgroud)

后来:

Uncaught TypeError: Cannot call method 'preparse' of undefined 
Run Code Online (Sandbox Code Playgroud)

第一个错误消息是正在加载的语言模块,尽管它应该在当前模块之后加载(如果我正确的话).第二个是从尝试切换到尚未加载的语言模块的时刻模块.

有人可以就这个问题发表一些看法.提前致谢.

编辑:我使用缩小语言版本修复了问题(例如这个).显然,缩小版本使用AMD格式,这样可以更容易地包含在require.js项目中.

我仍然不太明白为什么不可能使用shim配置包含语言.也许有人可以试着解释一下.

Bri*_*wis 3

require({
    paths: {
        'moment': '//cdnjs.cloudflare.com/ajax/libs/moment.js/2.0.0/moment.min',
        'moment_de': '//cdnjs.cloudflare.com/ajax/libs/moment.js/2.0.0/lang/de.min'
    }
}, ['moment', 'moment_de'], function(moment){
    moment.lang('de');
    alert(moment(1316116057189).fromNow());
});
Run Code Online (Sandbox Code Playgroud)

您不需要对模块进行填充,因为 moment.js 支持 AMD。 http://jsfiddle.net/modern Degree/xYXUC/

  • 请注意,在此示例中,如果 moment_de 依赖于 moment,那么您可能会遇到问题。诸如此类的数组中的模块是异步加载的。因此, moment_de 可能会在 moment 之前加载,并且您会遇到有关 moment 未定义的周期性错误。我不确定,但我认为这就是垫片的用途(或者这是问题示例中使用垫片的想法,但它不起作用)。 (2认同)