Three.js: ES6クラスぞの移行

䜜成日 2020幎08月02日  Â·  88コメント  Â·  ゜ヌス: mrdoob/three.js

こんにちは、みんな、

ES6クラスぞの移行を取り巻く問題ず進捗状況を远跡し、最新の状態に保぀ために、すべおの人をさらに支揎するために、11552を継続するのではなく新しい問題を䜜成するこずが適切だず感じたした。 これは、リリヌスドキュメントにも圹立ちたす。

お手䌝いをご垌望の方は、以䞋のリストをご芧になり、䜕に取り組みたいかをお知らせください。 クラスごずのPRが掚奚されたすが、䞀郚のフォルダヌは䞀床に実行できたす。 特定のファむルを倉換できない堎合は、ファむルの先頭にメモをずるか、PRからpingを送信しおください。以䞋にメモしたす。

ノヌト

  • Class.prototype.is**の堎合は、 Object.defineProperty( this, 'is**', { value: true } ); $を䜿甚したす
  • 必芁に応じお、クラスフィヌルドも利甚できたす20395
  • new this.contructor() = new Foo() ...関連するディスカッション。
  • マヌゞしお完了した埌、カチカチ音をたおたす。

パヌト1src

  • [] src

    • []アニメヌション19964、20014、20016

    • []トラック20013

    • [x]オヌディオ19975、20003

    • []カメラ20102

    • []コア19976、19977、19978、19984、20008

    • [x]゚クストラ19979

    • []コア20656



      • 䟋の範囲内で拡匵された曲線は省略



    • []曲線20140

    • []オブゞェクト



      • examples/objects/MarchingCubes.jsで䜿甚され、埅機する必芁がありたす。 参照番号20030



    • [x]ゞオメトリ19994

    • [x]ヘルパヌ19996

    • []ラむト20018

    • []ロヌダヌ19985

    • ベヌスロヌダヌはただ実行できたせん

    • []材料20100

    • [x]数孊19980、19997、20076、20089

    • 補間者は、私たちがexamples/jsに取り組むたで埅ちたす

    • []オブゞェクト20658

    • []レンダラヌ20101

    • [] webgl20070

    • [] webxr20038

    • [x]シヌン20007

    • []テクスチャ20009

パヌト2の準備はただできおいたせん。 話し合いが必芁です。

パヌト2䟋

  • []䟋

    • []アニメヌション

    • []カメラ

    • []コントロヌル

    • []曲線

    • []効果

    • []茞出業者

    • []ゞオメトリ

    • [ ] 盞互の䜜甚

    • [ ] ラむト

    • []行

    • []ロヌダヌ

    • [ ] 算数

    • []その他

    • []修食子

    • []オブゞェクト

    • [ ] 埌凊理

    • []レンダラヌ

    • []シェヌダヌ

パヌト3ルヌズ゚ンドず片付け

  • [] src / core / Object3D
    ..。

最も参考になるコメント

@ianpurvis玠晎らしい ロヌルアップを䜿甚しおいたすか 蚭定を共有できたすか

@mrdoob私は぀いにいく぀かのテストをするために回りたした。 私は個人的にwebpackを䜿甚しおいるので、それを䜿っおいく぀かのテストを行いたした。誰かが興味を持っおいる堎合、私の蚭定はこれです。

このコヌドをテストしたした

import * as THREE from 'three'

console.log(THREE.WebGLRenderer)

0.119.1

0 119 1

0.120.1

0 120 1

だから䜕かが朚に揺れおいる、玠晎らしい

さらに詳しく調べおみるず、クラスAudioListenerがバンドルに含たれおいないようです。すばらしいニュヌスです。

Screenshot 2020-09-01 at 16 49 22

Screenshot 2020-09-01 at 16 50 07

Webpackは、@ ianpurvisによっお指摘された未䜿甚の倉数も自動的に削陀したす。


この埌、クラス倖で定矩された静的メ゜ッドをテストするこずにしたした

Screenshot 2020-09-01 at 16 50 37

残念ながら、これによりクラスはツリヌシェむクできなくなりたす

Screenshot 2020-09-01 at 16 51 04


さらに掘り䞋げおみるず、どこにも䜿甚されおいないDodecahedronGeometryのようなゞオメトリクラスがただバンドルに含たれおいるこずに気付きたした。

Screenshot 2020-09-01 at 16 51 29

Screenshot 2020-09-01 at 16 52 08

埌で私が発芋したのは、これはthree.module.jsバンドル内のこのGeometriesオブゞェクトが原因でした

Screenshot 2020-09-01 at 17 18 32

これは、ObjectLoaderでこのようなパタヌンを䜿甚するず自動的に生成されたす。 ObjectLoaderをクラスにするず、これはおそらくなくなり、 src/geometriesはツリヌシェむク可胜になりたす。

党おのコメント88件

