Moment: 瞬間をほずんど䞍倉にする

䜜成日 2014幎07月03日  Â·  163コメント  Â·  ゜ヌス: moment/moment

これに぀いおは倚くの議論がありたした。 提案は次のずおりです。

次の可倉メ゜ッドは3.0.0で䞍倉になりたす utc 、 local 、 zone 、 add 、 subtract 、 startOf 、 endOf 、 lang 、これもduration  add 、 subtract 、およびlang 。

たず、すべおのメ゜ッドがmethodNameMuteバリアントで耇補されたす。 methodNameImmuteずいう名前の䞍倉のバリアントも必芁です。 3.0以降、埓来のメ゜ッドはデフォルトで䞍倉オプションの䜿甚を開始したす。

議論の䜙地があるのは

  • langを䞍倉にする必芁がありたす
  • すべおのゲッタヌ/セッタヌ get / set も䞍倉にする必芁がありたす
  • メ゜ッドの可倉バヌゞョンず䞍倉バヌゞョンの呜名
  • そしおもちろん-切り替えを行うべきか、それずも䞍倉のAPIで停止するべきか

良い郚分は、今日メ゜ッドの䞍倉バヌゞョンを䜜成し、埌で䜕をするかを決定できるこずです。 切り替えるず、 3.xが出おから、かなり長い間2.xブランチが存圚するこずにもなりたす。

@icambron @timrwood @gregwebs @yang @lfnavess @soswow @langalex

Enhancement

最も参考になるコメント

私の2セントは、完党な䞍倉性を採甚するか、たったく採甚しないかのどちらかであるずいうこずです。 䞍倉のメ゜ッド startOf 、 add ずそうでないメ゜ッド year 、 get があるず混乱するだけで、開発者は远跡する必芁がありたす。どれがどれか。

党おのコメント163件

私の2セントは、完党な䞍倉性を採甚するか、たったく採甚しないかのどちらかであるずいうこずです。 䞍倉のメ゜ッド startOf 、 add ずそうでないメ゜ッド year 、 get があるず混乱するだけで、開発者は远跡する必芁がありたす。どれがどれか。

たた、デフォルトで䞍倉のすべおを優先したす。 ゲッタヌはすでに䞍倉ではありたせんか

䞍倉性ぞの切り替えで私が目にする倧きな問題は次のずおりです。

疑䌌䞍倉性

javascriptの性質䞊、真の䞍倉性を持぀こずはできたせん。

私たちができる最善のこずは、コピヌを䜜成しおから、そのコピヌを倉曎しお返すこずです。 すべおのパブリックメ゜ッドを慎重にラップしお、単に倉曎するのではなく、垞にコピヌしお倉曎するようにするこずができたすが、それでも誰かがm._d = new Date()たたはm._d.setHours(1)を実行するのを劚げるこずはありたせん。

@icambronに同意したす。䞍倉性に移行するず、完党な倉曎になるはずです。 ある瞬間にプロパティを倉曎する可胜性のあるメ゜ッドは、代わりにその瞬間のコピヌを䜜成し、代わりにそのコピヌに倉曎を加えたす。

API衚面積

疑䌌䞍倉性ぞの切り替えに関する䞍幞な点は、可倉性を匕き続きサポヌトする堎合は、倚くの新しいAPIを䜜成する必芁があるこずです。

以前は、モヌメントの倉曎からクロヌン䜜成ずモヌメントの倉曎ぞの切り替えは、適切な堎所に.clone()を远加するのず同じくらい簡単

これには、最倧20のセッタヌメ゜ッド、add / extract、local / utc / zone / tz、startOf / endOf、lang、およびサヌドパヌティのプラグむンで䜿甚されるその他のメ゜ッドが含たれたす。

蚘憶の懞念

珟圚、倀を倉曎するたびにコピヌを䜜成しおいるため、メモリ䜿甚量が増加したす。 もちろん、新しい瞬間はガベヌゞコレクションされたすが、この倉曎に関連する远加コストは芚えおおく必芁がありたす。

他のセッタヌを䜿甚する方法で倧量の䜿い捚おクロヌンを䜜成しないように现心の泚意を払う必芁がありたす。

呌び出されおいるメ゜ッドを远跡するために、この小さな関数ラッパヌを䜿甚したした。

for (var method in moment.fn) {
  moment.fn[method] = (function (fn, method) {
    return function () {
      console.log(method);
      return fn.apply(this, arguments)
    }
  })(moment.fn[method], method)
}

これで、メ゜ッドを実行するず、プロトタむプの他のメ゜ッドがどのように䜿甚されるかを確認できたす。 これらのメ゜ッドのすべおがその瞬間にクロヌンを䜜成する必芁があるわけではないので、クロヌンを䜜成する必芁があるメ゜ッドに぀いおコメントを远加したした。

moment().isSame(moment(), 'year')
isSame
clone        // clone
startOf      // clone
month        // clone
date         // clone
year         // clone
date         // clone
hours        // clone
minutes      // clone
seconds      // clone
milliseconds // clone
valueOf
local        // clone
zone         // clone
startOf      // clone
month        // clone
date         // clone
year         // clone
date         // clone
hours        // clone
minutes      // clone
seconds      // clone
milliseconds // clone
valueOf

これは、䜜成されおすぐに砎棄される21個のコピヌです。 明らかに、倉曎可胜で䞍倉バヌゞョンのみを公開するいく぀かの内郚メ゜ッドを䜿甚しおこれを最適化できたすが、クロヌン䜜成が必芁な瞬間ず䞍芁な瞬間の蚘録を保持しようずするず、内郚の耇雑さが倧幅に増したす。

パフォヌマンスの懞念

モヌメントのクロヌン䜜成は、モヌメントの倉曎よりもはるかに遅くなりたす。 私はこれのためにいく぀かのjsperfテストを䞀緒に投げたした。

http://jsperf.com/moment-cloning

http://jsperf.com/moment-cloning-2

2番目のテストは、疑䌌䞍倉性に切り替えたずきのパフォヌマンスの䜎䞋をより適切に衚珟しおいるず思いたす。 これらの結果に䞊蚘の21のクロヌン䜜成むンスタンスを掛けるず、実行時間ははるかに遅くなりたす。

クロヌン䜜成のパスを最適化できるず確信しおいたすが、同等のパフォヌマンスを埗るには、パスを50倍高速化する必芁がありたす。 これは䞍可胜だず確信しおいたす。

抂芁

䞍倉性に切り替えるず、内郚APIず倖郚APIの耇雑さが倧幅に増し、パフォヌマンスずメモリに倧きな懞念が生じたす。 これらのコストは、䞍倉性がもたらすメリットに芋合う䟡倀はないず思いたす。

ここにリストされおいるパフォヌマンスの懞念は、ポむントを欠いおいるず思いたす。

䞀般的に、ミュヌテヌションを実行する前に正確性を確保するには、最初の.cloneが必芁です。

珟圚のAPIではcloneが必芁ないように芋せかけるこずはできたせん。 ここで異なる䞻なケヌスは、耇数のシヌケンシャルミュヌテヌションを実行するこずです。 このケヌスは、すべおのミュヌテヌションが単䞀のクロヌンでミュヌテヌションずしお実行されるようにビルダヌAPIを䜜成するこずで察凊されたす。

他の䞀般的なナヌスケヌスがありたせんか

私の最初の問題は、具䜓的にはstartOfずendOfメ゜ッドに関するものでした。 どういうわけか、私にずっおこれらの名前は、「この瞬間を月の開始に蚭定する」ではなく、「月の開始を取埗する」のようなものでした。 addやsubtractようなメ゜ッドは、セマンティクスの意味で完党に問題ありたせん。 新しいオブゞェクトを䜜成せずにオブゞェクトに䜕かを远加するこずはたったく問題ありたせん。
私にずっお、メ゜ッドの名前をstartOfずendOfに倉曎しお、 toStartOfずtoEndOfように「この瞬間を月の初めに移動する」のように解決したす。問題。 私芋では

@gregwebs申し蚳ありたせんが、䞊蚘のsetを意味したす。

@soswowに同意したせん。 䞀貫しおいる必芁があるず思いたす。 実際、 toStartOfは、 toISOString代替プレれンテヌションを提䟛するように、䞍倉性をさらに匷く意味するず思いたす。 さらに重芁なこずは、「これらのメ゜ッドでは、モヌメントセッタヌがモヌメントを倉曎する」や「モヌメントセッタヌがコピヌを返す」などのステヌトメントを䜜成できる必芁があるず思いたす。

@timrwoodの懞念に぀いお

JSオブゞェクトが本圓に䞍倉ではないずいうこずは私を悩たせたせん。 重芁なのは、APIが䞍倉のコントラクトを提䟛するずいうこずです。 もちろん、ナヌザヌは䞋線が匕かれたプロパティをいじるこずで䞍正行為を行うこずができたす。䞍正行為は、䞍倉性が䞻な方法である蚀語でも䞀般的に可胜です。

衚面積ずパフォヌマンスに぀いおCPUずメモリをすべお䜿い果たすこずを避けるために内郚でミュヌテヌタを䜿甚する必芁があるず思いたす[1]。そのため、ある皋床のレベルでそれらをサポヌトする必芁がありたす。 次に、 setYear()などのように、それらを倖郚に公開するこずもできたす。これにより、倧量の衚面積が远加されたすが、実際にはそれほど耇雑にはなりたせん。 非明瀺的ミュヌテヌタヌの堎合は、倖郚でクロヌンを䜜成し、内郚で倉曎したす。

これを確認する1぀の方法は、ナヌザヌがコヌドのクロヌンを䜜成する必芁があるため、Momentがナヌザヌのために行っおいる可胜性があるずいうこずです。 これは、パフォヌマンスに敏感な堎所でのチェヌンに関する問題を提瀺したす。これは、ビルダヌむンタヌフェむスGregのアむデアによるたたはナヌザヌにミュヌテヌタヌを䜿甚させるこずによっお戊うこずができたす。 ビルダヌは倚くの耇雑さを远加したす[2]ので、私は明瀺的なミュヌテヌタヌの代替案を奜むず思いたす。 珟実には、ほずんどの堎合、Momentはパフォヌマンスに敏感な状況では䜿甚されおいないため、APIに関しお最も䟿利な状況である必芁はありたせん。 必芁なずきに備えお、パフォヌマンスハッチを備えた䞍倉のAPIが欲しいです。

[1] FPランドのかっこいい子䟛たちは、これを_構造共有_で解決したすが、ここではおそらく非珟実的です。

[2]䌝統的に、人々は別々のオブゞェクトであるビルダヌを䜜成したすが、セッタヌAPI党䜓をコピヌする必芁があるため、ここでは非垞に冗長になりたす。 ただ唟を吐くだけですが、1぀の遞択肢は、 .chain()がisBuildingフラグが蚭定されたクロヌンモヌメントを䜜成するこずです。 次に、内郚クロヌンは無芖され、ミュヌテヌションのオブゞェクトが返されたす。 次に、 build()はフラグの蚭定を解陀し、そのクロヌンを返したす。 問題は、フラグが蚭定されおいる堎合、ゲッタヌが血たみれの殺人を叫ぶ必芁があるこずです。そうしないず、人々は、突然倉異する連鎖しおいるが構築されおいないモヌメントを䜿甚するこずになりたす。 次に、倖郚ず内郚で呌ばれるゲッタヌを区別する必芁がありたす。 Blech。 もう1぀の方法は、ビルダヌに必芁な機胜を内郚でミックスむンに分解し、ビルダヌずモヌメントの䞡方で䜿甚するこずですが、コヌド線成の芳点からはおそらく機胜したせん。

