Three.js: 䟋のjsmモゞュヌルをむンポヌトするず、バンドラヌはthree.js゜ヌスコヌドを2回バンドルしたす

䜜成日 2019幎09月12日  Â·  43コメント  Â·  ゜ヌス: mrdoob/three.js

three/examples/jsm/.../<module>からむンポヌトするず、バンドラヌロヌルアップでテスト枈みにラむブラリが2回たたは耇数回含たれたす。

たずえば、 import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'を実行するず、バンドラヌはむンポヌトに埓い、OrbitControls.jsではむンポヌトは../../../build/three.module.jsたす。 ただし、倖郚のバンドラヌが../../../build/three.module.jsがthreeず同じモゞュヌルであるこずを知る方法はありたせん。

このための゜リュヌションは、倖郚からのパッケヌゞずむンポヌトずしお䟋のモゞュヌルを扱うこずであろうthreeの代わりに../../../build/three.module.js 。 これにより、three.jsのロヌルアップ構成が砎損する可胜性がありたすが、 threeが3぀のメむン゚ントリポむント src/Three.js の゚むリアスであるこずをrollupに䌝えるこずができるはずです。

最も参考になるコメント

慣れるべきものだず思いたす。 私はそれを手に入れたず思うので、私はそれがそうであるように倧䞈倫です。

ずころで、私はthreejsfundamentalsをすべおesmベヌスになるように曎新したので🀞

党おのコメント43件

ロヌルアップでテスト枈み

ロヌルアップでは確認できたせん。 次のプロゞェクト蚭定のように実行しおいる堎合、すべおが期埅どおりに機胜したす。

https://github.com/Mugen87/three-jsm

threeを倖郚䟝存関係ずしお扱う堎合

export default {
    input: 'src/main.js',
    external: ['three'],
    output: [
        {
            format: 'umd',
            name: 'LIB',
            file: 'build/main.js'
        }
    ],
    plugins: [ resolve() ]
};

その堎合、出力にはthree.jsの゜ヌスコヌドが含たれおいおはなりたせんが、すべおが含たれおいたす。

ただし、OrbitControlsをむンポヌトしない堎合、出力にはmain.jsファむルの゜ヌスコヌドのみが含たれたす。

OrbitControlsむンポヌトをコメントアりトしおから、'three'を䜿甚したす。

これは17220に関連しおいたす-そこで提案された解決策の1぀は、 package.jsonのmainフィヌルドをモゞュヌルビルドパスに眮き換えるこず

ここでの問題を明確にするために、 threeが倖郚ずしおマヌクされおいる間、 ../../../build/three.module.jsぞのハヌドリファレンスをキャッチしないロヌルアップ構成の3぀に䟝存する別のパッケヌゞを構築したす。ビルドに含たれたす。 たずえば、次のファむルをビルドするず、誀っおOrbitControlsコヌドずthreejsコヌドがバンドルに含たれ、@ adrian-delgadoの投皿された構成でビルドされたずきに3぀の別のコピヌがむンポヌトされたす。

// src/main.js
import * as THREE from 'three';
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';

console.log(THREE, OrbitControls);

でパスしおもいるこずは泚目に倀するかもしれない゚むドリアン・デルガド@ OrbitControls.jsに倉曎されたthree OrbitControlsはただかないこずが望たしい堎合があるず、少なくずもに぀ながる可胜性がある、あなたのバンドルに含たれたすOrbitControlsコヌドは、䟝存するアプリケヌションに2回含たれおいたす。

これを長期的たたは最善の解決策ずしお提案する぀もりはありたせんが、構成を倉曎しおOrbitControls および3぀のフォルダヌ内のすべおのファむルを倖郚ずしおマヌクするず、どちらの堎合もこれが解決されたす。

export default {
    // ...

    external: p => /^three/.test(p),

    // ...
};

これを長期的たたは最善の解決策ずしお提案する぀もりはありたせんが、構成を倉曎しおOrbitControlsおよび3぀のフォルダヌ内のすべおのファむルを倖郚ずしおマヌクするず、どちらの堎合もこれが解決されたす。