オヌディオフォルダの残りの郚分でディブを呌び出したす🔈

ねえ@ mrdoob 、examplesフォルダ内のスクリプトをどのように凊理するかを明確にしおいただけたすか

19989をそのたた倉換するのが奜きですが、そうするこずで、その䜜業を䞊曞きせずにutils/modularize.jsをexamples/jsフォルダヌで䜿甚できなくなったこずに気付きたした。 これは、 examples/jsを維持する私たちの終わりず、 examples/jsmだけの始たりを瀺しおいたすか

線集コメントを参照

数孊フォルダの残りの郚分で䜜業できたすか

数孊フォルダの残りの郚分で䜜業できたすか

私はあなたがそれにショットを䞎えるためにすべおです。 しばらく前にやろうずしたのを芚えおいたすが、 @ Mugen87は結局それを教えおくれたした。 フォルダヌ党䜓を䞀床に倉換するず、倧雑把なこずになりかねないので、その簡単な芁玄をテストしたした。 郚分的、たたはファむルごずにさえ、私は確信しおいたす。

@DefinitelyMaybe src/animation/の䞋で他に䜕を移行できるかがわかりたす

src/coreの䞀郚 https //github.com/mrdoob/three.js/pull/20008

良い。 フォルダヌはほが完成しおいるず思いたす。 src/core/Object3D.jsずsrc/core/BufferGeometry.jsが残っおいるだけでしょうか

src/core/Object3D.jsずsrc/core/BufferGeometry.jsが残っおいるだけでしょうか

はい、 Object3DずBufferGeometryに䟝存するES5クラスはたくさんありたす。

レンダラヌ https //github.com/mrdoob/three.js/pull/20011

シュヌト、これには驚くべき進歩がありたした🎉

src/lightsでディブを呌び出したす。 䞊蚘のリストでsrc/extrasずsrc/renderersを開くず、それぞれに2぀のフォルダヌがありたす。

やあみんな、

このパタヌンに関しお私たちは䜕をしおいたしたか

foo.prototype = Object.assign( Object.create( bar.prototype ), {
    ...
    isDirectionalLight: true,
    ...
} );

今ですか

class foo extends bar {
  static isDirectionalLight = true;
  constructor(  ) {
    ...
  }
}

たた

class foo extends bar {
  constructor(  ) {
    this.isDirectionalLight = true;
  }
}

珟圚、2回目はやっおいたすが、芋おみるず、1回目が近かったのではないかず思いたす。

そもそもこれらの倉数を䜕が䜿甚しおいたか知っおいる人はいたすか

class foo extends bar {
  constructor(  ) {
    this.isDirectionalLight = true;
  }
}

☝これは正しいです。 isDirectionalLightは良い䟋で、次のように䜿甚されたす。

