10

我目前正在尝试将 moment.js 库与 require.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)
    }
});

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

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

    moment.lang('de');

    var configuration = {}
    // ...    
    return configuration;
});

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

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

后来:

Uncaught TypeError: Cannot call method 'preparse' of undefined 

第一条错误消息是正在加载的语言模块,尽管它应该在 moment 模块之后加载(如果我做得对的话)。第二个是从试图切换到尚未加载的语言模块的那一刻模块。

有人可以对这个问题有所了解。提前致谢。

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

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

4

2 回答 2

4

另一个解决方案(2015):

此示例旨在演示如何将moment.js翻译与navigator.language属性一起使用,通常是用户的首选语言。

配置中分别定义moment.js和语言文件,如下所示:

require.config({
  config: {
    'moment': {
      noGlobal: true
    }
  },
  paths: {
    ...
    'moment': '../vendor/moment/moment',
    'moment_de': '../vendor/moment/locale/de',
    'moment_pl': '../vendor/moment/locale/pl'
    ...
  },
  ...
});

创建一个小模块,例如lib/moment.js并指定您的语言配置(您可以在此处找到 RFC 4646 语言标签列表):

define(function(require) {
  'use strict';

  var moment = require('moment'), locale;

  switch(navigator.language) {
    case 'de':
    case 'de-at':
    case 'de-de':
    case 'de-li':
    case 'de-lu':
    case 'de-ch':
      locale = 'moment_de';
    break;

    case 'pl':
      locale = 'moment_pl';
    break;

    ...
  }

  if (locale) {
    require([locale]);
  }

  return moment;
});

请注意:moment.js默认支持英文。


在您的视图类(或任何其他类/纯脚本等)中,像这样使用它:

define([
  'chaplin'
  'lib/moment'
], function(Chaplin, moment) {
  'use strict';

  var MyView = Chaplin.View.extend({

    ...

    parse: function() {
      ...
      console.log(moment().format('LLL'));
      ...
    }

    ...

  });

  return MyView;
});
于 2014-12-29T16:11:48.503 回答
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());
});

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

于 2013-06-21T19:23:48.403 回答