䜕らかの理由で、ロヌルアップがデフォルトで'three/examples/jsm/controls/OrbitControls.js'も倖郚ずしお扱うこずを期埅しおいたした。 したがっお、提案された゜リュヌションは私のナヌスケヌスに適しおいたす。

関連する17220は非垞に関連性がありたす。 䌚話はおそらくそこで続くはずです。

では、これを行うずどうなりたすか

// src/main.js
import * as THREE from 'three/build/three.module.js';
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';

console.log(THREE, OrbitControls);

それは機胜したすが、3に䟝存する他のlibたたはコヌドの䞀郚が「three」からむンポヌトされおから再び壊れるため、実行可胜ではありたせん。 Package.jsonは通垞、環境に解決方法を指瀺したす。「build / three.module」は、リヌクしおはならないディストリビュヌションの詳现です。 解決がスキップされるず、名前空間の問題が発生したす。

  external: p => /^three/.test(p),

@gkjohnsonナヌザヌが「3぀の」むンスタンスずOrbitControlsをバンドルに含めたい堎合はどうなりたすか

このようにラむブでモゞュヌルを䜿甚しようずするず、同様のこずが発生するこずに関連しおいるかどうかはわかりたせん

import * as three from 'https://cdnjs.cloudflare.com/ajax/libs/three.js/108/three.module.js';
import { OrbitControls } from 'https://threejs.org/examples/jsm/controls/OrbitControls.js';

three.jsを2回ロヌドしたす。1回はCDNから、もう1回はthreejs.orgからロヌドしたす。

たぶんそれはモゞュヌルが3぀で䜿甚されるこずになっおいる方法ではありたせんが、106より前から行くだけで䜕千ものサむトず䟋がありたす

<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/105/three.min.js"></script>
<script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script>

すべおの䟋は、buildbundlingの代わりにラむブでモゞュヌルを䜿甚するこずを瀺しおいるため、ある意味では、以前のようにthree.jsを䜿甚する実際の方法を瀺しおいたせん。 蚀い換えれば、叀い䟋は箱から出しおすぐに機胜したした。 新しい䟋はAFAIKではありたせん。 䟋が機胜するためには、䟋からJavaScriptを抜出し、別の.jsファむルに入れおから、three.jsをロヌカルにおそらくnpmを介しお眮く必芁がありたす。 䟋のすべおのパスを修正しお、パッケヌゞベヌスのパス../.././buildなしにし、最埌にロヌルアップを䜿甚したす

これは、パスを倉曎するだけで十分だった非モゞュヌルバヌゞョンからのかなり倧きな倉曎です。

@mrdoob

@ adrian-delgadoの元の構成では、three.jsが1回含たれ、オヌビットコントロヌルが1回含たれ、パッケヌゞが倖郚ずしおマヌクされるこずはありたせん。 私が提案した構成では、生成されたバンドルのthree/build/three.module.jsずthree/examples/jsm/controls/OrbitControls.jsに倖郚䟝存関係がありたす。

@EliasHasle

ナヌザヌが「3぀の」むンスタンスずOrbitControlsをバンドルに含めたい堎合はどうなりたすか

次に、 externalフィヌルドを陀倖する必芁がありたす。その堎合、3぀の軌道コントロヌルの単䞀のコピヌがバンドルに含たれたす。 rollup-plugin-node-resolve モゞュヌル解決をサポヌトするためにロヌルアップに必芁であり、䞊蚘の構成で䜿甚されおいたすは、デフォルトでpackage.jsonのモゞュヌルフィヌルド mainFieldsオプションを参照を䜿甚するため、軌道3぀の参照を制埡し、「3」は同じスクリプトに解決されたす。 _ mainFieldsが["main", "module"]倉曎され、package.json_で「module」の代わりに「main」が䜿甚される堎合、3぀のコピヌが2぀ここに含たれ、これたでの方法で問題が発生したす。前述のずおり。 ただし、そのフィヌルドを倉曎する必芁がありたす。 ただし、「main」を䜿甚する堎合は、 rollup-plugin-commonjsも必芁になる可胜性がありたす。これは、rollupがデフォルトでrequireを䜿甚するcommonjsファむルの凊理方法を認識しおいないためです。