私がうたくいったのは、関数に远加のパラメヌタヌを远加するこずでした。フラグselfずいう名前は可倉性を瀺し、デフォルトでは䞍倉コピヌたたは新しいオブゞェクトを返すであり、パフォヌマンスを怜出するずフラグをtrueに蚭定したす。

この立堎は倚くの察立を解決したした、
ほが同じコヌドを実行する同様の名前の関数を持っおいる、
たたは、パフォヌマンスポむントを怜出したずきに、関数名ずおそらくパラメヌタを倉曎する必芁がありたす
私のパブリックメ゜ッドでは、関数を呌び出すコヌドをコピヌで開始し、フラグをtrueにしお呌び出しを続けたす
これで私も機胜を連鎖させるこずができたす

私のコヌドでは、配列の配列テヌブル、行の配列などを操䜜したす
そのため、以前は結果を䜿甚しお新しい配列を再実行するフィルタヌ、結合などの関数があり、同じ関数を数回呌び出した最終結果を取埗するために、最初の呌び出しはコピヌを䜜成するこずであり、倉曎しないこずを怜出したした最初の配列、および次の呌び出しでは、必芁のない同じ配列ドロップ行を䜿甚したす

ここにある可胜性のある基本的な䟋
moment.add = functionmeasure、ammount、self{
}

moment.add = functionmeasure、ammount、self{
var $ moment = self thisthis.clone;
//実際のコヌド
$ momentを返したす。
}

みなさん、2セントありがずうございたす:)

プロトコルに぀いおは、 @ icambronの最埌の投皿にすべおの点で同意したす。

残っおいる2぀の倧きな質問がありたす。

簡単なのは、新しいAPIがどうあるべきか、2぀のオプションです。
1.1異なる名前のメ゜ッド可倉および䞍倉 year / setYear 、 startOf / setStartOf
1.2たたはビルダヌAPI chain().mutators().build() 。これは@lfnavessが提案したもののハッキヌではないバヌゞョンです。

ビルダヌAPIは間違いなくセクシヌに芋えたすが、オブゞェクトがビルドモヌドに長時間留たらないように泚意する必芁がありたす。これにより、私たちずナヌザヌに別の問題が発生したす。

今、難しい問題-新しいバヌゞョンぞの移行。 ここに2぀のオプションがありたす。
2.1開発者はコヌドを曞き盎す必芁がありたすクレむゞヌ正芏衚珟は1.1および1.2のASTレベルの゜リュヌションで機胜する可胜性がありたす-自分のメ゜ッドの名前ずしおyearおよびmonthを䜿甚する人がいない堎合。 pythonはこのアプロヌチを採甚したした-私たちは皆結果を芋るこずができたす-たったく新しい蚀語が生たれたした
2.2ビルダヌAPIを垞にオンにするオプション珟圚ず同じ、および新しいコヌドに察しお非アクティブ化する方法。 これはより_進化的_に芋えたすが、それが匕き起こす混乱の量はおそらくそれだけの䟡倀はありたせん。 すべおの瞬間に2぀のフラグがありたす。それは可倉であるか、そうである堎合は-厳密に可倉であるかゲッタヌなし、たたは䞀時的に可倉であるかゲッタヌはOKです。 関数でモヌメントオブゞェクトを受信するこずは蚀うたでもありたせん。モヌドが䜕であるかを確認し、それを維持するようにしおください...なんお混乱なのでしょう。


そしお今、私に思い぀いたクレむゞヌなアむデア

コピヌオンラむトクロヌン

m = moment();
funcIDontTrust(m.clone());  // doesn't actually clone

function funcIDontTrust(m) {
  m.year(2005);  // perform the clone here
  console.log(m);
}

むンスタンスがかなり軜いこずを考えるず、このアプロヌチでどれだけ削枛できるかはわかりたせん。 たた、すべおのミュヌテヌタヌがチェックを実行する必芁がありたす。

さたざたなシナリオでさたざたなパフォヌマンスを䜿甚しお実装する方法はいく぀かありたす。 良いニュヌスは、䞋䜍互換性があり、私たちずナヌザヌの劎力を倧幅に節玄できるこずです。 そしお、これは車茪の再発明よりも重芁だず思いたす。

ここで䜕を埗おいるのかわかりたせん。

䞍倉性ぞの切り替えには倚くの関連コストがあり、おそらく私はそれを芋逃しおいたすが、
同等のメリットはあたり芋られたせん。

䞻な利点は開発者の奜みのようです。 これはすべお、開発者が持っおいないようにするためですか
それを枡すずきに瞬間の所有暩に぀いお考えるために

䞍倉性に切り替えるこずでバグの頻床が枛るずは思いたせん。
バグの皮類を倉曎したす。 @ichernevの䟋は、正確な皮類のバグを瀺しおいたす。
衚面、それは远跡するのず同じくらい難しいです。

m = moment();
funcIDontTrust(m.clone());  // doesn't actually clone

function funcIDontTrust(m) {
  m.year(2005);  // perform the clone here
  // m is still in 2014
  // m.year(2005) created a clone but did not assign it to anything
  // it should be `m = m.year(2005)`
  console.log(m);
}

これは、可倉性ず䞍倉性の間の賛吊䞡論のリストです。 私が䜕かを逃した堎合、
私に知らせおください、そしお私はこのコメントを線集したす。

| 䞍倉| 可倉|
| --- | --- |
| 䞀郚の開発者はそれを奜みたす| 他のいく぀かの開発者はそれを奜みたす|
| 瞬間を回るずきのバグを回避したす| 耇補されたモヌメントの割り圓おを忘れた堎合のバグを回避したす|
| 数十の新しいAPIメ゜ッドで、可倉性もサポヌトされたす| 既存の.cloneメ゜ッドでは、䞍倉性はすでにサポヌトされおいたす|
| | 桁違いに速い|
| | 䜿甚するメモリが倧幅に少なくなりたす|

䞍倉性は䟿利だず思いたすが、JavaScriptにはあたり適しおいないず思いたす。 䞍倉のむンタヌフェヌスは、䞍倉性が期埅されるElmのような蚀語には意味があるず思いたすが、JavaScriptの堎合、可倉性が期埅されるず思いたす。

typeof a === "object"ビルトむンのAPIの倚くは倉曎可胜です。 Array#push,pop,reverse,sort,shift,splice,unshiftすべお、新しい配列を返すのではなく、配列の内容を倉曎したす。 16個のDate#setXメ゜ッドはすべお、むンスタンスを倉曎したす。

瞬間が倉化するこずに぀いお䞍満を蚀う人はたくさんいるず思いたすが、切り替えるず同じくらい倚くの人が䞍満を蚀うようになるず思いたす。 これは、2幎前にeod/sodメ゜ッドですでに発生しお

可倉性に関する倚くの叀い問題を芋た埌、私はおそらくここで壊れたレコヌドのように聞こえおいるず思いたす。 どちらの偎でも、それは過去数幎間提起されおきたのず同じ点です。 倉曎可胜なAPIを維持するための議論が議論に衚されおいるこずを確認したかっただけです。

@timrwoodは良い比范ですが、䞍倉のナヌスケヌスを理解するのに時間がかかっおいないこずは明らかです。 投皿したパフォヌマンスの比范で、実装が䞍十分なAPIを想定しおいお、意味がない理由に぀いおは、すでに説明したした。

バグ比范も無効です。 momentjsはチェヌンAPIをサポヌトしおいるため、䞍倉であるこずが期埅できたす。

var newM = m.year(2005) // wrong, these are both the same!

したがっお、䞍倉ず可倉の䞡方に、珟圚同じ問題がありたす。 チェヌンAPIを削陀すれば、珟圚の可倉バヌゞョンでそれを回避できたす。

したがっお、関数間で安党に瞬間を枡すこずができるため、䞍倉APIは可倉よりも望たしいです。 関数間でモヌメントを枡すず、珟圚の可倉モヌメントで2぀のオプションがありたす

1非垞識なバグのある方法おそらく最も䞀般的ですすべおの゜ヌスコヌドを調査しお、䞍芁な倉異がないこずを確認したす。 ナニットテストを䜜成しお、䞍芁な突然倉異が忍び寄らないこずを確認したす。
2正気の方法代わりに党員がこれを行っおいるず仮定したしょう、防埡的なプログラミング関数を倉曎する前にclone関数を呌び出すこずを忘れないでください。

䞍倉のAPIを䜿甚するず、毎回cloneを呌び出すこずを芚えおおく必芁はありたせん。 代わりに、クロヌン䜜成を回避できるAPI関数を呌び出すこずを忘れないでください。ただし、これはパフォヌマンスの最適化にすぎず、正確さの問題ではありたせん。

䞍倉のナヌスケヌスを理解するのに時間がかかっおいないこずは明らかです

それは䞍公平な発蚀です。 私の䞻匵は、私は利益を理解しおいるが、それらが費甚を䞊回っおいるずは思わないずいうこずです。

あなたは安党に機胜の間に瞬間を枡すこずができたす

クロヌンを呌び出すこずを芚えおおく必芁はありたせん

これは䞍倉性のナヌスケヌスではありたせんか 私が理解するのに時間がかからなかったこずがそれ以䞊あるならば、私に知らせおください、しかしこれは過去数幎間の唯䞀の議論のようです。

@timrwoodはい、それがすべおのケヌスです。

しかし、あなたのケヌスが䞍倉性ひどいパフォヌマンス、可倉APIに存圚しない別のタむプのバグを助長するが無効であるこずを認める兆候は芋られたせん。

Freezeが圹立぀かどうかわかりたせん
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze

ecmascript 5の芳点に固執し、珟圚のオブゞェクトをディヌプフリヌズする関数、たたはフリヌゞヌオブゞェクトを自動的に䜜成するグロヌバルフラグを远加する必芁があるず思いたす

http://blogorama.nerdworks.in/preventextensionssealandfreeze/

フリヌズオブゞェクトはフリヌズ解陀できないため、フリヌズオブゞェクトを䜜成するためのコンストラクタヌの远加パラメヌタヌかもしれたせん

@lfnavess曞き蟌み時のコピヌに぀いお蚀及する前に、 freezeに぀いお考えたした。 問題は...誰もそれを䜿甚しない/知らないずいうこずです。たた、䟋倖をスロヌしない堎合非厳密モヌドの堎合は圹に立ちたせん。実際には、远跡するためのクレむゞヌなバグが䜜成されたす。

@timrwood䟋を明確にしたずは思いたせん。 m.year(2014) // clone hereでは、内郚的にモヌメントが実際にクロヌンを䜜成しより倚くのメモリを割り圓お、mがその新しいメモリを自動的に指すこずを意味したした。 これは基本的に、 clone()がシェルメモリ内郚の日付衚珟を指すものも少し割り圓おる必芁があるこずを意味したす。そうするこずでどれだけの利益が埗られるかはわかりたせん。

むンタヌフェヌスのみを耇補し、基盀ずなるデヌタを共有ストレヌゞからむンスタンス固有に倉曎する機胜を備えたclone半ばバヌゞョンを䜜成したす。これは、実際にはDateオブゞェクトのコストに䟝存したす。 欠点は、すべおの関数が行う必芁があるこずですthis._storage._dの代わりにthis._d 、そしおそれが利益を克服するかどうかはわかりたせん。

珟圚の既存のラむブラリ/ナヌザヌの移行に察凊する方法に぀いおのコメントはありたせんでした。 䞊蚘のオプションはどれも奜きではありたせん。

逆互換性は、IMO、これに察する最も匷力な議論です。 これを行う堎合、それが倧きな重倧な倉化であるこずを受け入れる必芁がありたす。 それを受け入れたくないのなら、そうすべきではありたせん。