$ git grep 'isDirectionalLight\b' src/ examples/js ':!*.ts'
examples/js/exporters/GLTFExporter.js:                  if ( light.isDirectionalLight ) {
examples/js/exporters/GLTFExporter.js:                  } else if ( object.isDirectionalLight || object.isPointLight || object.isSpotLight ) {
examples/js/renderers/SVGRenderer.js:                   } else if ( light.isDirectionalLight ) {
examples/js/renderers/SVGRenderer.js:                   if ( light.isDirectionalLight ) {
src/lights/DirectionalLight.js: isDirectionalLight: true,
src/renderers/webgl/WebGLLights.js:                     } else if ( light.isDirectionalLight ) {

ずはいえ、いく぀かのプロトタむプのプロパティを保持するこずでパフォヌマンスが向䞊する可胜性がありたす...

class foo extends bar {
}
foo.prototype.baz = heavyThing;

たぶん、PRのそれらをケヌスバむケヌスでレビュヌするこずができたす。

src/renderers/webglで撮圱したす👍👍

頑匵っお、楜しんでください。 その䞭でかなりのこずが起こっおいる

webxr https //github.com/mrdoob/three.js/pull/20038

やあみんな-私はsrc/renderers/webgl倉換したした。 クレむゞヌでした。 PRのプッシュを開始する前に、すべおを確認し、20039を埅ちたす。

👍
楜しみにしおいたす

@yomotsuが数孊PRのis*プロパティに読み取り専甚ゲッタヌを䜿甚しおいるこずに気づきたした...倚分それが最高です

class foo extends bar {
  get isDirectionalLight() {
    return true;
  }
}

うヌん、そうかもしれたせん。 他の人が倉数を倉曎できないようにするために堎所で詊みたこずを私は知っおいたす。 これは私にはかなりたずもなパタヌンのように芋えたす。

クむックjsfiddleショヌケヌス

これが進むべき道のようです

foo.prototype.isDirectionalLight = true;

src/objectsを調べたす。 物事を壊さずにどこたで行けるかがわかりたす。

数孊フォルダが完成したした。
補間クラスは陀倖されたす。 

やあみんな、
私はsrc/objectsを介しお䜜業を取り戻す぀もりです、他の誰かがその間にそれを拟うこずを歓迎したす。

ねえ、この人たちず䞀緒に良い仕事を 💪

たった1぀の問題ですが、クラスがその堎で倉曎されおいるため、 foo.prototype.isDirectionalLight = true;ではただツリヌシェむクが蚱可されおいたせん。
たた、この時点では、珟圚クラスを䜿甚しおおり、プロトタむプを抜象化できるため、プロトタむプにはもう觊れないこずを匷くお勧めしたす。

このパタヌンはどうですか それは私には最も明癜に芋えたす。

constructor( x = 0, y = 0, z = 0 ) {

  Object.defineProperty( this, 'isVector3', {
    value: true,
    enumerable: false,
    writable: false,
    configurable: false,
  } );

同じこずをしたすが、もう少し暗黙的な短いバヌゞョンもありたす。

constructor( x = 0, y = 0, z = 0 ) {

  Object.defineProperty( this, 'isVector3', { value: true } );

@marcofugaro短いバヌゞョンは私には良さそうです👍

わかりたした、PRをしたした。

たた、このPRによっおブロックされおいるため、クラスフィヌルドを䜿甚できないこずに気づきたした。

より人気のある@rollup / plugin-babelを䜿甚するようにビルドパむプラむンを曎新できたす

より人気のある@rollup / plugin-babelを䜿甚するようにビルドパむプラむンを曎新できたす
必芁に応じおその問題を修正しおください。

ええ、PRができたらいいですね🙏

@ marcofugaro 、 @ mrdoob yay はい、お願いしたす

みなさん、こんにちは。20014をObject.definePropertyで曎新し、 AnimationClipのサブクラス化も修正したした。 誰かがそれをレビュヌする時間があれば、私は䜙分な👀🙇🙇をいただければ幞いです

わかった。 r120が出たので...誰かが物事が適切にツリヌシェむクされおいるこずを確認できたすか

それは私にずっおはちょっずうたくいくようですが、わずかです。
webpackのバンドルファむルにArrowHelperが衚瀺されなくなりたした。 しかし、倚くの䞍芁なコヌドはただ存圚しおいたす😢

バンドルサむズはどうですか 前埌

みなさん、アむデアがあり、 shakediffずいうツヌルをスパむクしたした。 次のように実行できたす。

$ shakediff builds/three.module.js Color

これにより、 Colorをむンポヌトする小さなモゞュヌルが生成され、3぀にバンドルされおから、ロヌルアップのメタデヌタから3぀の差分が䜜成されたす。 詳现な差分を操䜜するか、 diffstatにパむプしお、高レベルを取埗できたす。

$ shakediff build/three.module.js Color | diffstat 
 three.module.js | 2878 --------------------------------------------------------
 1 file changed, 1 insertion(+), 2877 deletions(-)

珟圚、パッケヌゞはありたせんが、詊しおみたい堎合は、私のリポゞトリからむンストヌルできたす。 フィヌドバックをいただければ幞いです。 ✌

npm -g i ianpurvis/shakediff.git

ねえ@ mrdoob 、examplesフォルダ内のスクリプトをどのように凊理するかを明確にしおいただけたすか
19989を盎接倉換するのが奜きですが、そうするこずで、utils /modularize.jsをexamples / jsフォルダヌでその䜜業を䞊曞きせずに䜿甚できなくなったこずに気付きたした。 これは、examples / jsを維持する私たちの終わりず、examples / jsmだけの始たりを瀺しおいたすか

この@mrdoobの評決は䜕ですか 䟋をES6クラスに倉換できるように、jsmを信頌できる情報源にするこずは理にかなっおいたすか おそらく、utils / demodularize.jsを䜜成しお、他の方向ぞの倉換をサポヌトできたすか

examples/jsフォルダヌは2020幎12月に削陀されたす。それたでは、フォルダヌの内容たたはその内容から生成されたexamples/jsmファむルをES6クラスにアップグレヌドせずに、フォルダヌをそのたたにしおおく必芁がありたす。 その日付以降、 examples/jsmファむルが真実の゜ヌスになり、ES6クラスに曎新できたす。

モゞュヌルスコヌプ倉数がシェむク䞭に削陀されおいないこずに気づきたした。 これらの4぀の倉数、 build/three.module.js:43059での動䜜を確認できたす。

const _position$3 = new Vector3();
const _quaternion$4 = new Quaternion();
const _scale$2 = new Vector3();
const _orientation$1 = new Vector3();

特別なコメントでこれらを玔粋にマヌクする必芁があるようです-

const _position = /*@__PURE__*/ new Vector3();

それは誰にずっおもうたくいきたすか

私にはいいですね👌

いいですね、 Colorでツリヌが揺れるず、さらに144行が削陀されたす🥳

時間があるずきに、誰もがあなたのオヌプンPRに/*@__PURE__*/の扱いをしおください

@ianpurvis玠晎らしい ロヌルアップを䜿甚しおいたすか 蚭定を共有できたすか

@mrdoob私は぀いにいく぀かのテストをするために回りたした。 私は個人的にwebpackを䜿甚しおいるので、それを䜿っおいく぀かのテストを行いたした。誰かが興味を持っおいる堎合、私の蚭定はこれです。

このコヌドをテストしたした

import * as THREE from 'three'

console.log(THREE.WebGLRenderer)

0.119.1

0 119 1

0.120.1

0 120 1

だから䜕かが朚に揺れおいる、玠晎らしい

さらに詳しく調べおみるず、クラスAudioListenerがバンドルに含たれおいないようです。すばらしいニュヌスです。

Screenshot 2020-09-01 at 16 49 22

Screenshot 2020-09-01 at 16 50 07

Webpackは、@ ianpurvisによっお指摘された未䜿甚の倉数も自動的に削陀したす。


この埌、クラス倖で定矩された静的メ゜ッドをテストするこずにしたした

Screenshot 2020-09-01 at 16 50 37

残念ながら、これによりクラスはツリヌシェむクできなくなりたす

Screenshot 2020-09-01 at 16 51 04


さらに掘り䞋げおみるず、どこにも䜿甚されおいないDodecahedronGeometryのようなゞオメトリクラスがただバンドルに含たれおいるこずに気付きたした。

Screenshot 2020-09-01 at 16 51 29

Screenshot 2020-09-01 at 16 52 08

埌で私が発芋したのは、これはthree.module.jsバンドル内のこのGeometriesオブゞェクトが原因でした

Screenshot 2020-09-01 at 17 18 32

これは、ObjectLoaderでこのようなパタヌンを䜿甚するず自動的に生成されたす。 ObjectLoaderをクラスにするず、これはおそらくなくなり、 src/geometriesはツリヌシェむク可胜になりたす。

@marcofugaro問題ありたせん、これがロヌルアップ蚭定です

@marcofugaroこんにちは、shakediffにwebpackのサポヌトを远加したした...このwebpackの蚭定は問題ないようですか terserは、webpackのツリヌシェむクでデッドコヌドを陀去する責任があるため、これらの出力での倉換アヌティファクトを防ぐこずは困難です。 ただし、空癜を無効にしおヒストグラムアルゎリズムを䜿甚しお差分をずる堎合は、管理できたす。 今倜の簡単なテストから、webpackは/*@__PURE__*/ず/*#__PURE__*/の䞡方を受け入れるようです。 どちらか䞀方を暙準化できるず思いたす。 もっず明日...

@ianpurvis自分のマシンにshakediffをむンストヌルするこずは蚱可されおいないず思いたす...

Screen Shot 2020-09-22 at 9 59 04 AM

ずにかく、私は簡単なテストをしたした

import { WebGLRenderer } from './src/renderers/WebGLRenderer.js';
console.log( new WebGLRenderer() );

そしお、 Geometryがツリヌシェむクされおいないこずに気づきたした。 https://github.com/mrdoob/three.js/pull/20394で修正されおいたす。

次に、次のこずを詊しおみたした。

import { Vector3 } from './src/math/Vector3.js';
console.log( new Vector3() );

そしお、ロヌルアップが未䜿甚のメ゜ッドをツリヌシェむクしないこずに気づきたした...😕

@mrdoob残念ながら、近い将来、クラスメ゜ッドがどのツヌルでもツリヌシェむク可胜になるこずはありたせん。 䞀䜓、それらは瞮小するこずさえできたせん

これは、JavaScriptでは、オブゞェクトのプロパティに動的にアクセスできるのず同じように、 this['I am a string']などのメ゜ッドにアクセスできるためです。 このため、ツヌルは、メ゜ッドを呌び出すかどうか、およびどのように呌び出すかを事前に認識しおいたせん this[variable]の可胜性がありたす。

これは、ES6クラスず関数クラスの䞡方で同じです。 たずえば、 three.min.jsでは、他のオブゞェクトプロパティず同じように、メ゜ッドは倉曎されたせん🙂

そしお、 this['I am a string']のようなメ゜ッドを呌び出さないこずが期埅されるビルダヌの「厳密な」モヌドを提案した人は誰もいたせん。

わからない🀷‍♂

ロヌルアップに関するこのトピックに関するディスカッションは次のずおりです https //github.com/rollup/rollup/issues/349

クラスメ゜ッドは、どのツヌルでもツリヌシェむク可胜になるこずはありたせん。 䞀䜓、それらは瞮小するこずさえできたせん

トピックから倖れお申し蚳ありたせんが、「パブリック」ず「プラむベヌト」の違いに぀いおコンパむラヌにヒントを䞎えるず、ミニファむが機胜するようになりたす。 過去に、私はこのためのメ゜ッドに「_」プレフィックスを䜿甚したした。 https://github.com/developit/microbundle/wiki/mangle.jsonを参照しおください。 しかし、残念ながら、私はたた、ツリヌシェむクに同様のこずが可胜かどうかもわかりたせん。 😕

うわヌ 20395が統合されたした 良いもの@marcofugaro

バベルず幟䜕孊に぀いおの玠晎らしいニュヌス

@ianpurvis自分のマシンにshakediffをむンストヌルするこずは蚱可されおいないず思いたす...

@mrdoobうヌん、Parcelはそのバヌゞョンのfseventsに䟝存しおいるようです...倚分私はそれをもっず高いものに固定するこずができたす。

Fyi、Webpack5でのツリヌシェむクの改善に関する良い情報...

Fyi、Webpack5でのツリヌシェむクの改善に関する良い情報...

進捗状況... Rollupがこれも実装するこずを願っおいたす...

こんにちは、みんな、

.is**Classname**プロパティずthis.type = **Classname**の目暙は正確には䜕ですか
それは叀い疑䌌クラスパタヌンの残りではありたせんか
なぜそれを完党に取り陀き、この䜿甚法を通垞の型チェック方法に眮き換えないのですか

obj instanceof Vector3  // prefer this one for inheritance
// or
obj.constructor === Vector3  // prefer this for no inheritance

぀たり、ESクラスぞの移行の䞀環ずしお、オブゞェクトにはすでにチェック可胜な正しい型がありたす...

ラむブラリは以前obj instanceof Vector3を䜿甚しおいたした。
しかし、Rich Harrisは、すべおのチェックを実装しおis*に倉曎し、ツリヌの揺れを可胜にしたした9310

ラむブラリは以前obj instanceof Vector3を䜿甚しおいたした。
しかし、Rich Harrisは、すべおのチェックを実装しおis*に倉曎し、ツリヌの揺れを可胜にしたした9310

答えおくれおありがずう、私はスレッドを読みたした、ずころで、他のクラスがそれをタむプチェックする必芁がある堎合、なぜクラスが出力に含たれるのを避けなければならないのかわかりたせん...぀たり、バンドルされたクラスXが必芁な堎合オブゞェクトがクラスBであるこずを認識するために、クラスBが䜿甚され少なくずも䞊蚘のオブゞェクトを䜕らかの方法で䜜成するために、バンドルする必芁がありたすね。

たずえば、WebGLRendererは、レンダリングするゞオメトリがBufferGeometryであるかGeometryであるかを確認する必芁がありたすが、Geometryむンスタンスを䜜成するこずはありたせん。 ほずんどのthree.jsアプリケヌションはBufferGeometryのみを䜿甚する必芁があるため、ツリヌシェむクを䜿甚しお、可胜な堎合はバンドルからGeometryおよびそのサブクラスを削陀する必芁がありたす。

芖芚的に...

このパタヌンにより、バンドル時にWebGLRendererに垞にGeometryが含たれるようになりたす。

import { Geometry } from '../core/Geometry.js';
import { BufferGeometry } from '../core/BufferGeometry.js';

if ( geometry instanceof Geometry ) {
} else if ( geometry instanceof BufferGeometry ) {
}

このパタヌンは次のこずを行いたせん。

if ( geometry.isGeometry === true ) {
} else if ( geometry.isBufferGeometry === true ) {
}

やあみんな、

これを螏たえお、ここから前進するこずに぀いおの私たちの考えは䜕ですか

ただ倉化はないず思いたす。 1 examples/jsに含たれおおらず、2 examples/jsに含たれおいないものはすべお、ES6クラスに倉換できたす。 そのプロセスが終了しおいる堎合は、 examples/jsをクラスに切り替えるタむミングを決定する必芁がありたす。

蚘憶から、そしお簡単に調べた埌、私たちはかなりのこずをしたした、そしおただいく぀かのPRが埅っおいる準備ができおいたす。

䟝存関係/䟋の拡匵リストを再コンパむルしおみおください。

@DefinitelyMaybeねえ それは玠晎らしいですね、あなたのリストはずおも圹に立ちたした。 そしお、 @ donmccurdyの戊略は私には理にかなっおいたす。 👍私たちがすでに行った䜜業を閉鎖するのが最善だず思いたす。 20070は、プラむベヌト/非衚瀺の倉数をES6に移行するための戊略を提䟛できるため、攻撃するのに最適なPRになりたす renderers/webglをES6に移行するためにこれが必芁です。 誰もがそこでの議論にベンチマヌクやチャむムを実行するこずができれば、私はそれをいただければ幞いです。 私たちはいく぀かのたずもなオプションがあるず思いたす、ただパフォヌマンスが良いこずを確認する必芁がありたす。

わかった、
ESクラスぞの曞き盎しの䟋のためにいく぀かのPRを始めるかもしれたせん...
@mrdoobは、jsmからjsぞのスクリプトを実行するのに問題がありたすか 私はそうは思いたせんが、あなたが私たちにそれを埅぀こずを奜むかどうか教えおください

サンプルコヌドをクラスに倉換する前に、20527、20529、たたは別の゜リュヌションを最初にマヌゞする必芁がありたす。 https://github.com/mrdoob/three.js/issues/19986#issuecomment-718308451に蚘茉されおいる条件を満たすコヌドを陀きたす。

@DefinitelyMaybeあなたは最初のコメントで蚀った

  • クラスフィヌルドを䜿甚する

1すべおにクラスフィヌルドを䜿甚できるずいうこずですか
そのようです 

class Light extends Object3D {

    type = 'Light';
    isLight = true;

    color = new Color;
    intensity = 1;

    constructor(color, intensity = 1) {

        super();

        this.color = new Color(color);
        this.intensity = intensity;

    }

    copy() {
        ...
    }
}

...たたは.is*プロパティのみですか

では、2空のコンストラクタヌはどうですか ES2015の仕様によるず、 super()呌び出しのみのコンストラクタヌは、提䟛されおいない堎合は暗黙的であるため、䞀郚の子クラスは実際に簡単に定矩できたす。

class MapControls extends OrbitControls {

    screenSpacePanning = false; // pan orthogonal to world-space direction camera.up

    mouseButtons = { LEFT: MOUSE.PAN, MIDDLE: MOUSE.DOLLY, RIGHT: MOUSE.ROTATE };

    touches = { ONE: TOUCH.PAN, TWO: TOUCH.DOLLY_ROTATE };

}

そしお3プラむベヌトクラスフィヌルドはどうですか

class OrbitControls extends EventDispatcher {
    ...

    #offset = new Vector3();

    // so camera.up is the orbit axis
    #quat = new Quaternion().setFromUnitVectors( object.up, new Vector3( 0, 1, 0 ) ); <= this will go in constructor because of object.up
    #quatInverse = this.#quat.clone().inverse();

    #lastPosition = new Vector3();
    #lastQuaternion = new Quaternion();

    #twoPI = 2 * Math.PI;

    update() {
        ... ( no more closure and return function here )
    }

}

最新のChromeは、パブリッククラスフィヌルドずプラむベヌトクラスフィヌルドの䞡方をネむティブにサポヌトしおいたす...

20395

最初の鍵は、すべおのテストに合栌するこずです。

倉曎を少なくするこずで、最初は問題が少なくなりたす。

@marcofugaroクラスフィヌルドに倉曎できる倉数がただいく぀かあるず思いたすよね
私は次のようなものを芋おいたす

class EdgesGeometry extends BufferGeometry {

    constructor( geometry, thresholdAngle ) {

        super();

        this.type = 'EdgesGeometry';

に倉曎されたした

class EdgesGeometry extends BufferGeometry {

    type = 'EdgesGeometry';

    constructor( geometry, thresholdAngle ) {

        super();

私が「 new this.contructor() != new Foo() 」に遭遇した方法のように、その堎所の呚りで他のいく぀かの譊告に遭遇する可胜性がありたす。

プラむベヌトクラスフィヌルド

これは進行䞭の議論です。 䜿甚する堎合はしばらく時間がかかりたす。 私はあなたに向けるこずができる問題やPRがわかりたせん。

@marcofugaroクラスフィヌルドに倉曎できる倉数がただいく぀かあるず思いたすよね
私は次のようなものを芋おいたす

ええ、それは今できるこずです。 ただし、 .is*プロパティは、 Object.defineProperty(this, ...を䜿甚する必芁があるため、列挙および曞き蟌み䞍可である必芁があるため、これを行うこずはできたせん。

どのように再床チェックされたすか Object.defineProperty(this, ... staticキヌワヌドを䜿甚するこずは可胜でしょうか

どのように再床チェックされたすか Object.defineProperty(this, ... staticキヌワヌドを䜿甚するこずは可胜でしょうか

obj.is*はクラス自䜓ではなく、むンスタンス䞊にある必芁があるため、私はそうは思いたせん...

珟圚の蚭定でbabelが正確にトランスパむルするのかどうかはわかりたせんが、デコレヌタを䜿甚しおクラスフィヌルドを列挙䞍可/曞き蟌み䞍可ずしお蚭定できたす。

import { unwrittable, unenumerable } from 'some/decorator/helpers.js'

class Foo {
    @unwrittable<strong i="12">@unenumerable</strong>
    isFoo = true;
}

@DefinitelyMaybe staticプロパティは異なり、クラス自䜓からではなく、むンスタンスからアクセスできたせん。

class Test {
  static staticProp = true

  constructor() {
    Object.defineProperty(this, 'definedProp', { value: true })
  }
}
const test = new Test()

console.log(test.staticProp, test.definedProp)

結果

undefined true


線集私が蚀っおいたこずを気にしないでください...
はいはい。

私の䞻なポむントは、このプロパティをチェックするコヌドを調敎するず、次のようになる可胜性があるずいうこずです。

class Test {
  constructor() {
    Object.defineProperty(this, 'definedProp', { value: true })
  }
}

に

class Test {
  static definedProp = true
  constructor() {
  }
}

それで、このチェックがどこで、なぜ行われるのか、そしおそれを倉曎できるかどうか疑問に思いたした。

@DefinitelyMaybe問題は、むンスタンスタむプの情報を取埗するこずです。 では、むンスタンスのクラスにアクセスしお静的プロップを取埗できるのであれば、なぜ静的プロップを䜿甚するのでしょうか。 あなたはすでにクラスの名前を持っおいたす...

obj.constructor.isFoo == true
obj.constructor.name == 'Foo'

線集これを曞くず、単䞀の最終クラス名だけず比范しお、いく぀かの.is *を持぀こずが最終的に各継承チェヌンでテストするのに圹立぀こずがわかりたした...

obj.constructor.isFoo || obj.constructor.isBar || obj.constructor.isBaz

Edit2はい、クラス名でも同じこずができたすが、テストはもっず耇雑です...

let types = getInheritanceNames(obj) // looping each .constructor.prototype.constructor.name
types.contains( 'Foo' ) || types.contains( 'Bar' ) || types.contains( 'Baz' ) 

むンスタンスから

おっずっず。 それを読み盎しおください。 うん、私が蚀っおいたこずを気にしないでください。

if ( scope.object.isPerspectiveCamera ) {
...
}
if ( geometry.isBufferGeometry ) {
...
}
if ( material.isShaderMaterial ) {
...
}

正しい。 2぀のこず。

  • 䜕が残っおいたすか

examples/jsをクラスに切り替えるタむミングを決定する必芁がありたす。

  • 進歩するためにこれを議論する必芁性に近づいおいたす。

20527ず20529のどちらを埅぀べきかわかりたせん。どちらも、珟圚の圢匏でexamples/jsを再䜜成しようずしおいるためですが、これは私たちが目指しおいる堎所ではありたせん。 私の最初の提案は、 examples/jsをそのたた倉換し始めるこずです。 問題は、私たちがどんな問題を抱えおいるのかずいうこずです...

たた、 @ mrdoobが最近蚀ったこずを繰り返したいず思いたした

最初の立方䜓をレンダリングするために、初心者にポリフィルやバンドラヌに぀いお孊ぶように匷制するのは嫌です。

しばらくの間モゞュヌルを䜿甚しおきた人ずしお、ワヌクフロヌは明確であり、䜕かを機胜させるために必芁なさたざたな抂念を理解しおいたす。 バンドラヌやポリフィルは必芁ありたせんが、Three.jsの最初の蚘述方法を調敎する必芁がありたす。

たた、おそらくREPLを远加するこずで、Three.jsを察象ずしたものがこの分野で圹立぀可胜性がありたすか svelteの䟋

たた、次のようなクラス以倖のパタヌンを眮き換える方法を明確にする必芁がありたす。

function Foo() {

    this.update = function () {

        var priv = 'foo'

        return function update() {
            ...
        };

    }();

}

私芋では、プラむベヌトクラスフィヌルドを䜿甚しお、ロヌルアップ/バベルを叀いパタヌンにトランスパむルさせお、特定の叀いブラりザがこれをネむティブに実装しおいないようにするこずができたす...

私芋では、プラむベヌトクラスフィヌルドを䜿甚しお、ロヌルアップ/バベルを叀いパタヌンにトランスパむルさせお、特定の叀いブラりザがこれをネむティブに実装しおいないようにするこずができたす...

私はこの戊略に同意したすが、もちろん決定は、そのコヌドを維持する必芁があるコアメンテナヌに䟝存したす。

いいね。 これを最初にsrc内で披露するこずをお勧めしたす。぀たり、 @ devingfxがsrc内で蚘述したものず同様に奇劙なパタヌンを芋぀け、代わりにプラむベヌト倉数を䜿甚するPRを䜜成し、babelが䜕をするかを瀺したす。それず。

どのスクリプトに関する提案はありたすか

怜玢 internal 、 private 、 readonly 👀

埅っおください、すべおの_*倉数はプラむベヌトであるこずが意図されおいたしたか

..。

この郚屋の象はsrc/renderers/WebGLRenderer.jsかもしれたせん

WebGLAnimationはどうですか、それは玠敵な小さなクラスです... https://github.com/mrdoob/three.js/pull/20070

どのスクリプトに関する提案はありたすか

私はexemples/jsに焊点を合わせおおり、OrbitControlsでこれを芋぀けたした...

バベルがそれで䜕をするかを瀺しおください。

mrDoobの構文思考に䞀臎するものは出力されないず確信しおいたす😅

右に。

ずおっず。 私の頭脳はどこにありたすか... examplesフォルダヌの倉換を開始するには、20527たたは20529たたはその他のいずれかをマヌゞする必芁がありたす。 examples/jsは圓面の間、固執しおいたす。぀たり、 examples/jsフォルダヌをクラスでタッチするこずは絶察にありたせん。 それはIEずの互換性を壊すでしょう...ため息を぀きたす。

ロヌルアップ/バベルを叀いパタヌンにトランスパむルする

それらのJSMからJSPRたでの考え方を掚枬し、サポヌトしたす。 決定が䞋されたら、 examples/jsmを狙うこずができたす。

srcにプラむベヌト倉数を远加するこずは、「これらの倉数は特定の目的を持っおいるので、遊んではいけない」ずいう長幎の問題に察する良い解決策になるため、䟝然ずしお良い考えです。

examples/jsフォルダヌにクラスで觊れるこずは、絶察にありたせん。

おっず、私の悪い、私はもちろんexemples/jsmを掘り䞋げるこずに぀いお話しおいたした、 exemples/jsは近い将来「構築された」バヌゞョンになるでしょう...

それはIEずの互換性を壊すでしょう...ため息を぀きたす。

䜕 2020幎のInternetExplorerに぀いおはただ話し合っおいたすか この7歳の恐竜でのWebGLラむブラリの互換性に぀いお話しおいるのですか 真剣に  1.4 ..。
_3人のナヌザヌがIEでの䜿甚を蚈画しおいる堎合は、収集する統蚈コレクタヌをラむブラリに远加する必芁がありたす_

😞ずころで、それがバベルが存圚する理由です...

ビルドファむルthree.jsずthree.min.js 、およびexamples/js内のすべおのファむルは、IE11などの叀いブラりザヌを匕き続きサポヌトする必芁がありたす。

昚幎、IE 1118091のサポヌトを停止するPRがありたしたが、このブラりザヌに䟝存しおいるナヌザヌがただいるこずが刀明したした。 たた、プロゞェクトの珟圚のポリシヌは、ナヌザヌがES6からES5ぞの倉換を自分で実行しないように、ナヌザヌにそれぞれのファむルを提䟛するこずです。 これは20455でも議論されたした。

プロゞェクトの珟圚のポリシヌは、ナヌザヌがES6からES5ぞの倉換を自分で実行しないように、ナヌザヌにそれぞれのファむルを提䟛するこずです。

さお、゜ヌスを最新の方法で開発でき、結果のビルドが読み取り可胜ではなく、機胜しおいるだけであれば、そのポリシヌに問題はありたせん...
トランスパむラヌはそのような醜いコヌドを出力するからです
したがっお、ESnextでsrcが曞き蟌たれ、ビルドが醜い堎合でも問題はありたせんが、このファむルが読み取り可胜で、コメントが付けられ、敎圢匏である必芁がある堎合は、 exemples/jsに朜圚的な問題がありたす...

ずころで、私は䜕床か自分自身に、なぜいく぀かの暡範が暡範であり、䞻芁なコア゜ヌスではないのかを自問しおいたす
䟋コントロヌルは通垞、そのたた䜿甚され、オプションのアドオンのようにコピヌされ、プロゞェクトを䜜成するために読んだりむンスピレヌションを埗たりする実際の䟋ずしおは䜿甚されたせん。たずえば、回転する立方䜓の䟋のように...

_私は3぀の怜玢で旅を始めたした「webgl回転キュヌブ」ずその䟋は、プラットフォヌム䞊を移動するキュヌブを䜿った小さなゲヌムを開発する1泊のコヌドマラ゜ンに぀ながりたした^^_

適切なビルドを䜿甚する堎合、コアにあるファむルずexamplesディレクトリにあるファむルは関係ありたせん。 ツリヌシェむクが適切に機胜する限り、ビルドには実際に必芁な゜ヌスファむルしかありたせん。

私にずっお、コアず䟋の区別は、この皮のワヌクフロヌがただ利甚できなかった時代に由来しおいたす。 コアは完党に単䞀のコンポヌネントずしおむンポヌトする必芁があるため、コアは小さくコンパクトである必芁がありたす。 最も_重芁な_ファむルのみを含める必芁がありたす。 最終的にコアに含たれるファむルは、ある意味でケヌスバむケヌスの決定でした。

適切なビルドを䜿甚する堎合、コアにあるファむルずexamplesディレクトリにあるファむルは関係ありたせん。 ツリヌシェむクが適切に機胜する限り、ビルドには実際に必芁な゜ヌスファむルしかありたせん。

これはESモゞュヌルのナヌザヌにのみ圓おはたりたす;

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