@greggman

残念ながら、この堎合、モゞュヌルの単玔な亀換がそれほど簡単に機胜するずは思いたせん。 提案された゜リュヌションはいずれもこのケヌスに察凊するものではなく、コアスクリプトず䟋を別々のホストからむンポヌトするケヌスを支揎するために䜿甚できる公匏なものは珟時点ではないず思いたす。 私の知る限り、これを支揎するために䜜業䞭ののはむンポヌトマップだけです。 䟋ず3぀の䞡方が同じホストからむンポヌトされた堎合、3぀のコピヌが1぀だけロヌドされたす。

import * as three from 'https://cdnjs.cloudflare.com/ajax/libs/three.js/108/three.module.js';
import { OrbitControls } from 'https://cdnjs.cloudflare.com/ajax/libs/three.js/108/examples/jsm/controls/OrbitControls.js';

// or

import * as three from 'https://threejs.org/build/three.module.js';
import { OrbitControls } from 'https://threejs.org/examples/jsm/controls/OrbitControls.js';

ナヌスケヌスによっおは、埓来のスクリプトタグを匕き続き䜿甚するこずが望たしい堎合がありたすか

@greggman

このようにラむブでモゞュヌルを䜿甚しようずするず、同様のこずが発生するこずに関連しおいるかどうかはわかりたせん

import * as three from 'https://cdnjs.cloudflare.com/ajax/libs/three.js/108/three.module.js';
import { OrbitControls } from 'https://threejs.org/examples/jsm/controls/OrbitControls.js';

ええ...そのようなモゞュヌルは䜿甚しないでください😁

ええ...そのようなモゞュヌルは䜿甚しないでください😁

同意したした。 ほが間違いなく、ドキュメントず䟋はほずんど経隓の浅い開発者を察象ずしおおり、jsmの䟋がデフォルトであり、ビルダヌなしでは機胜せず、CDN経由でも機胜しないずいう事実は䞀皮の倧きな倉化です。

以前は、基本的に䟋の゜ヌスを衚瀺し、コピヌしおjsfiddle / codepenなどに貌り付け、スクリプトタグのパスを修正するず、実行されおいたした。 ただし、three.jsサむトに盎接リンクしお、バヌゞョンがバンプされるたびにサンプルが壊れるのを確認しない限り、すべおの䟋は実行されたせん。 はい、モゞュヌル以倖の䟋が存圚するこずは知っおいたすが、それらはhttps://threejs.org/examplesからリンクされおいるものではありたせん

@gkjohnson

import * as three from 'https://cdnjs.cloudflare.com/ajax/libs/three.js/108/three.module.js';
import { OrbitControls } from 'https://cdnjs.cloudflare.com/ajax/libs/three.js/108/examples/jsm/controls/OrbitControls.js';

動䜜したせん。OrbitControlsがCDNになく、OrbitContrls ../../../ bulild / three.js内のパスが正しく動䜜したせん。

// たた

import * as three from 'https://threejs.org/build/three.module.js';
import { OrbitControls } from 'https://threejs.org/examples/jsm/controls/OrbitControls.js'

たた、three.jsが新しいバヌゞョンをプッシュするたびに壊れおしたうため、機胜したせん

たぶん、examples / jsフォルダヌをCDNず3぀にプッシュしお、サンプルコヌドのURLを修正するだけでも機胜するようにしたすか ぀たり、three.module.jsは次の堎所にある必芁がありたす

https://cdnjs.cloudflare.com/ajax/libs/three.js/108/build/three.module.js

buildがパスに远加されたした

オプションに぀いお蚀及するず、jsdelivrやunpkgなどの他のCDNはESモゞュヌルをサポヌトしおいたす。

以前は、基本的に䟋の゜ヌスを衚瀺し、jsfiddle / codepenなどにコピヌしお貌り付け、スクリプトタグのパスを修正するず、実行されおいたした...

良くも悪くも、それに぀いお䜕か圹に立぀こずをするには、むンポヌトマップが必芁だず思いたす。

これで、three.jsサむトに盎接リンクしない限り、すべおの䟋が実行されるわけではありたせん。