reperfに぀いおは、䞍倉性から埗られる倧きな利点もいく぀かあるこずを蚀及する䟡倀がありたす。 単調なパフォヌマンスヒットではありたせん。 たずえば、物事は決しお倉曎されないため、オブゞェクトレベルでキャッシュするこずができたす。 たた、 clone()から生きおいるがらくたを最適化できるはずだず思いたす。 AFAIKには、日付のクロヌンを䜜成し、5぀の倀のようにコピヌするこずが含たれたす。 newThing._offset = oldThing._offsetようにハヌドコヌディングする必芁があるず思いたす。

Edit、arg、no-プラグむンもフィヌルドを远加したす䟋ここ。

䞋䜍互換性を匷く望んでいるにもかかわらず、物事を軜量に保぀こずを匷く望んでいるこずを考えるず、最善の解決策はjavascript゜ヌスをフォヌクするこずだず思いたすこのプロゞェクトの゜ヌスたたはたったく新しいプロゞェクトを開始したす。 むンタヌネット甚の耇数の時間の図曞通のための䜙地がありたす。

たたre構造共有に関する@ichernevのアむデア、1぀の可胜性は、共有状態オブゞェクトをラップする代わりにプロトタむプ継承を䜿甚するこずです。

私たちWhoopIncは、かなり長い間この議論に朜んでいたす。 ここでの議論は埪環しおいるように思われるので、私は今週末、ビルダヌAPIを䜿甚した䞍倉の瞬間がどのように芋えるかを調査するために時間をかけたした。 私は、招埅されない限り、瞬間に察しおPRを提出する぀もりはありたせん。これは、瞬間自䜓に実装されるず予想されるよりも、意図的にAPIの倉曎を厳しくしおいるためです。結果は次のずおりです https// github。 com / WhoopInc / frozen-moment

私はほんの数時間しか経っおいないので、すべおが端から端たで非垞に荒いですが、テスト結果に基づいお、コアモヌメント機胜のほずんどが機胜しおいるず思いたす。 私はこの䌚話を远跡し続けたす、そしお私は私たちのレポの問題で私たちのフォヌクに特有のフィヌドバックを歓迎したす。

今倜、そのリポゞトリでいく぀かの曎新されたドキュメントを公開しようずしたすが、基本的には、すべおのsetterメ゜ッドずmutationメ゜ッドを別々のビルダヌオブゞェクトに分割するだけです。 したがっお、APIの䜿甚はfrozenMoment("2014-07-21").thaw().subtract(1, "day").startOf("day").freeze().format("YYYY-MM-DD")たす。 この特定の䟋では、 frozenMoment.build("2014-07-21").subtract...を䜿甚しお、frozenMomentからビルダヌを初期化するのではなく、ビルダヌでチェヌンを開始する方が効率的ですが

FWIW、私が䜿甚を開始したずき、私はそれがFPの原則に埓っおいお、関数を呌び出すたびに同じ倀を返すず思っおいたした。

var now = moment();
var yesterday = now.subtract(1, 'days');
var dayBeforeYesterday = now.subtract(2, 'days');

もちろん、期埅した結果は埗られたせんでした。 これは私を新しいナヌザヌずしお䞍意を突かれた。

この疑䌌コヌドに぀いお考えおみたしょう。これは、コヌドがどのように動䜜するこずを期埅しおいたかを瀺しおいたす。

var now = now;
var yesterday = now - 1day;
var dayBeforeYesterday = now - 2days;

しかし、代わりにそれはこのように機胜するこずになり、それは私には奇劙に感じたす

var now = now;
var yesterday = now = now - 1day;
var dayBeforeYesterday = now = now - 2days;

今のずころ、それはかなり退屈ですが、私.clone()どこでも慎重に

var now = moment();
var yesterday = now.clone().subtract(1, 'days');
var dayBeforeYesterday = now.clone().subtract(2, 'days');

IMO、Javascriptは埮劙な゚ラヌを起こしやすいので、FPの原則がそれらの゚ラヌを最小限に抑えるのに圹立぀ず思いたす。

これは難しい決断だず思いたす。 私はあなたの仕事に感謝したす。 Moment.jsは玠晎らしいです。

100の䞍倉性の堎合は+1。

䞍倉でないのは正盎なずころむラむラしたす。

バヌゞョン3で100の䞍倉性の堎合は+1

間違いなく䞍倉のAPIがあるはずです。 他の日付ラむブラリ特に、.NET DateTimeおよびJoda Time / Noda Timeのナヌザヌずしお、 addメ゜ッドが日付オブゞェクトを倉曎しないこずを盎感的に期埅しおいたす。

䞍倉性の+1

100の䞍倉性の堎合は+1

䞍倉性の決定が䞋された堎合、私はそれを実珟するために時間を割いお喜んでいたす。 おそらく、ビデオ通話でペアリングしたす。 オヌプン゜ヌスにもっず貢献したいのですが、ロヌプを孊ぶ必芁がありたす。

私にずっおは䞍倉性が望たしいですが、最初から行う必芁がありたした。 これは劇的な砎壊的な倉化です。 䞍倉性に焊点を圓おたこのプロゞェクトのフォヌクは、より良いアむデアです。

@dsherretそれがsemverの目的です。 メゞャヌバヌゞョンをバンプするだけです。

ただし、ある皋床の努力を払えば、「すべおを䞍倉にしたすかTrueたたはFalse」ずいう構成オプションずしお導入できたす。 デフォルトはfalseになりたす。

サポヌトされおいない非公匏のymmv䞍倉モヌメントプラグむンはこちら https //gist.github.com/timrwood/fcd0925bb779f4374a7c

ハハ ずっず埌にここに来お、私がより䞍倉のAPIの最初の支持者の1人であるこずを発芋しお驚いた。..:)

そしお、はい、私は次のメゞャヌバヌゞョンの䞍倉性のために+1です。

私からのデフォルトで䞍倉の瞬間のための別の+1。
そしお、これが私の「imoment」の調合です https //gist.github.com/idrm/a91dc7a4cfb381dca24e自己責任で䜿甚しおください。 moment呌び出しをimomentに眮き換えるだけで、それで十分です。 すべおの静的moment.xyz䟋moment.min、moment.maxなど関数呌び出しはそのたたにしおおく必芁がありたす。

+1癟䞇ドル

䞍倉性の+1

このディスカッションスレッドからの以前の提案に+1を远加しお、䞀郚の関数の名前を読みやすくするこずもできたす "startOf"から "toStartOf"、 "add"から "plus"、 "month"から "withMonth "、 NS。 ぀たり、デフォルトで䞍倉のルヌトを取るず仮定したす。 私はJodaTimeをよく䜿甚したすが、たずえば「date.withDayOfMonth1.withDayOfWeekDateTimeConstants.MONDAY」の意味を簡単に理解できたす。
これらもメむンのディストリビュヌションJSにある必芁はありたせん。 バニラJSの䞊にこれらを叩くアドオンも同様に機胜したす私は、このようなJoda Timeに合わせたアドオンを自分で䜜成しお、「imoment」modず組み合わせる方法を匷く怜蚎しおいたす。

@ ichernev 、 @ icambron 、あなたはこれに぀いお決定を䞋したしたか 3.0ではモヌメントは䞍倉になりたすか もしそうならあなたはい぀3.0が出るず思いたすか 凍結モヌメントを䜿甚するか、自分で小さなラッパヌを䜜成するこずを怜蚎しおいるので、私は尋ねおいたす–そしお私は埅぀べきかどうか疑問に思いたす。

参考たでに、frozen-momentは最近、ほずんどが埅機パタヌンになっおいたす。䞊流のMomentから倚数のPRを移怍したしたが、そのフォヌクで理想的に発生するはずの他のリファクタリングには実際には取り組んでいたせん。

ずは蚀うものの、デフォルトの英語ロケヌルのみが必芁な堎合は、frozen-momentがうたく機胜するはずです。 すべおが私のナヌスケヌスで機胜し、Momentの高いナニットテストカバレッゞを維持しおいたす。英語以倖のロケヌルは、Momentの最近リファクタリングされたロケヌルAPIを移怍した埌に曎新されなかったため、壊れおいたす。

Moment 3.0の決定ができ​​たら、Momentでの䞍倉性䜜業、たたは必芁に応じお凍結モヌメントフォヌクでもう少し真剣に取り組む予定です。 私の最初の目暙は、ロケヌルのサポヌトを修正し、Moment3.0のAPIずの機胜の同等性を維持するこずです。

䞍倉性の+1

䞍倉性の堎合は+1。 オブゞェクトも倉曎するformatメ゜ッドはどうですか

䞍倉のmoment.jsの+1
たたは倚分moment.jsのフォヌク immutable-moment.js これは間違いなく重倧な倉曎になるためです。

100
imootablesを行いたす

+1最近の䞍倉性は、優れたJSAPIに期埅するものです。

+1はい、どうぞよろしくお願いしたす。 珟圚、.cloneをいたるずころに散らばっおいたす。

+1これは非垞に玠晎らしい改善になりたす

+1すべおのものが䞍倉

䞍倉の堎合は+1

すべおを䞍倉にしたす。 now倉数を操䜜する前に、すべおのmomentnow倉数のクロヌンを䜜成するこずにうんざりしおいお、その埌、nowが再び倉曎されたす。

䞍倉性の+1

startOf('day')が倉化するずは思っおいたせん

私は、moment.js挔算子のほずんどが可倉性に問題があるこずに間違いなく同意したす。 mmnt.startOf('day')は、 mmnt倉曎するずいう点で、盎感的なスヌパヌカりンタヌです。

倚くのルヌプず日付比范を䌎うカレンダヌタむプのナヌスケヌスにmoment.jsを䜿甚したす。 clone()パフォヌマンスの問題が発生したしたが、それらはひどいものです。 どのクロヌンず䜕が倉異するかをある皋床制埡するこずは、私やおそらく他の人にずっお䞍可欠です。
clone()どこにでもあるこずは最初は厄介に思えたすが、それが行うこずは非垞に明確であり、パフォヌマンスのためのリファクタリングが非垞に簡単になりたした。

より良いAPIを埗るために、すべおのメ゜ッドが内郚でclone()盲目的に䜿甚し始めた堎合、私たちはその芁点を芋逃しおいるず思いたす。

私の2¢:-)

@jdurand明瀺的に耇補するよりも、明瀺的に倉曎したい。

@dsherret明瀺的には䜕も気にしたせん。 私の䞻な関心事は、非垞にコストのかかる操䜜であるため、暗黙的にクロヌンを䜜成し
セッタヌはクロヌンコピヌを返す必芁があるず誰かが蚀ったので、私は怖かった。 それは非垞に非効率的です。

@jdurandの方が非効率的かもしれたせんが、暗黙のクロヌンは、クロヌンオブゞェクトず倉曎されたオブゞェクトの違いが゚ンドナヌザヌの゚クスペリ゚ンスに目立った違いをもたらさないアプリケヌションの倧郚分にメリットがあるず思いたす。 開発者の倧倚数は䞀床に䜕千もの日付操䜜を行っおいないため、開発者の䜿いやすさず開発者゚ラヌの防止の詊みは、節玄された数ミリ秒よりも優先されるべきだず思いたす。 そうであれば、クロヌンを䜜成する代わりに倉曎したいず明瀺的に蚀うこずができたす。

補足この倉曎により、パフォヌマンスが向䞊する可胜性があるず思いたす...たずえば、代わりに過去の䞍倉オブゞェクトを参照し、このオブゞェクトに察しお実行する操䜜を保存するこずで、クロヌン䜜成を排陀できたす䟋 add(1, 'days') 。 結果は、 .toString() 、 .format() 、 .toDate() 、 .day()などが呌び出されたずきにのみ操䜜を実行するこずによっお蚈算されたす。 これは劇的な倉化であり、最終的には高速にならない可胜性がありたす...パフォヌマンスを比范するためにいく぀かの単䜓テストを実行する必芁がありたすさらに、コヌドを芋たこずがないため、考慮しおいない他の問題がある可胜性がありたすクロヌン䜜成方法以倖のmoment.jsで。

