在最后一天,我研究了一个神秘的问题,其中moment-timezone
特征在特定的,看似随意的情况下不起作用。 我发现我的moment-timezone
库的运行时版本在某些时候从版本0.5.17更改为0.5.13。
在添加更多详细信息之前,是node.js
问题还是moment-timezone
问题?
moment-timezone
的具体问题我最终使用yarn selective-version-resolutions解决了问题,但如果这实际上是node.js
问题,我认为需要采取更多极端措施( yarn install --flat?)。
我不知道哪个依赖项导致版本在运行时更改,但在添加yarn.lock
部分之前,这是我resolutions
文件中的相关部分:
moment-timezone@0.5.17:
version "0.5.17"
resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.17.tgz#3c8fef32051d84c3af174d91dc52977dcb0ad7e5"
dependencies:
moment ">= 2.9.0"
moment-timezone@^0.5.0, moment-timezone@^0.5.4, moment-timezone@~0.5.5:
version "0.5.13"
resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.13.tgz#99ce5c7d827262eb0f1f702044177f60745d7b90"
dependencies:
moment ">= 2.9.0"
正如您所看到的,我的直接依赖是版本 0.5.17 ,但我的其他模块的依赖关系已经解析为版本 0.5.13 。但我不明白在某些时候我的依赖关系是如何解决 0.5.13 。
要查看moment-timezone
版本,我只使用了moment.tz.version
。这意味着在我的生产代码中,以下代码打印 0.5.17 ,直到某些时候突然打印 0.5.13 :
const moment = require('moment-timezone');
console.log(`moment.tz.version: ${moment.tz.version}`);
最后一个细节:当版本更改为 0.5.13 时发生的时刻 - 时区功能是moment.tz
函数added in version 0.5.14上的可选标记,在此代码:
moment(utcDateTime, format).clone().tz(timezone, true)
任何人都可以解释这是怎么回事吗?我希望它是一个片刻时区的bug而不是node.js的bug ...
答案 0 :(得分:0)
我今天遇到了同样的问题,几个小时后,我想我已经知道发生了什么事。如果检查一下矩时区代码,您会看到它在初始化时需要矩,并添加tz
属性以及与时区有关的所有内容,最后返回修改后的矩实例:
需要的时间-> https://github.com/moment/moment-timezone/blob/0.5.27/moment-timezone.js#L12
修改时刻实例-> https://github.com/moment/moment-timezone/blob/0.5.27/moment-timezone.js#L532
使用所有新方法和属性返回实例-> https://github.com/moment/moment-timezone/blob/0.5.27/moment-timezone.js#L626
因此,如果您的直接依赖关系和另一个模块中的依赖关系解析为相同的moment
版本,则同一对象被修改两次,而最终的版本仅取决于您所需的顺序{{1 }}和具有moment-timezone
作为依赖项的模块。
实际上,在moment-timezone
代码中,您可以看到以下行已被注释掉:
moment-timezone
我不知道为什么开发人员将其注释掉,但是显然这是已知行为。