threejsサむトのラむブスクリプトに盎接リンクするこずを誰にも勧めたせん...それは決しお良い考えではありたせん。 䞊蚘のコメントごずに、バヌゞョン管理された代替案がありたす。

理想的には、これらの質問に答えるドキュメントは、[モゞュヌル経由でむンポヌト]ペヌゞです。 そこでカバヌすべきケヌスはありたすか CDNに぀いお蚀及するのは良い考えだず思いたす。

CDNに蚀及するこずは良い考えです。 たた、Googleで最初にヒットしたcloudflare CDNは、モゞュヌルには適しおいたせん倉曎されない限り

@greggman

以前は、基本的に䟋の゜ヌスを衚瀺し、コピヌしおjsfiddle / codepenなどに貌り付け、スクリプトタグのパスを修正するず、実行されおいたした。

私はあなたの味方です。 モゞュヌルの最悪の郚分は、䟋のコン゜ヌルからcameraたたはrendererアクセスできなくなったこずです😟

unpkgを䜿い始めおみたせんか

unpkgを䜿い始めおみたせんか

[モゞュヌル経由でむンポヌト]ペヌゞなどのドキュメントで䜿甚を開始するのですか、それずもプロゞェクトで䜕らかの方法で䜿甚するのですか

モゞュヌルの最悪の郚分は、䟋のコン゜ヌルからカメラたたはレンダラヌにアクセスできなくなったこずです。

ええ、それはむラむラしたす。 ロヌカルで開発するずき、私はこれたたは同様のものを䟋に投げ蟌んできたした

Object.assign( window, { camera, renderer, scene } );

それは開発ツヌル拡匵機胜で解決したいず思っおいるこずだず思いたすか

調査が必芁ですが、興味深いアむデアが1぀ありたす...すべおの䟋にむンポヌトマップのポリフィルを远加する堎合は、そこで䜿甚されるむンポヌトをnpmず互換性のある100コピヌ/貌り付けにするこずができるず思いたす-およびバンドラヌベヌスのワヌクフロヌ。 䟋えば

<script defer src="es-module-shims.js"></script>
<script type="importmap-shim" src="importmap.dev.js"></script>

<!-- ... -->

<script type="module-shim">
  import { Scene, WebGLRenderer } from 'three';
  import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';

  // ...
</script>

unpkgを䜿い始めおみたせんか

[モゞュヌル経由でむンポヌト]ペヌゞなどのドキュメントで䜿甚を開始するのですか、それずもプロゞェクトで䜕らかの方法で䜿甚するのですか

https://threejs.org/build/を指す代わりにISSUE_TEMPLATEでそのリンクを䜿甚しおいたす。

そしお、 @ greggmanはおそらくhttps://cdnjs.cloudflare.com/ajax/libs/three.js/108/からたすか

unpkgは、ここで説明しおいる問題を解決するようです。

ええ、それはむラむラしたす。 ロヌカルで開発するずき、私はこれたたは同様のものを䟋に投げ蟌んできたした

Object.assign( window, { camera, renderer, scene } );

うヌん ハハ

それは開発ツヌル拡匵機胜で解決したいず思っおいるこずだず思いたすか

はい 🀞

@greggman

このようにラむブでモゞュヌルを䜿甚しようずするず、同様のこずが発生するこずに関連しおいるかどうかはわかりたせん

import * as three from 'https://cdnjs.cloudflare.com/ajax/libs/three.js/108/three.module.js';
import { OrbitControls } from 'https://threejs.org/examples/jsm/controls/OrbitControls.js';

ええ...そのようなモゞュヌルは䜿甚しないでください😁

だから今日、私は自分がたさにそれをしおいるこずに気づきたした...😅それは確かに悪い習慣ですが、問題はほずんどのものが䞀皮の仕事であるずいうこずですが、䜕かが壊れた堎合、それを特定するのはかなり難しいです。

私の堎合は、むンポヌトされたthree.module.jsからdevずOBJLoaderからmaster 。 OBJLoader茞入three.module.jsからmasterので、 BufferGeometry持っおいなかった新しいusageプロパティを、そしおWebGLRendererやりたしたusage芋぀からなかったため、メッシュをレンダリングしたせん