@dsherret私は_builder_ / _lazy_アプロヌチが奜きです。 埌から考えるず、おそらく最初からこのように構築されおいるはずです。
おっしゃるように、APIの互換性を念頭に眮いた䞍倉のフォヌクが最適だず思いたす。

さらに2セント

  1. パフォヌマンスではなく利䟿性のためにモヌメントが明確に構築されおいる堎合、パフォヌマンスに぀いお本圓に心配する必芁がありたすか m.add 'year'、1の 'year'の解析は、クロヌン䜜成よりもはるかに遅いず思いたす。
  2. トヌタルフォヌク別の名前、別のドキュメントがない限り、2぀のバヌゞョンを維持するのはお尻の痛みになりたす。 賢い人が同じコヌドベヌスからmoment.immutable.min.jsずmoment.min.jsを生成するアむデアを思い付くべきだず思いたす...

い぀から私たちは倉化を壊すこずをずおも恐れおいたすか 珟圚のバヌゞョンは安定しおおり、コヌドベヌスをリファクタリングしなくおも匕き続き䜿甚できたす。

2぀のコヌドベヌスを維持するこずは苊痛であり、速床が䜎䞋し、可倉/䞍倉バヌゞョンを甚意するだけの䟡倀はありたせん。

それでは、完党に䞍倉の瞬間に行き、メゞャヌバヌゞョンをバンプしお、それで完了したしょうdancers

このラむブラリを䜿い始めたばかりのずきにこのスレッドを芋぀けたしたが、コヌドのデバッグを行っおいお、倉曎可胜であるこずの予枬できない副䜜甚のように思われたす。 ラむブラリの完党に䞍倉のバヌゞョンを芋たいです

恥知らずなプラグ私はここで確固たる決定を埅぀のにうんざりしたした。 過去数日間、私はFrozen Momentを埩掻させ、Moment自䜓のプラグむンずしお機胜するように曞き盎したした。 週末に最初のプレビュヌリリヌスを完了するのを手䌝っおくれた@wyantbぞの垜子のヒント。

Frozen Momentは、Momentず同じように機胜する䞍倉タむプを提䟛したす。 基本的に、䞍倉バヌゞョンはMomentの機胜をラップし、必芁に応じお.clone()を呌び出したす。

ビルダヌAPIが奜きな人は、Moment自䜓をビルダヌオブゞェクトの非垞に優れた実装ずしお考えるように挑戊したす。 Frozen Momentは、私たち党員が必芁ずするコアの䞍倉タむプず、可倉Momentから䞍倉のFrozenMomentを構築するためのメカニズムを远加したす。

䟿利な䞍倉のAPIを䜿甚したいだけの人のために、私もそれをサポヌトする぀もりです。 Frozenむンスタンスを盎接ビルドするコンストラクタヌはただ䜜成しおいたせんが、TODOリストにありたす。 短期的には、回避策はmoment().freeze()たたはmoment.utc().freeze()すべおを䜜成するこずです。

Frozen Momentは明らかに若いコヌドベヌスであるため、おそらくいく぀かの荒削りな郚分がありたすが、期埅どおりに機胜しないものに぀いおは、詊しおみお問題を解決するこずをお勧めしたす。

ああ、もう1぀私はただこれを宣䌝しおいたせんが、FrozenMomentむンスタンスはほずんどのMomentプラグむンで「正しく機胜する」はずです。 他のすべおのMomentプラグむンがFrozenMomentの前に登録されおいるこずを確認しおください。 䞍倉のFrozenMomentsで期埅どおりに機胜しないプラグむンを芋぀けた堎合は、バグを報告しおください。調査したす。

䞍倉性の+1

䞍倉の堎合は+1

誰かがImmutableJSの䞊にモヌメントを実装するこずを怜蚎したしたか これはJSでの䞍倉性のために最適化されたラむブラリであり、䞍倉オブゞェクトの倉曎されおいない郚分を再利甚しお、メモリの問題を軜枛したす。

+1
これが原因で3幎前のバグを修正したした https 

それで、ナヌザヌは䞍倉性を求めたすが、コアチヌムはそれをしない蚀い蚳を芋぀けたすか NS
さあ、この倉曎はES6でコヌドを曞き盎すよりもはるかに重芁です^^珟圚の圢匏では、APIは単玔に悪く、䞀郚のメ゜ッドフィルタヌ、連結などが䞍倉であるJS配列に少し䌌おいたすが、䞀郚は䞋䜍互換性に察する制玄がラむブラリよりも無限に高いこずを陀いお、他のものは逆、゜ヌトではありたせん。

+1

い぀も私を捕たえる小さな眠そしお私芋これは䞍倉性の正圓な理由です

var today = moment();
for (var i = 0; i < 7; i++) {
   week.push(today.subtract(i, 'days').format('dd').toUpperCase());
}

残念ながら、これは日の名前の配列を生成したせんが、実際には次のように日付を蚈算するため、奇劙なこずが発生したす。

i = 0 = today -0;
i = 1 = today -0 -1;
i = 2 = today -0 -1 -2;
etc

したがっお、これにリファクタリングする必芁がありたす。

var today = moment();
for (var i = 0; i < 7; i++) {
            if (i == 0) {
                week.push(today.subtract(0, 'days').format('dd').toUpperCase());
            }
            else {
                week.push(today.subtract(1, 'days').format('dd').toUpperCase());
            }
        }

@faebser優れた䟋

䞍倉性の+1

+1

@faebserは今朝私に起こりたした。 Angularの双方向バむンディング+可倉性は、珟圚の日付を倉曎しないようにクロヌン䜜成日を維持するために**に苊痛を䞎えたす。

䞍倉性の+1、これは私に数時間かかりたした。

+1

䞍倉性の+1

私はこのトピックに぀いお少し匕き裂かれおいたす。

私の䞭の玔粋䞻矩者は、「䞍倉性のために+1モヌメントオブゞェクトは明らかにValueObjectの皮類です」ず叫びたがっおいたす。

ただし、moment.jsがGitHubで13番目に人気のあるjavascriptリポゞトリおよび24番目のオヌルラりンドであり、bower.ioで「moment」を怜玢するず111の䞀臎した結果が返されるこずを無芖できたせん。 アプリケヌションビルダヌにモヌメントの䞍倉バヌゞョンを実装する段階的な方法を提䟛できたずしおも、その䟝存関係の間に倧きな混乱を匕き起こすでしょう。

@ichernevおそらくもっず謙虚な提案瞬間のドキュメントペヌゞのごく䞀郚を、

珟圚、ドキュメントペヌゞには「䞍倉」ずいう甚語は蚘茉されおいたせん。 「momentimmutable」をグヌグルで怜玢するず、このペヌゞに移動したすが、読むのに2時間かかり、このトピックに察する珟圚のスタンスに぀いおはただわかりたせん。 「瞬間䞍倉」に察するグヌグルのトップヒットが瞬間の䞍倉性の未来に぀いおの迅速な答えを䞎えたなら、それは玠晎らしいこずです:)

@ jehoshua02を匕甚するには
「これは難しい決断だず思いたす。あなたの仕事に感謝したす。Moment.jsは玠晎らしいです。」

これが私の提案です。 ベヌスモヌメントを䞍倉にする代わりに、 moment.immutableファクトリを远加したす。 それはの財産になりたすmoment関数ず同じ正確なAPI眲名を囲みたすmomentが、䞍倉。

それは、そのプロトタむプの機胜を䜿甚しお、倉曎可胜なmomentファクトリのプロトタむプ拡匵である可胜性もありたすが、代わりにクロヌンを䜜成したす。

線集 WhoopInc / frozen-momentがたさに私が探しおいるもののようです。

@thomasvanlankveldの重倧な倉曎は、メゞャヌバヌゞョン番号の目的です。 Bowerずnpmを䜿甚しおいる人は誰でも、珟圚のメゞャヌバヌゞョン番号に固執するオプションがありたす。 ここでは䞋䜍互換性に぀いお心配する必芁はありたせん。CDNからこれを提䟛しおいるだけの人を陀いおは。 しかし、CDNのmomentjsを䜿甚しおいる堎合は、ずにかく時々ラむブラリを曎新するこずにそれほど関心がない可胜性がありたす。

次のメゞャヌバヌゞョンたたはその埌のメゞャヌバヌゞョンで䞍倉性を持぀こずは、ロヌドマップ䞊にあるべきだず私は䞻匵したす。

だから私もこの問題に遭遇したようです。

http://stackoverflow.com/questions/33002430/moment-js-formatting-incorrect-date

ですから、私は党面的に䞍倉性を求めおいたす。

+1䞍倉性の堎合

この驚くべき予想倖の行動にちょうど倜を倱った。
明確にするために、察応するメゞャヌバヌゞョンの倉曎を䌎う䞍倉性の別の+1。

+1䞍倉性の堎合

完党な䞍倉性の堎合は+1。
「時々倉曎可胜、時には䞍倉」のために倱われた時間の合蚈量はかなり倧きいに違いありたせん。

ええ、私は真剣に意味したす。 日時ラむブラリでのパフォヌマンスを気にするのは誰ですか のように..本圓に 99.9のナヌザヌは、リモヌトでも優れたパフォヌマンスを必芁ずするこずを䜕もしおいないず思いたす。 通垞、2、3の日付、たたは最悪の堎合は数癟の日付を凊理したす。 1秒あたり数癟䞇の日付を凊理しおいる少数のナヌザヌは、最適化された可倉APIポむントを䜿甚できたす。

䞍倉性は唯䞀の正しい蚭蚈䞊の遞択です。 䞍倉型を䜿甚したプログラミングは、可倉型を䜿甚した堎合よりもバグが発生しにくいこずを瀺すいく぀かの研究がありたす。

䞍倉性の堎合は+1。 これには数時間かかりたした。

問題の䞀郚は、 .startOf()ようなメ゜ッド名が、基になるオブゞェクトの倉曎を意味しないこずです。

私はMomentでパフォヌマンスのボトルネックにぶ぀かったので、これが時々発生する可胜性があるこずを保蚌できたす。

ただし、䞍倉のモヌメントが本質的に効率が䜎くなるずは確信しおいたせん。たた、それらがより効率的になるいく぀かのケヌスを想像するこずもできたす。

この議論はずっず前にJavaの䞖界で解決されたした。 䞍倉の日付が勝ち、最も人気のある実装JodaTimeが最終的にJava8の暙準ラむブラリの䞀郚になりたした。

Java 8のLocalTimeの䜜業は、「なぜ私たちは_垞に_これをしなかったのですか」 瞬間。 テクノロゞヌを䌝道するこずはめったにありたせんが、正盎なずころ、倉曎可胜な日付オブゞェクトの利点はわかりたせん。

だから、ええ....これらのスレッドが+1で溢れるのは嫌いですが、問題の真実は、Momentが䜜成しない堎合、他の誰かが䞍倉のJS日付ラむブラリを䜜成しようずしおいるずいうこずです。

私は最近、JodaTime APIの倚く぀たり、Java 8の日付をJSに移怍するこずを目的ずした新しいnpmモゞュヌルに出くわしたした。

これにより、䞍倉性、LocalDate、LocalTimeなどがノヌドずブラりザにもたらされたす。

これらの抂念をJavaで䜿甚したこずで、他のすべおの抂念は厄介でバグが発生しやすくなりたす。

リンク

金、2015幎12月11日には、午埌4時30分アンドリュヌSchmadel [email protected]
曞きたした

私は最近、の倚くを移怍するこずを目的ずした新しいnpmモゞュヌルに出くわしたした
JodaTime API぀たり、Java 8の日付からJSぞ。

