2014-12-15 4 views
4

Я недавно скачал последнюю версию moment.js и начинает показывать следующее сообщение при попытке вызвать, например, moment().add(1, 'day');Moment.js - «Доступ к Moment через глобальную область видимости» предупреждающее сообщение

"Deprecation warning: Accessing Moment through the global scope is deprecated, and will be removed in an upcoming release." 

Каков наилучший способ вызова моментов?

Update: Разобрался проблему

проблема присутствовала, потому что я requirejs в моем проекте и momentjs пытался предупредить меня, что я должен использовать momentjs в качестве модуля зависимости вместо этого.

Следующий код был извлечен из momentjs v2.9.0

// CommonJS module is defined 
if (hasModule) { 
    module.exports = moment; 
} else if (typeof define === 'function' && define.amd) { 
    define('moment', function (require, exports, module) { 
     if (module.config && module.config() && module.config().noGlobal === true) { 
      // release the global variable 
      globalScope.moment = oldGlobalMoment; 
     } 

     return moment; 
    }); 
    makeGlobal(true); 
} else { 
    makeGlobal(); 
} 

//And this is the 'makeGlobal' function. globalScope 
function makeGlobal(shouldDeprecate) { 
    /*global ender:false */ 
    if (typeof ender !== 'undefined') { 
     return; 
    } 
    oldGlobalMoment = globalScope.moment; 
    if (shouldDeprecate) { 
     globalScope.moment = deprecate(
       'Accessing Moment through the global scope is ' + 
       'deprecated, and will be removed in an upcoming ' + 
       'release.', 
       moment); 
    } else { 
     globalScope.moment = moment; 
    } 
} 

Так что, если я использую эту библиотеку в среде CommonJS, то следует использовать оператор импорта.

Если я использую requirejs, тогда я должен включать momentjs в качестве зависимости от моих модулей.

Наконец, если ни в других случаях выполнения, то я могу использовать его непосредственно из глобальной области видимости (объект окна в браузере)

+0

И это в сценарии клиентов? – adeneo

+1

Если вы не используете requireJs, последнее, что я видел, было то, что это была проблема, re: https://github.com/moment/moment/issues/1214. Возможно, это было разрешено мастером, но я не знаю. –

+0

Кажется, что вы используете момент для nodeJS ... вы можете дважды проверить и получить версию моментальной сборки для браузера. –

ответ

9

Вы можете использовать requirejs, чтобы вытащить его, а не использовать глобальную область видимости:

require.config({ 
    paths: { 
     "moment": "path/to/moment", 
    } 
}); 

define(["moment"], function (moment) { 
    moment().format(); 
}); 

Взятые из http://momentjs.com/docs/

+1

Все еще не понимаю. Есть ли пример экстернарта или даже лучшее объяснение проблемы? Это «момент импорта» или «момент импорта из« момента »- это проблема? –

4

это действительно не ответ, но понимание проблемы:

  1. До сих пор не было убедительного объяснения причин возникновения устаревания или объяснения новичков о том, что это такое. В частности, не абзац, говорящий «если вы делаете это по-старому, он ломается тонким образом». Ближайшим является отчет об ошибке, который, используя узел, определяет один символ в глобальном пространстве имен (https://github.com/moment/moment/issues/1214), что в основном является философией.

  2. Отказ от использования, поэтому его непонятно для людей, почему. Похоже, что он исправляется при установке.

  3. Никто из узлов чата не объяснил это, за исключением зеркалирования шаблона require.js. Комментарий, похоже, продолжает «делать это так и работает». Шаблон не распространяется на всех пользователей.

  4. Некоторые неудачные строки включают простые конструкторы, такие как moment(value), что является целым рядом с библиотекой.

  5. Похоже, что обновление второстепенной версии с момента 2.9.0 до 2.10.0 может привести к поломке устаревшего кода, по крайней мере, для тех, кто использует ECMAScript и резерв. Возвращение к 2.9.0 позволит вам продолжать работать. Если у вас есть связанный с этим поломка момента. Duration.fn, вы можете обновить его до 2.10.1 или выше.

+1

Привет @Charles Merriam, я выяснил, что проблема возникает, если в проекте есть библиотека AMD, например requirejs. В этом случае momentjs будет «определять» momentjs как модуль, поэтому он будет предупреждать вас, когда вы пытаетесь использовать его непосредственно из глобальной области. – edrian

+0

Значит, вы говорите, что предупреждение об устаревании просто укушено? –

+0

Я обновил свой вопрос, чтобы объяснить проблему. С уважением – edrian