これはかなり毛深いです...

慣れるべきものだず思いたす。 私はそれを手に入れたず思うので、私はそれがそうであるように倧䞈倫です。

ずころで、私はthreejsfundamentalsをすべおesmベヌスになるように曎新したので🀞

three.module.min.jsを持っおいるのは良いこずのように思えたすがたたはthree.min.module.js 😜

+1

ES6モゞュヌルずしお3぀のオヌビットコントロヌルをむンポヌトしおいたす。オヌビットコントロヌルはビルドフォルダヌ内の3぀を参照しおいるため、パスを把握するのに時間がかかりたした。

スヌパヌファンは3぀をモゞュヌルずしお䜿甚できたすが、これに぀いおもっず柔軟性があるずいいのですが、他のモゞュヌルにも圓おはたるず仮定しお、軌道制埡ファむルに移動しおいじり始める぀もりはありたせん。

たた、three.min.module.jsの堎合は+1😎

18239から移動しお、three.jsを䜿甚する別のパッケヌゞでnpm linkを実行するこずで、同様の問題に巻き蟌たれ

この問題の解決に圹立぀可胜性のあるプラグむン3ミニファむアを開発したした。

私は同じ問題に盎面しおいたす。 私はthree.jsを䜿甚しおReactコンポヌネントを䜜成しおおり、䟋からいく぀かのモゞュヌルをむンポヌトしおいたす。 ロヌルアップでバンドルされたら、バンドルを芋るず、3぀に察しお1぀のむンポヌトステヌトメントがあり、次にThree.jsコヌドがあるこずがわかりたす。

コンポヌネントでこのむンポヌトステヌトメントを䜿甚する堎合 import * as THREE from "three/build/three.module"
物事は正しく機胜したすが、Threeはバンドルに埋め蟌たれたす。これは私が望たないこずです。
3぀のむンポヌトステヌトメントが欲しいのですが。 import * as THREE from "three䜿甚するず、バンドルには3぀がモゞュヌルずしおむンポヌトされたすが、䟋の1぀を䜿甚するずすぐに、three.jsがバンドルに远加されたす= 3぀に察しお1぀のむンポヌトステヌトメントがありたす、そしお3぀のコヌド、これは最終的に私のコヌドを壊したす

@chabb

私はthree.jsを䜿甚しおReactコンポヌネントを䜜成しおおり、䟋からいく぀かのモゞュヌルをむンポヌトしおいたす。 ロヌルアップでバンドルされたら、バンドルを芋るず、3぀に察しお1぀のむンポヌトステヌトメントがあり、次にThree.jsコヌドがあるこずがわかりたす。

ここに投皿された解決策はあなたの問題を解決するはずです https //github.com/mrdoob/three.js/issues/17482#issuecomment-530957570。

これらの問題の倚くは、バンドラヌで䜕が起こっおいるのかを完党に理解しおいない人々に起因しおいるず思いたすこれは理解できたすが、これらの問題は3぀に固有のものではありたせん。 ただし、誀っお3぀のコアを二重にむンポヌトするず、他のラむブラリよりも目立぀可胜性がありたす。 lodash、reactコンポヌネント、OrbitControlsなどの倖郚を意図した䟝存関係をバンドルするず、簡単に芋萜ずされる可胜性がありたす。

倖郚パッケヌゞに䟝存するこずに関しお、Rollupはこの動䜜を文曞化し、ここにオプションを提䟛したす。Webpackにも同様のオプションがありたす。 この堎合、サンプルファむルが代わりに「3」を参照しおいるず、コアラむブラリはバンドルされたせんが、サンプルコヌドのバンドルが重耇するこずになりたす。これはそれ自䜓の問題です。 そしお、バンドラヌがnpmリンクの萜ずし穎を解釈するのを助けるためにこのプロゞェクトができるこずは䜕もないず思いたす。 私が芋た唯䞀の問題のあるケヌスは、誀っお構成されたバンドラヌの結果ではないず感じおいるのは、codesandboxのケヌスだず思いたす。

バンドラヌの堎合、答えは、ドキュメント化、トラブルシュヌティングガむドの远加、たたはモゞュヌル経由のです。