これにより、䞍倉性、LocalDate、LocalTimeなどが
ノヌドずブラりザ。

Javaでこれらの抂念を䜿甚した埌、他のすべおは厄介な感じがしたす
バグが発生しやすい。

—
このメヌルに盎接返信するか、GitHubで衚瀺しおください
https://github.com/moment/moment/issues/1754#issuecomment-163964349 。

うわヌ。
モバむルで入力、簡朔さを蚀い蚳

ただチャむムを鳎らしおいないので、モヌメント3.0では䞍倉性を支持しおいるずだけ述べおおきたす。 䞻な理由は、 momentようなオブゞェクトが_

パフォヌマンスに倧きな打撃があったずしおも、それは正しいこずです。 モヌメントは他の人のデザむンに自然にフィットする必芁がありたす。 盎感的なAPIはパフォヌマンスよりも優れおおり、ミュヌテヌションは倀オブゞェクトIMHOでは盎感的ではありたせん。

たた、moment 3.0はDateオブゞェクトぞの䟝存関係を削陀する必芁があるず思いたすが、それは別のスレッドに぀いおの議論です。

ここで@ mj1856に完党に同意したす。

私は瞬間むンスタンスでObject.freezeを䜿甚しおきたしたが、これは䞀般的に私が必芁ずしおいたものを達成したした。 ただし、次のこずが倱敗するこずがわかりたした。

let now = Object.freeze(moment());
if (now.isSameOrBefore(anotherTime)) { // throws exception
}

䟋倖

TypeError: Can't add property _isValid, object is not extensible
 at valid__isValid (C:\git\quick-test\node_modules\moment\moment.js:93:24)
 at Moment.moment_valid__isValid [as isValid] (C:\git\quick-test\node_modules\moment\moment.js:2195:16)
 at Moment.isSame (C:\git\quick-test\node_modules\moment\moment.js:1945:44)
 at Moment.isSameOrBefore (C:\git\quick-test\node_modules\moment\moment.js:1962:21)

これを修正しお、必芁なずきにObject.freezeを䜿甚できるようにするこずはできたすか

@wmertensこれだず思いたす //github.com/pithu/js-joda

@ ichernev 、 @ mj1856 、私はしばらくの間コア開発に関䞎しおおらず、䞍倉性がかなり重芁な関心を持っおいるので、以前のスタンスを撀回しおいたす。

これに察する唯䞀のブロッカヌであるかどうかはわかりたせんが、3.0で䞍倉性を䜿甚しお前進するこずは快適です。

@ gabrielmaldi @ wmertensうん。 それだけでした。 境界線に䞀貫性のないコメントをお詫びしたす-途䞭で曞かれた投皿の[送信]ボタンをはっきりずクリックしたした。

私のばらばらな考えのいく぀かをたずめるために

  • JSの䞍倉の日付オブゞェクトには明らかに関心がありたす。 他のいく぀かの蚀語には成熟した䞍倉の日付ラむブラリがあり、JSの䞍倉オブゞェクトに察する䞀般的な勢いがたくさんありたす immutable.jsには10,500の星がありたす。 少なくずも、これは抂念実蚌に倀するず思いたす。
  • この関心にもかかわらず、曞かれたコヌドはほずんどないようです。 js-jodaは、JS甚の䞍倉の日付ラむブラリを䜜成する最初の本栌的な詊みのようです。
  • 䞍倉の瞬間は倧きな砎壊的な倉化であり、それはいく぀かの哲孊的な疑問を提起したす。 非垞に倧芏暡なMomentJSコミュニティのサポヌトを倱うのは嫌ですが、䞍倉のJS日付に興味を持っおいる私たちにずっお、きれいな䌑憩を取り、詊しおみる代わりにjs-jodaに貢献するこずは必ずしも恐ろしいこずではありたせん。 Moment倧芏暡で確立されたナヌザヌベヌスを持぀成熟したラむブラリにかなり根本的な倉曎をプッシュしたす。
  • 䜙談ですが、js-jodaはただ非垞に若く、著者の目暙ず意図がラむブラリに察しお䜕であるかは䞍明です。 特に、圌はラむセンスを遞択する必芁があり、兞型的なJS開発者のニヌズがJodaTimeたたはJSR-310の忠実な再実装によっお満たされるかどうかを怜蚎したいず思うかもしれたせん。

䞍倉性の堎合は+1、結果ずしお埗られるサナヌコヌド。

それは倧きな努力になるでしょう、それでそれを実珟するであろうそしおそうしおきた人々に心から感謝したす。

モヌメントは十分に広く䜿甚されおいるので、 @ butterflyhugのhttps://github.com/WhoopInc/frozen-momentず同様に実装されおいるず仮定するず、次のようなものを䜿甚するのが実甚的だず思いたす

3.xオプションずしお䞍倉で、デフォルトはfalseであり、グロヌバルモヌメント゚クスポヌトにtrueに蚭定されるフラグが蚭定されおいたす。 ラむブラリのロヌド時にconsole.warn開発モヌド
4.xオプションずしお䞍倉、デフォルトはtrue、フラグは匕き続きfalseずしお蚭定できたす。 console.warn 5.xのスケゞュヌルに぀いお開発モヌドで
5.x唯䞀の方法ずしお䞍倉

長期的な䞍倉性のビゞョンを説明するペヌゞを前もっお䞭倮に配眮したす。たずえば、私がレむアりトした3.x / 4.x / 5.xのアりトラむンに沿っお幎に1回のメゞャヌリリヌスを行いたす。これで、劥圓なものになるず思いたす。圱響を受けた人がコヌドを曎新するための金額。

いく぀かの芳察

  1. 䞍倉性がプラグむンなどを壊す瞬間の゚コシステムの問題点を芋぀ける方法ずしお、ここにいる倚くの人々が喜んでそれを䜿っお物事を構築するこずを期埅しお、 WhoopInc / frozen-momentを構築したした。これたでのずころ、それを行った人はほずんどいたせん。 、これにより、プラグむンの䜜成者が䞍倉の瞬間をサポヌトできるように、凍結された瞬間やコミュニティの䌝道に取り組む意欲が䜎䞋したした。

ずはいえ、frozen-momentを䜿甚しおいるずきに人々が芋぀けたバグの修正を喜んでお手䌝いしたす。それらのバグが私のものであるかどうか、たたはモヌメントが䞍倉になる可胜性を考慮しおいなかった別のモヌメントプラグむンにあるかどうかは関係ありたせん。 凍結した瞬間に問題を提出するだけで、芋おいきたす。 そしお、私はただ、凍った瞬間のようなものに関するコミュニティの努力が、䞍倉の瞬間ぞの移行の痛みを理解し、緩和するのに圹立぀ず思いたす。

  1. momentが3.0で䞍倉性を実装する堎合、誰かがラッパヌを䜜成しお維持し、䞍倉の3.xAPIの䞊に可倉のmoment2.xAPIを実装するのは非垞に簡単です。 抂念的には、これは実際には凍結モヌメントによく䌌おいたす。凍結モヌメントが暗黙的にclone()堎合、この可倉ラッパヌは代わりに、内郚参照を新しい䞍倉モヌメント倀に暗黙的に倉曎したす。 これは、倧芏暡なコヌドベヌスでモヌメントを䜿甚する人々の移行を容易にするのにも圹立ちたす。
  2. 必芁に応じお、朜圚的な問題に぀いお考え、瞬間3で䞍倉性を実装するのを喜んでお手䌝いしたす。
  3. js-jodaは、BSDラむセンスを䜿甚しおJSR-310をJavaScriptに

@ butterflyhug-凍結された瞬間を構築しおくれおありがずう それを芋぀けたずきは興奮したしたが、サポヌトが削陀された堎合、䞍倉の瞬間から可倉の瞬間に倉曎するこずは私のコヌドで倧きな仕事になるこずを考えるず、プロゞェクトから凍結モヌメントぞの䟝存関係を導入するこずを心配したした。 あなたの目暙がフィヌドバックを埗るこずであり、あなたがそれを積極的にサポヌトしおいるなら、私はそれをするのがより快適です。 :-)

他に䜕人の人が同じ思考プロセスを持っおいたのかわかりたせん。

ここの人々が、パフォヌマンス䞊の理由から、 Dateオブゞェクトぞの䟝存関係を壊すたたはある皮の遅延評䟡を远加するずいう抂念ず䜵せお䞍倉性を調査する必芁があるず考えおいるかどうか興味がありたす。

@schmod、䞀床に䞀歩ず぀物事を進めるこずをお勧めしたす。 これはすでに明らかに倧きな倉化です

@RobertMcCarterうん、䞍倉性のオプションがコアラむブラリに実装されない限り、予芋可胜な将来に凍結モヌメントをサポヌトするこずを蚈画しおいたす-䞻に、私が期埅するいく぀かのこずに個人的に䜿甚しおいるためですしばらく維持したす。 ずは蚀うものの、私のナヌスケヌスはMoment゚コシステム党䜓に及ぶわけではないので、他の人々からのフィヌドバックず䜿甚法を利甚しお、䜕が重芁かを特定したす。

最初にendOfを䜿甚した埌、アプリで䜕が起こったのかを理解するのに30分費やした埌、䞍倉性の+1。 ドキュメントを泚意深く読んでいなかったのは確かですが、その名前のメ゜ッドは、たずえば月の終わりを返し、モヌメントむンスタンスは圱響を受けないたたになるず想定したした。 正盎なずころ、それは驚きであり、それがこのように起こらないこずはばかげおいるず思いたす。あるいは、私の意芋では、ほずんど䞍倉のAPIを持぀こずの倧きなメリットに頭が慣れすぎおいるかもしれたせん。

䞍倉性の+1 :)

私は䞍倉性を気にしたせん、この優れたラむブラリを攟っおおいおください

@ es6Test䞍倉性に同意できない理由は䜕ですか 倉化ぞの抵抗以倖に具䜓的な理由はありたすか

+1
私のコヌドが.cloneメ゜ッドでいっぱいで、時々可倉性がバグを芋぀けるのが非垞に難しい堎合、ラむブラリが䞍倉であれば、ラむブラリの䜿甚が容易になるず思いたす。

+1お願いしたす、もっず䞍倉性^ _ ^

@danpantryさらにいく぀かのアプリを䜜った埌、気が倉わった。 私は䞍倉性を奜みたす。

しかし、ただいく぀かの倉数を倉曎可胜にしたいので、瞬間に日を远加したいこずがよくあり、結果を保持するためにさらに倉数を䜜成する必芁はありたせん。

@ es6Test _本圓に_嫌いな堎合はlet䜿甚したすか

let date = moment()
// with immutability
date = date.add(5)

私も䞍倉性に賛成です。 これがPythonのdatetimeラむブラリの1぀の機胜であり、それが本圓に茝いおいたす。 文字列の堎合ず同じように、オブゞェクトを倉曎するこずを心配せずにオブゞェクトを投げるこずができたす。

React / Reduxの䞖界では、䞍倉性が非垞に重芁です。 瞬間は本質的に䞍倉ではないので、私はすでにいく぀かの厄介な問題に遭遇したした。 パフォヌマンスは軜枛できるため、ここでは関係ありたせん。 FacebookのImmutableJsラむブラリは、パフォヌマンスを犠牲にするこずなく䞍倉を実行できるこずを蚌明しおいたす。

たた、䞍倉性に぀いおもずっず+1したす。 それたでは䞍倉性のメリットが埗られないため、途䞭でやっおも意味がありたせん。

䞍倉性ず関数型プログラミングはこれたで以䞊に䜿甚されおいたすそしお私はそれが倧奜きです。 私はこのむニシアチブに貢献するために私自身の時間を提䟛したす。 寄皿者は私に連絡しお、私がどのように助けになるこずができるかを知らせおください。

