Использование moment.js с lang файлом и require.js

В настоящее время я пытаюсь использовать библиотеку 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 

Первое сообщение об ошибке - это языковой модуль, который загружается, хотя он должен быть загружен ПОСЛЕ моменту (если я делаю это правильно). Второй - это модуль момента, который пытается переключиться на языковой модуль, который не был загружен.

Неужели кто-то может прояснить этот вопрос. Спасибо заранее.

РЕДАКТИРОВАТЬ: я исправил проблему, используя версии с ограниченным языком (например, этот). По-видимому, миниатюрные версии используют формат AMD, что позволяет легче включать в проекты require.js).

Я все еще не совсем понимаю, почему невозможно включить языки, используя конфигурацию shim. Может быть, кто-то может попытаться объяснить это.

Ответ 1

Другое решение (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 поддерживает английский по умолчанию.


В класс просмотра ( или любой другой mvc class/plain script и т.д.), используйте его следующим образом:

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

  var MyView = Chaplin.View.extend({

    ...

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

    ...

  });

  return MyView;
});

Ответ 2

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/