examples/jsmパッケヌゞがこのパタヌンを倉曎できるずしたら...

// <strong i="7">@file</strong> GLTFLoader.js

// Before
import { Mesh } from '../../build/three.module.js';

// After
import { Mesh } from 'three';

...これらの問題ははるかに簡単に解決できたす。 残念ながら、耇雑なビルド蚭定なしで、threejsWebサむト内のHTMLサンプルをどのように管理するかはわかりたせん。 threejs Webサむトのむンポヌトマップポリフィルで解決できる可胜性がありたすが、よくわかりたせん。 /

サンプルファむルが代わりに「3」を参照しおいる堎合、コアラむブラリはバンドルされたせんが、サンプルコヌドのバンドルが重耇しお衚瀺されたす...

私はこれに完党には埓いたせん。 それらは盞察パスむンポヌトなので それらをパッケヌゞ盞察にするこずができたす。

@donmccurdy

私は、examples / jsmパッケヌゞがこのパタヌンを倉曎できれば、これらの問題ははるかに簡単に解決できるだろうずいう予感がありたす。

これで解決したように芋えるず思いたすが、アプリケヌションが砎損しないため、コヌドが重耇しおいるこずに気づきにくい堎合がありたす。

私はこれに完党には埓いたせん。 それらは盞察パスむンポヌトなので それらをパッケヌゞ盞察にするこずができたす。

䞍明な点がある堎合は申し蚳ありたせんが、これを説明するのは少し難しいず思いたす。うたくいけば、これはもう少し明確になりたす。 ロヌルアップケヌスを䜿甚したす。

threeが倖郚ずしおマヌクされたパッケヌゞをロヌルアップしたい䞊蚘の堎合、three.jsが別のアプリケヌションが䟝存できるピア䟝存関係になるラむブラリを構築しおいるず思いたす。

import * as THREE from 'three';
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
import { stuff } from './local/src/index.js';

// library code with exports...

ここでの目暙は、䞊蚘のthree.jsむンポヌトをラむブラリに残し、バンドルで3぀ずOrbitControlsをピア䟝存関係ずしおロヌドするこずです。したがっお、アプリケヌションがthree.jsずOrbitControlsも䜿甚する堎合は、どちらも2回むンポヌトしないでください。

人々は、オプションexternal: [ 'three' ]がこの動䜜を実珟するこずを期埅しおいたすが私は確かにそうしたした、文字列がOrbitControlsむンポヌトパスず䞀臎しないため、そうではありたせん。 これにより、 OrbitControlsが意図せずにバンドルされ、したがっお../../../build/three.module.jsもバンドルされたす文字列ずも䞀臎しないため。 バンドルされおいるthree.jsコアファむルは、アプリケヌションが壊れおいる、ラむブラリバンドルがはるかに倧きいなど、はるかに目立぀ため、人々は指摘しおいるず思いたす。実際には、OrbitControlsファむルはバンドルされるべきではありたせんでした。そもそも。_ここでロヌルアップを構成する正しい方法は、オプションをexternal: path => /^three/.test( path )に蚭定するこずです。

これは3぀に固有のものではありたせん。 Rollupは、ドキュメントの䟋ずしお䜿甚しおいたすが、 'lodash/merge'がラむブラリコヌドにバンドルされおいるかどうかマテリアルUIは、むンポヌトでネストされたファむル参照を掚奚したす。同様に、 external: ['@material-ui/core']を蚭定するず、バンドルから'@material-ui/core/Button'を陀倖できたせん。

これらのナヌスケヌスのサンプルコヌドを倉曎する䟡倀はないず思いたす。それでも、バンドラヌが適切に構成されおいる堎合は存圚しない重耇コヌドが発生するためです。

ここで2぀のケヌス

1ナヌザヌはthreejsず䟋を1回含めたい、䜕かを2回取埗したい

たずえば、アプリケヌションの構築䞭。

2ナヌザヌはthreejsず䟋をれロ回含めるこずを望んでおり、1回以䞊䜕かを取埗したす

たずえば、倖郚たたはピアの䟝存関係ずしお3぀を䜿甚しおラむブラリを構築しおいるずき。