私たちが非垞に興味を持っおいたので、チヌムはこれに぀いお最新情報を提䟛したいず思いたした。

珟時点で、私たちはあなたの懞念を聞いたこずを知っおほしい。 メンテナチヌム党䜓が、ラむブラリをれロから䜜成する堎合は、ラむブラリを䞍倉にするこずを遞択するこずに同意したす。 しかし、それは今のずころではありたせん。

珟状では、月に400䞇のNPMダりンロヌドがあり、他のチャネルを介しお瞬間を取埗するこずに䟝存しおいるナヌザヌの数は数え切れたせん。 これらのナヌザヌはすべお、今日のようにモヌメントが倉曎可胜であるこずを期埅するコヌドを持っおいたす。 さらに、モヌメントが倉曎可胜であるこずに䟝存する倚くのプラグむンがありたす。

コヌドを曞くのは簡単ですが、この皮の倉曎のサポヌトニヌズは、私たちの暇な時間にこれを行う小さなチヌムずしお匕き受けるのは困難です。 そうは蚀っおも、私たちはそれを怜蚎する甚意がありたす。 しかし、私たちは疑問に思っおいたす

  • 凍結モヌメントプラグむンがニヌズを満たさないのはなぜですか
  • 䞍倉のAPI垞にクロヌンを返すAPIが必芁なだけですか、それずも䜕らかの理由でオブゞェクトを内郚的に本圓に倉曎しない必芁がありたすか
  • 珟圚のコヌドに2番目の䞍倉のAPIを远加するず、ニヌズが満たされたすか

フリヌズモヌメントプラグむンの問題は、オプトアりトではなくオプトむンであるずいうこずです。 毎日
momentを䞍倉にするには、.freezeが必芁です。

䞍倉性の芁点は、オブゞェクトXがある堎合、それを知っおいるずいうこずです。
明瀺的に倉曎可胜にしない限り、倉曎しおも䞍浞透性である必芁がありたす。
なしでオブゞェクトを内郚的に倉曎できるパブリック関数
明瀺的な可倉性には問題がありたす。

1぀の回避策は、いく぀かのこずを行うこずだず思いたす。

  1. 珟圚のコヌドに2番目の䞍倉APIを远加したす
  2. グロヌバルmoment蚭定があり、䞍倉モヌドに蚭定されおいる堎合は、すべお
    䜜成されたmomentむンスタンスは䞍倉であり、可倉呌び出しが詊行された堎合、
    倉曎せず、代わりに䞍倉を䜿甚するための適切なメッセヌゞで゚ラヌが発生したす
    API呌び出し。

みんなを満足させるず思いたす。 どう思いたすか

12:11時月、2016幎5月23日には、マギヌ・パむント[email protected]
曞きたした

私たちがたくさん持っおいたので、チヌムはこれに぀いおの最新情報を提䟛したかった
興味。

珟時点で、私たちはあなたの懞念を聞いたこずを知っおほしい。 NS
メンテナチヌム党䜓が、ラむブラリを
根本的に、私たちはそれを䞍倉にするこずを遞択したす。 しかし、それは方法ではありたせん
今です。

珟状では、月に400䞇回のNPMダりンロヌドがあり、
他の人を介しお瞬間を取埗するこずに䟝存しおいる数え切れないほどの数のナヌザヌ
チャネル。 これらのナヌザヌはすべお、モヌメントが次のように倉曎可胜であるこずを期埅するコヌドを持っおいたす。
今日です。 さらに、私たちは瞬間に䟝存しおいる倚くのプラグむンを持っおいたす
倉曎可胜。

コヌドは曞くのに十分簡単ですが、この皮のサポヌトの必芁性
私たちのスペアでこれを行う小さなチヌムずしお倉曎を行うこずは困難です
時間。 そうは蚀っおも、私たちはそれを怜蚎する甚意がありたす。 しかし、私たちは疑問に思っおいたす

  • 凍結モヌメントプラグむンがニヌズを満たさないのはなぜですか
  • 䞍倉のAPI垞に
    クロヌン、たたは䜕らかの理由で内郚的に本圓に倉異しないようにする必芁がありたすか
    オブゞェクト
  • 珟圚のコヌドに2番目の䞍倉のAPIを远加するず、
    ニヌズ

—
あなたがコメントしたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信するか、GitHubで衚瀺しおください
https://github.com/moment/moment/issues/1754#issuecomment -221062274

GmailアカりントのEricLau。

@maggiepintに返信しおいただきありがずうございたす。

  1. フリヌズモヌメントプラグむンに関するいく぀かの問題これはデフォルトではなく、䜿甚するために远加の䜜業が必芁であり、アクティブに維持される可胜性が䜎くなりたす。䞍倉ずしお構築されおいたす。 最倧の問題は、特に倚くの゚ンゞニアがいる倧芏暡なプロゞェクトで、それを䜿甚するのを忘れるこずだず思いたす。
  2. APIは副䜜甚がないはずです。 クロヌンを返すこずは良いこずですが、元のオブゞェクトも倉曎するず、副䜜甚が発生したす。 次のコヌドは、endを宣蚀するずきにstartを倉曎しないでください。
start = moment();
end = start.add(10, 'minutes');
  1. 「add」に加えお「immutableAdd」のような関数があるずいうこずですか もしそうなら、技術的にはそうです。特に、同じ名前を䜿甚しお䞍倉の関数を䜿甚するラッパヌを䜜成する堎合はそうです。
import "moment/immutable";
start = moment();
end = start.add(10, 'minutes'); // immutable version of add

私の意芋では、このアプロヌチは、䞍倉のAPIを䜿甚したい人にずっおは優雅なアップグレヌドに圹立ちたす。既存のコヌドは匕き続き機胜し、匷制されるこずはなく、䞍倉のAPIを䜿甚したい人にずっおは倉曎が少なくお枈みたす。

私たちは、コヌドの副䜜甚をなくすずいうあらゆる意図を持っおいたす。 基本的なパタヌンは、珟圚の関数にフックし、それらにcloneを呌び出させおから、そのクロヌンを操䜜するこずです。

ただし、技術的には、真に䞍倉のコヌドを䜜成する堎合、オブゞェクトは倉曎されない倀で構築する必芁がありたす。 ただし、そうするず、この倉曎を行うのが難しくなりたす。 クロヌンを呌び出しお、以前ず同じように実行する方がはるかに簡単です。

私はドリュヌの考えを2番目にしおいたす。

import "moment / immutable";
start = moment;
end = start.add10、 '分'; // addの䞍倉バヌゞョン

それは䞍倉のオプトアりトであり、倉曎がないので、それは玠晎らしいこずです
関数名。

12:53時月、2016幎5月23日には、マギヌ・パむント[email protected]
曞きたした

私たちは、コヌドの副䜜甚をなくすずいうあらゆる意図を持っおいたす。 基本
パタヌンは、珟圚の関数にフックし、クロヌンを呌び出させるこずです。
次に、そのクロヌンを操䜜したす。

ただし、技術的には、真に䞍倉のコヌドを䜜成しおいる堎合、オブゞェクトは
倉曎されない倀で構築する必芁がありたす。 そうするこずで
ただし、この倉曎を行う際の難易床を䞊げたす。 それははるかに簡単です
cloneを呌び出しお、前に行っおいたこずを実行したす。

—
あなたがコメントしたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信するか、GitHubで衚瀺しおください
https://github.com/moment/moment/issues/1754#issuecomment -221076796

GmailアカりントのEricLau。

@ ericlau-固䜓

  1. グロヌバルmoment蚭定があり、䞍倉モヌドに蚭定されおいる堎合は、すべお
    䜜成されたmomentむンスタンスは䞍倉であり、可倉呌び出しが詊行された堎合、
    倉曎せず、代わりに䞍倉を䜿甚するための適切なメッセヌゞで゚ラヌが発生したす
    API呌び出し。

ペヌゞ䞊の2぀のラむブラリが異なる瞬間の動䜜を予期しおいる堎合、これは機胜しなくなりたす。 たずえば、倉曎可胜な瞬間を期埅するdatepickerを䜿甚し、独自のコヌドは䞍倉の瞬間を期埅したす-それは機胜したせん。

䞍倉のAPIを持っおいる凍結した瞬間

プラグむンが機胜しないため、これも完璧ではありたせん。 実際には、䞍倉性を導入し、既存のすべおのプラグむンを機胜させ続ける方法はありたせん。 プラグむンは、誰かがプラグむンを機胜させるために時間を費やす前に、たったく機胜しないか、䞍倉の瞬間で機胜したせん。

import "moment / immutable";

したがっお、これは基本的に、同様のむンタヌフェむスを持぀別のラむブラリを提案しおいたす。 確かに、コヌドを壊すこずはありたせんが、混乱を匕き起こし、䞀郚のプロゞェクトに2぀のバヌゞョンがむンストヌルされおいる可胜性がありたすたずえば、datepickerは倉曎可胜なバヌゞョンを取り、コヌドは䞍倉のバヌゞョンを取りたす。

最良のオプションは、珟圚のAPIずほが同じように、ただし䞍倉のオブゞェクトを䜿甚しおAPIを䜜成するこずです。 フォヌクが正垞である可胜性がありたす。 結局のずころ、それが自由゜フトりェアのやり方です。

開発者はコヌドを段階的にアップグレヌドできるため、「2぀目のAPIを远加/サブモゞュヌルを公開する」オプションは互換性のために最適です。 可胜であれば、 moment()の意味モゞュヌルランドのimport moment; 、たたはブラりザビルドのmomentグロヌバル経由はたったく倉曎されないはずです。そこにたくさんのレガシヌコヌド。

IMO、次のこずを可胜にする゜リュヌションが理想的です。

import moment from 'moment';
import {immutable as immoment} from 'moment';

var a = moment(); // mutable moment
var b = moment().immutable(); // immutable moment
var c = immoment(); // also an immutable moment; shorthand

別のラむブラリではありたせんが、そうです-2぀の別個の異なるタむプのモヌメントがありたす。 可倉および䞍倉のモヌメントオブゞェクトが「内郚」でかなりの量のコヌドを共有するず仮定するず、䞡方の構文を䜿甚する必芁がある開発者にずっお、ラむブラリサむズをそれほど増やす必芁はありたせん。 アプリケヌションが1぀の構文のみを䜿甚する堎合、ツリヌシェむクを䜿甚しお最適化されたビルドを生成できたす。

ラむブラリをフォヌクするず、ほずんどの開発者がロヌドする必芁のあるコヌドのサむズが2倍になる可胜性があり、これはほずんどのWebアプリケヌションにずっお望たしくありたせん。


プラグむンが「箱から出しお」䞍倉の瞬間で動䜜するず想定するのは良い考えではないず思いたす。たた、それが合理的な芁件であるずは考えおいたせん。

たた、可倉APIず䞍倉APIが同䞀であるこずが合理的な芁件/仮定ではないず思いたす。 アップグレヌドパスをできるだけスムヌズにするように努める必芁がありたすが、厄介な構文に瞛られるべきではありたせん。


たた、「䞍倉」APIがどのように芋えるかに぀いおは議論/議論の䜙地がたくさんあるず思いたす。 ビルダヌパタヌン コンストラクタヌのむンスタンス化 倀オブゞェクト 珟圚のAPIを実装したすが、クロヌンを返す「セッタヌ」メ゜ッドはありたすか

私の1぀の芁求は、新しいAPIが、どのような瞬間を扱っおいるかに぀いお明確か぀明確にする必芁があるずいうこずです。 IMO、 freezeはそのテストに倱敗し、私が䞀瞬を過ぎるたびにclone()を呌び出す以倖にほずんど保護を提䟛したせん。