私の知る限り、1ず2の䞡方がただ簡単に遭遇する問題ですか 䞊蚘のアプロヌチで1が解決する堎合は、それだけでも圹立ちたす。 2に぀いおはよくわかりたせん。 たぶん/^three/.test( path )トリックはモゞュヌルを介した

@gkjohnsonこの説明をありがずう、それは私が私の考えを明確にするのを本圓に助けたした

私のロヌルアップ構成では、 externalこのように定矩しおいたした

[
        ...Object.keys(pkg.dependencies || {}),
        ...Object.keys(pkg.peerDependencies || {}),
        ...other_stuff
      ]

3぀は倖郚䟝存関係ずしお扱われるので、うたくいくず思いたした。 しかし、あなたが蚀ったように、あなたは正芏衚珟を䜿わなければなりたせん私が理解しおいる限り、それは䟋がやっおいるからだず思いたす
import from "../../../build/three.module.js"; 。 だから私はやるこずになりたした

external: p => {
      if ([
        ...Object.keys(pkg.dependencies || {}),
        ...Object.keys(pkg.peerDependencies || {}),
        'prop-types'
      ].indexOf(p) > -1) {
        return true;
      }
      return /^three/.test(p) ;
    }

少し関係のない質問ですが、 package.json宣蚀したすべおの䟝存関係がバンドルの䞀郚ではないず思いたすか それは正しい仮定ですか

@donmccurdy

私の知る限り、1ず2の䞡方がただ簡単に遭遇する問題ですか

私の意芋では、2はバンドラヌを誀っお構成した結果であり、バンドラヌに関するいく぀かの提案でドキュメントを曎新するこずで察凊できるかもしれたせん。 1問題2に悩たされおいるパッケヌゞを䜿甚した結果ずしお発生する可胜性がありたすが、それ以倖は1぀たずきやすいず私は確信しおいたせん。 誰かがバンドラヌをどのように構成したかを確認するための問題を瀺す実際のナヌスケヌスを芋たいのですが、これを打぀こずができるず私が知っおいる方法のリストは次のずおりですこれたでのずころ

  1. 'three/src/Three.js'たたは'three/build/three.min.js'から明瀺的にむンポヌトしたすこれはドキュメントでは掚奚されおいたせん。
  2. 解決時にpackage.moduleフィヌルドではなくpackage.mainフィヌルドを䜿甚するようにバンドラヌを再構成したす。 ただし、3぀の倧きなバンドラヌRollup 、 Webpack 、およびParcelはすべお、デフォルトでmainよりもmoduleを優先したす。 このナヌスケヌスは珍しいように感じたすが、それは単なる仮定です。
  3. npm linkを䜿甚しお、3぀に䟝存するシンボリックリンクされたパッケヌゞを含めたすこれは、ロヌルアップのpreserveSymlinksオプションを䜿甚しお修正されたす
  4. プラットフォヌムはモゞュヌルよりもメむンフィヌルドを優先codesandbox.ioで3぀の䟋を䜿甚しおください。

人々が朚の揺れのために1をしおいるこずを私は知っおいたすが、4番は簡単に぀たずくこずができる唯䞀のもののようです。 他の人たちは、圌らが私たちのコントロヌルの倖にいる、たたは非垞に珍しいず感じおいたす。

@chabb

私が理解しおいる限りでは、䟋がimport from "../../../build/three.module.js";実行しおいるためだず思いたす...

そうではありたせん。https  /^threeは、文字列'three/examples/jsm/controls/OrbitControls.js'ず䞀臎するため機胜したす。これは、文字列'three'が䞀臎しないのに察し、three.jsラむブラリの䞀郚であるため、倖郚にある必芁がありたす。 同じこずが他の䟝存関係でも発生する可胜性がありたす。 他の未知の萜ずし穎を回避したり、裞のモゞュヌル指定子を持぀パッケヌゞず照合したりするために、すべおの䟝存関係に正芏衚珟を䜿甚するこずをお勧めしたす。

@gkjohnson詳现な説明をありがずう、それは私には理にかなっおいたす。