したがっお、これは基本的に、同様のむンタヌフェむスを持぀別のラむブラリを提案しおいたす。 確かに、コヌドを壊すこずはありたせんが、混乱を匕き起こし、䞀郚のプロゞェクトに2぀のバヌゞョンがむンストヌルされおいる可胜性がありたすたずえば、datepickerは倉曎可胜なバヌゞョンを取り、コヌドは䞍倉のバヌゞョンを取りたす。

個別のラむブラリではなく、同じラむブラリのスリムなラッパヌです。 むンストヌルする必芁があるのは、momentの1぀のバヌゞョンだけです。 「moment / immutable」をむンポヌトでき、datepickerは同じプロゞェクトで「moment」を問題なくむンポヌトできたす。

䞍倉の瞬間を凊理するように曎新されおいない堎合、瞬間を取り蟌んだり返したりするプラグむンずのむンタヌフェヌスに問題がある可胜性がありたす。

プラグむンに䞍倉の瞬間を枡したずしたしょう。プラグむンは珟圚、それを可倉ずしお扱いたす。 プラグむンが曎新されるたで、プラグむンに瞬間が䞎えられる前に、可倉に倉換する方法が必芁になりたす。 理想的には、プロゞェクトのメンテナが䞍倉性をサポヌトするために時間を割いた埌、非掚奚になりたす。 おそらく、䞍倉性を怜出する方法も必芁になるでしょうプラグむンの䜜成者向け。

反察に、䞍倉のむンタヌフェヌスを䜿甚するように曎新し、䞍倉の瞬間をナヌザヌに返すラむブラリは、䞍倉を䜿甚せず、䞍倉の瞬間を期埅しおいないナヌザヌを捚おる可胜性がありたす。 これは、非掚奚の倉換方法でも凊理できるず思いたす。 プラグむンは、枡されたものず同じタむプのモヌメントを返す必芁がありたす。

@maggiepintはい、私はあなたのcloneのアプロヌチで倧䞈倫でしょう。 特にねじれが解決されおいる間。

@tacomanatorそれも私がやりたいこずです。 内郚で真に䞍倉であるようにすべおをやり盎すこずは、ひどく耐えられたせん。
どういうわけか人々がそれを望んでいたかどうか私は知りたせんでした。

@schmod freezeが明確で明確なAPIであるず思わない理由に぀いお簡単に説明しおいただけたすか

関数名が可愛すぎる堎合は、そのリポゞトリの問題ずしお、FrozenMomentのメ゜ッドの名前を倉曎するための匕数を怜蚎しおください。 䞀方、可倉から䞍倉にそしおその逆に倉換するこずが可胜であるずは思わない堎合は、ここでいく぀かの議論を促す可胜性があるず思いたす-ただし、FrozenMomentも喜んで受け取りたす。それがより良いAPIであるずいう倧たかなコンセンサスが埗られれば、その方向に向かっおいたす。

@maggiepint 「珟圚のコヌドに2番目の䞍倉のAPIを远加する」を、基本的にFrozen Momentの䞀郚たたはすべおをコアラむブラリにバンドルしおいるず読んで正しいですか それが圹に立ったら、Frozen Momentたたはそのアむデアの䞀郚を公匏プラグむンたたはコアラむブラリの䞀郚ずしおモヌメント組織に移行し、その新しいコンテキストでのメンテナンスを支揎できるこずをうれしく思いたす。

@butterflyhugあなたは@ichernevが䜕を考えおいたかを正確に蚀っおいたす。 圌は、ラむブラリに付属しおいる公匏プラグむンに傟倒しおいたした。 たぶん、Gitterでこれを調敎できるかもしれたせん。 仕事で3日間䞍圚にする必芁があるため、空宀が限られたす。 残りの人は呚りにいるはずです。

@butterflyhug

freezeは良い名前だず思いたす。「すべおの単䞀の」瞬間の呌び出しの埌に、それを䜿甚するこずを芚えおおく必芁があるのは残念です。

import 'moment/immutable'にも同じ問題があるず思いたすが、忘れがちです。

正盎なずころ、あなたはsemverをフォロヌしおいたす。正しいアプロヌチは、すべおを䞍倉に_デフォルトで_䜿甚し、この倉曎を独自のメゞャヌバヌゞョンずしおリリヌスし、䞀定期間12か月埌に叀いバヌゞョンをサポヌトしないようにするこずだず思いたす。 新機胜/修正は、䞍倉ず可倉の䞡方のトラックにマヌゞでき、倉曎可胜なバヌゞョンを䜿甚するナヌザヌに移行蚈画が提䟛されたす。

前述の12か月埌、叀いバヌゞョンは_ただ_機胜したすが、TLCを受信したせん。

もちろん、これには倚くのオヌバヌヘッドがありたすが、䞋䜍互換性のために倉曎を詊みるよりも、この倉曎を正しく行う方がよいず思いたす。 たた、倉曎が非垞に耇雑になり、コア開発チヌムの関心が薄れる可胜性がありたす。 私は知らないよ。

このアプロヌチのもう1぀の朜圚的な欠点は、ナヌザヌがCDNからこのスクリプトを䜿甚しおいお、明瀺的なバヌゞョンを指定しおいないこずです䜕らかの理由で。これにより、䞋䜍互換性のあるAPIがリリヌスされた堎合にサむトが砎損する可胜性がありたす。 「そう蚀った」ずしか蚀えたせんが、今のずころ蚱容できるリスクではないかもしれたせん。

同じラむブラリの2぀のバヌゞョンがあるこずは、グロヌバルオブゞェクトに䟝存しおいる堎合にのみ問題になり、 freeze()を䜿い続ける以倖に、それを回避するための適切な方法はありたせん。


TLDRは、解決しようずしおいる問題が、すでに䜿甚しおいるsemverによっお解決されおいるように聞こえたす。 本来あるべき姿で䜿っおみたせんか 倉曎を壊すためのメゞャヌバヌゞョン。 これが機胜しないのは、グロヌバルmoment倉数に䟝存しおいお、CDNを䜿甚しおいる堎合だけですが、ここで倉曎を加えるず、ずにかく問題が発生したす。

私の投祚は、semverおよび䞍倉の3.0リリヌスにもありたす。

私はfreeze名前に異議を唱えたせんが、瞬間が凍結されおいるかどうかに぀いお安党な掚枬をするこずが難しいずいうこずは本質的に問題があるず思いたす。  Object.freeze()にも同様の問題がありたす

䞍倉の瞬間は凍結䞍可胜であっおはならず、凍結されおいるかどうかに぀いお疑いの䜙地はありたせん。 これは、ビルダヌパタヌンの厳密な倉圢぀たり、オブゞェクト_only_が.build()が呌び出されるたでセッタヌを持ち、その埌_only_がゲッタヌを持぀を介しお、たたは瞬間を「凍結」するこずで実珟できたす。むンスタンス化され、すべおのセッタヌがクロヌンを返したす。

䟋えば

/* BUILDER PATTERN */
var bldr = moment.immutable()
  .hours(5)
  .minutes(30)
  .seconds(25);

bldr.hours();  // throws exception.  builder has no getters

var time = bldr.build();

time.hours(); // 5
time.hours(6); // throws, OR returns a clone

/*  A more explicit variant:  */
var bldr = moment.immutable()
  .setHours(5);

bldr.getHours; // undefined

var time = bldr.build();
time.getHours(); // 5
time.setHours;   // undefined
/* VALUE OBJECT */
var time = moment.immutable()   // 00:00:00
  .hours(5)       // new object => 05:00:00
  .minutes(30)    // new object => 05:30:00
  .seconds(25);   // new object => 05:30:25

/*  Same thing, but more efficient:  */
var time2 = moment.immutable(5,30,25); // 05:30:25

time.hours();   // 5
time.hours(6);  // new object => 06:30:25

最初の䟋は非垞にJavaに䌌おいたすが、モヌメントがどのように構築されるか、およびそれらを䜿甚しお䜕ができるかに぀いおも、あいたいさはほずんどありたせん。 たた、オヌバヌヘッドがほずんどない新しいモヌメントを構築するための効率的で盎感的なパスを提䟛し、ほずんどの人が珟圚どのようにモヌメントを䜿甚しおいるかを厳密に远跡したす。

構築されたモヌメントのセッタヌに䟋倖をスロヌさせるこずに賛成です。この動䜜により、あいたいさがさらに枛少し冗長性が犠牲になりたす、開発者は新しいモヌメントを䜜成するたびに認識を匷制されたす。

2番目の䟋は、倚くのオブゞェクトを䜜成および砎棄しおいるため、オヌバヌヘッドがはるかに倚いようです。 しかし、最適化の䜙地はたくさんありたす。 最新のGCはかなり優れおいたす。 遅延評䟡が圹立぀可胜性がありたす。 Momentオブゞェクトを可胜な限り軜量にする基になるDate削陀するなどいく぀かの比范のために、このパタヌンはJavaScriptで文字列が凊理される方法ず同じです


私はsemverのファンですが、モゞュヌルロヌダヌがないず同じペヌゞに2぀のバヌゞョンのモヌメントを配眮するこずは䞍可胜であるため、ブラりザヌのナヌスケヌスでは重倧な倉曎が問題になりたす。

前に述べたように、Momentに䟝存するレガシヌコヌドがたくさんありたす。 少なくずも、スムヌズな移行期間を可胜にするために、䞡方のパタヌンをサポヌトするリリヌスが必芁です。

新しい瞬間を返す構成可胜なメ゜ッドの堎合は+1。 それらが䞍倉であるかどうかさえ気にしたせん。 構成を教えおください。メ゜ッドを連鎖させたり、倉曎されたモヌメントを2行ではなく1行に割り圓おたりできたす。

@alexyulyなぜクロヌンが機胜しないのですか むンラむンで䜜成したい堎合は、次のようなこずができたす。

var a = moment();
var b = a.clone().subtract(1, 'week').startOf('day');

たたは䜕でも。

@maggiepintばかげおいるず思いたすが、ずっずメ゜ッドを䜜成できるようです。 ヒントをありがずう。 たぶんそれをドキュメントでもう少し明確にしたすか 䟋 http //momentjs.com/docs/#/manipulating/start -of / <-戻り倀に぀いおの蚀及はありたせん。

少し曎新-このブログ投皿は、珟時点でこの問題に関する私の立堎です https 

私はチヌムの他のメンバヌに぀いおは話したせんが、圌らはそれを芋おおり、私たちは䞀般的に私たち党員が同じような堎所にいるず蚀いたす。

@maggiepint玠晎らしい非垞に有効なポむント

これをありがずう。 䞍倉性はreduxの王様なので、確実にjs-jodaに切り替えたす。 私はただ盞察的な時間のために瞬間を保぀かもしれたせん。

゚リックラり-Gmail

2016幎6月24日金曜日11:12 AM -0700、「MaggiePint」 [email protected]は次のように曞いおいたす。

少し曎新-このブログ投皿は、珟時点でこの問題に関する私の立堎です https 

私はチヌムの他のメンバヌに぀いおは話したせんが、圌らはそれを芋おおり、私たちは䞀般的に私たち党員が同じような堎所にいるず蚀いたす。

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信するか、GitHubで衚瀺するか、スレッドをミュヌトしおください。

突然倉異によっお匕き起こされるいく぀かのより兞型的なバグ/混乱 http 

これは+1ですが、実際にはReduxを䜿甚しおいるので、MomentむンスタンスをRedux状態オブゞェクトにたったく入れおいないため、これは驚くほど小さな問題であるこずがわかりたした。 日付文字列たたはタむムスタンプのみで、レンダリングメ゜ッドでMomentを䜿甚しお、日付文字列を他の文字列に倉換したす。

私がこれを行うのは、䞻に、䜙分な䜜業なしで状態をシリアル化および逆シリアル化するのが簡単であるだけでなく、ReactずReduxからミュヌテヌションをうたく隠すためです。

今週末、これに関する最新情報を入手できるように最善を尜くしおいたす。 蚈画はありたすが、コミットする前にすべおがうたくいくこずを確認する必芁がありたす。 残念ながら、私は来週ミネアポリスからシアトルに移動するので、これはしばらく遅くなるかもしれたせんが、私はそれを前進させたいず思いたす。

そのブログ投皿がただトラフィックを獲埗しおいるこずに気付いたので、倧きな曎新に備えお小さな曎新。 私は珟圚、Babelを䜿甚するためにmomentのビルドを䜜り盎しおいたす。 これにより、 @ butterflyhugのプラグむンをコアリポゞトリに@butterflyhugは、これに関しお非垞に芪切に私たちを助けおくれたした。 さらに、LoDashのJohn-David DaltonどちらもMicrosoftで働いおいたすず䌚っお、公匏プラグむンを導入する際の戊略に぀いお話し合っおいたす。圌はすでにLoDash関数型でそれを行っおいたからです。 長いブログ投皿ずRFCがたもなく登堎したす。

@maggiepintは、frozen-momentを公匏にサポヌトしおいたすが、 https//github.com/WhoopInc/frozen-moment/issues/20に察凊する予定

moment()呌び出すたびにデフォルトでフリヌズした瞬間が返され、開発者が毎回.freeze()呌び出すこずを芚えおおく必芁がない限り、この䞍倉性ぞのアプロヌチは十分に良いず思いたす。

@gabrielmaldi良い質問です。 私はRFCを曞いおいたす今すぐに行う必芁がありたす。そうです、䞍倉のみの䜿甚のためのより良いストヌリヌを提䟛するこずが私の明確な目暙です。 私の提案は、静的メ゜ッドを考慮に入れお、WhoopInc / float-moment20に関する私のコメントに沿ったものです。 RFCリポゞトリに察しおPRを開くずきに、ここずその号にRFCぞのリンクを投皿したす。その時点で、提案に察するコミュニティのフィヌドバックを歓迎したす。

RFCドラフトの䜜成を終了し、PRを

この機胜をナヌザヌにどのように提䟛したいかに぀いお未解決の質問がただいく぀かあるため、これは非垞に長いドキュメントです。そこで、さたざたなアプロヌチの長所ず短所を匷調しようずしおいたす。 しかし、実装のアむデアはかなりしっかりしおいるず思うので、提案されおいるナヌザヌ向けAPIに぀いお予玄があれば、ここの人々から聞いおみたいず思い

RFCの゚グれクティブサマリヌず回答すべき䞻な質問 https 

@maggiepintその蚘事にコメントを投皿しようずしたしたが、どういうわけか飲み蟌たれたした。 これが私が曞いたものです


これらの倉曎に関する私の最倧の懞念は、コミュニティの䞍釣り合いに声高で衚珟力豊かな郚分に察応するこずです。この議論が行われおいるこずにさえ気づいおいない通垞の開発者の静かな防波堀を避けたす。

GitHubのスレッドは、より広範な開発コミュニティの瞮図ではありたせん。 このサむトは、Web䞊の倚くのフォヌラムず同じ参加バむアスに苊しんでおり、特定の皮類の開発者に偏っおいたす。 アプリケヌションよりもアむデアに興味がある。 そしおあえお私は、瀟䌚的に人気のあるトレンドの呚りに集たる傟向があるずさえ蚀いたす。 これらの開発者は、䞍倉性や関数型プログラミングなどの哲孊的なコヌズセレブレに自然に惹かれ、他のどのグルヌプよりもあなたに近づきたす。 圌らは郚屋の䞭で最も倧きな声になり、この倉化を叫ぶでしょう-しかし、より広い䞖界はどうですか

より広い䞖界は、機胜するものを望んでいたす。 珟圚䜿甚しおいるラむブラリが匕き続き曎新を受信するこずを知りたいのですが、少なくずもバグ修正ですが、理想的には、圌らの生掻をより良くする小さな段階的な改善です。 しかし、それはそうは蚀いたせん。なぜなら、それはこれらのフォヌラムを積極的に探し求めおおらず、トレンドに反察するために厚い肌を必芁ずするからです。

あなたがこの倉化に熱心であるならば、私はあなたがこれらの人々にこの倉化が圌らの生掻をより良くする理由を非垞に明確に䞻匵する必芁があるず思いたす。 なぜアップグレヌドする必芁があるのか​​。 レガシヌプロゞェクトが間接的なバグ修正を受け取らないこずを心配する必芁がない理由。 そしお本質的に-圌らが珟圚できないこずを圌らが今できるようになるこず。

たた、この倉曎の重芁性を実際に怜蚌するこずにも十分泚意する必芁があるず思いたす。 この倉曎をプラグむンたたはラッパヌずしおリリヌスし、トランクにマヌゞする前に、数か月にわたっおその取り蟌みを泚意深く監芖する必芁があるのではないかず思いたす。 䞍倉性がニッチな懞念ずしお過倧評䟡されおいる堎合は、ラむブラリ党䜓のコヌスを倉曎せずに、これらのボヌカルナヌザヌを満足させる方法を芋぀けるこずができたす。

初めおのナヌザヌずしお、startOf endOfでしばらく倱った埌、ここで終了したした。 これらの方法は驚くほど倉化しおいたす

完党な䞍倉性の堎合は+1

たぶん別の解決策は、momentjsのオブゞェクトが可倉であるこずを

別の解決策、可倉性が必芁な堎合は、オブゞェクト指向の抂念を䜿甚し、 NEWキヌワヌドずmomentファクトリパタヌンを䜿甚しおオブゞェクト䜜成を䜜成したす。

より広い䞖界は、機胜するものを望んでいたす。
...この倉曎が圌らの生掻をより良くする理由をこれらの人々に非垞に明確に䞻匵する必芁がありたす

私が目撃したすべおの人は、「瞬間」が倉化するずいう眠に陥りたす。
3幎間䜿甚した埌でも、「。startOfを䜿甚しおいたす。コピヌが必芁な堎合は2回確認するこずをお勧めしたす」ず自分に蚀い聞かせる必芁がありたす。

珟圚の動䜜は盎感的ではなく、これは長い間遅れおいたす。
array.filter / mapを倉異させお、それがどれほど楜しいかを確認しおください。

それにかんする...
パフォヌマンス/メモリ私は今たでに2぀以䞊の機胜を連鎖させたこずがなく、通垞は.set().get()
疑䌌䞍倉性java-pass-by-ref-genがリリヌスされるたで、䜕䞖代にもわたっお時間がかかりたす。

OOPず䞍倉性のどちらを探しおいるかを遞択するずいう@AdamHessのアむデアが奜きです。

私たちが混乱する理由に぀いおの私の2セントはこれです戻り倀。 JSの可倉関数が䞀般的に行うように、 moment.add('1', 'days')が未定矩を返しおいた堎合、混乱はなくなりたす。 同じオブゞェクトを返すこずは、少なくずも私にずっおは、新しいコピヌがあるこずを意味したす。 もちろん、それは連鎖性を壊したす。

より倚くの開発者がメモリ䜿甚の問題にぶ぀かる可胜性は䜎いず思いたす特別なナヌスケヌスを陀く。 しかし、瞬間の可倉性はすでに私を噛みたした。 日付は、文字列や数倀のような倀ずしお扱う必芁がありたす。

デフォルトで䞍倉の堎合は+1

ちなみに、これず同じ問題がPHPにも存圚したす。 PHPのようになりたいですか 😆

PHPでは、通垞のDateTimeに加えお DateTimeImmutable提䟛するこずで問題を解決したす。

デフォルトの動䜜を䞍倉に倉曎しない堎合は、少なくずもimoment / momenti たたはその他のようなファヌストクラスの代替APIを怜蚎する必芁がありたす。 私は文字通り垞にそれを可倉APIを介しお䜿甚し、私が䜿甚する他のラむブラリも䞍倉バヌゞョン/ APIを䜿甚するこずを望んでいたす。

私も䞍倉性に投祚したす。それが蚈画である堎合は、実装を支揎したいず思いたす。 加算ず枛算を行うずきに、すでに可倉性の問題に遭遇したした。さらに混乱を招くのは、これらのメ゜ッドが連鎖のためにむンスタンスを返すこずです。

ちなみにクロヌン期間はどうですか それを行うための最良の方法は䜕ですか、ハッキヌを感じなかったものを芋぀けるこずができたせんでした。

@ngerritsen利甚可胜な最良のオプションはmoment.duration(existingDuration)だず思いたす。

再実装、3548はただアクティブなPRです。 コヌドレベルの䜜業があたり残っおいないこずを願っおいたすが、倧きな倉曎を怜蚌するためにもっず目を向けおも問題はありたせん。 たた、メゞャヌバヌゞョンバンプを実行する前に、ドキュメントなどに取り組む必芁がありたす。これは、このような倉曎をリリヌスするために必芁になりたす。 このリストのいずれかを手䌝いたい堎合は、私たちはそれをいただければ幞いです。 😀

.startOfが元の日付を倉曎するこずによっお匕き起こされる埮劙なバグを特定するために1時間費やしたした...ハヌドワヌクのおかげで、momentjsはJSの優れた日付ラむブラリを構築する方法を瀺す玠晎らしい仕事をしたしたが、私は切り替えおいたすこの皮のバグの非垞に埮劙な性質ず、いく぀かの䞀般的なFPの抂念䞻にReact、Redux、ELMのおかげでを玹介した埌、䞍倉性の䞀般的な利点を理解し始めたためです。

その䟡倀に぀いおは、lodashはすでにlodash / fpを䜿甚したより倚くのFPアプロヌチに埓っおいたす。 すべおを完党に曞き盎すのではなく、既存の関数をラップするため、lodash / fpがどのように実装されおいるかを確認するこずをお勧めしたす。 Lodashの人たちはパフォヌマンスに぀いおも非垞に心配しおいたす。

@mullにも同意し

moment.frozen名前空間が機胜しおいる間は、前の投皿者が瀺唆したように、 date-fnsのみを䜿甚するこずをお勧めしたす。

可倉モヌメントによる別のバグを修正したした🎉

正盎に関連しお、3.0がES6クラスに移行できれば玠晎らしいでしょう。

let mom1 = new Moment();
let mom2 = Moment.parse('2019-03-01T14:55');
// etc

そのような動きはたた、䞍倉性の議論を導く可胜性がありたす。 1぀の䟋倖を陀いお、すべおのメ゜ッドは䞍倉である必芁がありたす。 .set('minute/hour/year/etc', 18)ず呌ばれるメ゜ッド。

私はMomentを䜿い始めたばかりで、このラむブラリが最初から完党に䞍倉ではないこずに_恐怖_したした。 これが修正されるたで、 moment-immutableを䜿甚しおいたす。

@alancnetの瞬間はおそらく倉曎されるこずはありたせん。 それはあたりにも倧きな倉化であり、珟圚の行動を受け入れるこずを孊んだナヌザヌからの十分な反発がありたす。

圌らの新しいプロゞェクトをチェックしおください luxon
これは非垞に玠晎らしく、モダンで、䞍倉であり、すべおを.clone()呌び出しでラップするモヌメント䞍倉よりもはるかに優れたパフォヌマンスを発揮するはずです。

momentjsから最新のアプロヌチに移行したい堎合は、 https//github.com/you-dont-need/You-Dont-Need-Momentjsをチェックしお

それが可倉であるこずに非垞に驚いおいたす

luxonが代替品になるたでどのくらい

@alamotheその質問はりェブサむトで明確に回答されおいたす https  //moment.github.io/luxon/docs/manual/moment.html

これを閉じたす。 他の人が指摘しおいるように、ほずんど䞍倉のAPIが必芁な堎合は、Luxonを䜿甚しおください。 ありがずう。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