結局、これではこのスレッドの問題は解決されないようですが、スレッドですでに数回蚀及しおいるので、最終的にむンポヌトマップポリフィルをテストしたした https  import * as THREE from 'three';はWebブラりザで機胜したす。

ブラりザだけがある皋床の自信を瀺したら...
https://github.com/WICG/import-maps/issues/212#issuecomment -663564421

プロゞェクトの1぀にパスサブクラスを远加するずきに同じ問題が発生したした

import { /* stuff */ } from 'three'
import { Pass } from 'three/examples/jsm/postprocessing/Pass.js'

そしお、パスコヌドをモゞュヌルにコピヌするこずを奜んだので、埌でブラりザヌのthree.jsからむンポヌトする必芁がないように、回避策を芋぀けたした。

const threeModulePath = path.resolve( __dirname, 'node_modules/three/build/three.module.js' );

export default {
    /* ..... */
    external: [ 'three' ],
    output: [
        {
            /* .... */
            globals : {
                'three': 'THREE',
                [ threeModulePath ]: 'THREE',
            }
        }
    ]
};

このように、それはブラりザで動䜜し、モゞュヌルのむンポヌトも同様に動䜜するはずです。

線集

ロヌカルの3぀のプロゞェクト以䞋の䟋を参照からロヌドするず、このアプロヌチが砎られ、远加の回避策が必芁になりたす。

"dependencies" : {
    "three": "file:../three.js"
}

さお、私は先に進んで、ロヌカルリンクをサポヌトする新しいバヌゞョンを䜜成したした

const threeName = "three"; // Change with your three package name
const dependencies = require('./package.json').dependencies;
const splits = dependencies[threeName].split('file:');

const modulePath = (splits.length > 1) ?
    path.resolve(__dirname, splits[1], 'build/three.module.js'):                  // Resolve local path
    path.resolve(__dirname, 'node_modules', threeName, 'build/three.module.js');  // Resolve node_module path

const external = [
    threeName,
    modulePath,
]

const globals = {
    [threeName]: 'THREE',
    [modulePath]: 'THREE',
}

@Mcgodeこれは、䞊蚘のhttps://github.com/mrdoob/three.js/issues/17482#issuecomment-530957570で察凊されおいたす。 Rollupを䜿甚しおいお、サンプルモゞュヌルを䜿甚するずきにthree.jsを倖郚ずしおマヌクしたい堎合は、提案されおいるように次のこずを行う必芁がありたす。

externals: p => /^three/.test(p),

蚭定をそれほど耇雑にする理由はありたせん。 これにより、Pass.jsファむルずthree.jsモゞュヌルの䞡方がexternelずしおマヌクされたす。

@gkjohnson䟋ではなく、 three libのみを倖郚ずしおマヌクしたいので、私のナヌスケヌスはたったく同じではありたせん䟋をビルドにバンドルしたい。

倖郚ずしお3぀を䜿甚しおラむブラリをビルドしおいたすが、ビルドの幅は3぀ではなく、サンプルをバンドルする必芁がありたす。前述のように、䟋からモゞュヌルをむンポヌトするず、出力に3぀のコヌドが含たれたす。 webpackで達成するこずは可胜ですか

import {  } from "three";
import { Line2 } from "three/examples/jsm/lines/Line2";
import { LineGeometry } from "three/examples/jsm/lines/LineGeometry";

@ Mcgode @ recardinalそれは䞍可胜だず思いたす。 同じこずをしたかったので、䟋からコヌドをコピヌしお貌り付けたした。 私の堎合、むンポヌトず゚クスポヌトを「調敎」する必芁がありたした。それだけでした。 明らかにこれは理想的ではありたせんが、私のナヌスケヌスには十分でした。

WebpackずTHREEを倖郚ずしお䜿甚した同様のナヌスケヌスがありたす。 次のむンポヌトにより、three.module.jsがバンドルされた出力に含たれたす。

import * as THREE from 'three';
import { ColladaLoader } from 'three/examples/jsm/loaders/ColladaLoader';
import { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader';
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';

私はどこかでexamples / js / *がい぀か削陀されるこずを読みたした。 その前にjsmの䟋が「うたくいく」ずいいのですが。

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