three/examples/jsm/.../<module>
์์ ๊ฐ์ ธ์ค๋ฉด ๋ฒ๋ค๋ฌ(๋กค์
์ผ๋ก ํ
์คํธ๋จ)๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ ๋ฒ(๋๋ ์ฌ๋ฌ ๋ฒ) ํฌํจํฉ๋๋ค.
์๋ฅผ ๋ค์ด 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
)์ ์ฃผ์ ์ง์
์ ์ ๋ํ ๋ณ์นญ์์ ๋กค์
์ ์๋ฆด ์ ์์ด์ผ ํฉ๋๋ค.
(๋กค์ ์ผ๋ก ํ ์คํธ)
๋กค์ ์ผ๋ก ํ์ธํ ์ ์์ต๋๋ค. ๋ค์ ํ๋ก์ ํธ ์ค์ ๊ณผ ๊ฐ์ด ํ๋ฉด ๋ชจ๋ ๊ฒ์ด ์์๋๋ก ์๋ํฉ๋๋ค.
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 import ๋ฅผ ์ฃผ์ ์ฒ๋ฆฌํ ๋ค์ ๋ค์ ๋น๋ํ์ฌ ์๋ํด ๋ณผ ์ ์์ต๋๋ค(๊ทธ๋ฌ๋ 'three'
๋ฅผ ์ธ๋ถ ์ข
์์ฑ์ผ๋ก ์ฌ์ฉ).
์ด๊ฒ์ #17220๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค. ์ ์๋ ์๋ฃจ์
์ค ํ๋๋ package.json
์ main
ํ๋๋ฅผ ๋ชจ๋ ๋น๋ ๊ฒฝ๋ก๋ก ๋ฐ๊พธ๋ ๊ฒ์ด์ง๋ง ์ด ์ฌ์ฉ ์ฌ๋ก๋ ์์ ๋์ง ์์ต๋๋ค.
์ฌ๊ธฐ์ ๋ฌธ์ ๋ฅผ ๋ช
ํํ ํ๊ธฐ ์ํด ../../../build/three.module.js
๋ํ ํ๋ ์ฐธ์กฐ๋ฅผ ํฌ์ฐฉํ์ง ์๋ ๋กค์
๊ตฌ์ฑ์ 3๊ฐ์ ์์กดํ๋ ๋ณ๋์ ํจํค์ง๋ฅผ ๋น๋ํ๊ธฐ ์ํด three
๊ฐ ์ธ๋ถ๋ก ํ์๋๋ ๋์ ๋น๋์ ํฌํจํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์ ํ์ผ์ ๋น๋ํ๋ฉด ์ค์๋ก 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 ์ฝ๋.
์ด๊ฒ์ ์ฅ๊ธฐ ๋๋ ์ต์์ ์๋ฃจ์
์ผ๋ก ์ ์ํ๋ ค๋ ๊ฒ์ ์๋์ง๋ง OrbitControls
(๋ฐ ์ธ ํด๋์ ๋ชจ๋ ํ์ผ)์ ์ธ๋ถ๋ก ํ์ํ๋๋ก ๊ตฌ์ฑ์ ๋ณ๊ฒฝํ๋ฉด ๋ ๊ฒฝ์ฐ ๋ชจ๋์์ ์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค.
export default {
// ...
external: p => /^three/.test(p),
// ...
};
์ด๊ฒ์ ์ฅ๊ธฐ์ ๋๋ ์ต์์ ์๋ฃจ์ ์ผ๋ก ์ ์ํ๋ ค๋ ๊ฒ์ ์๋์ง๋ง OrbitControls(๋ฐ ์ธ ํด๋์ ๋ชจ๋ ํ์ผ)๋ฅผ ์ธ๋ถ๋ก ํ์ํ๋๋ก ๊ตฌ์ฑ์ ๋ณ๊ฒฝํ๋ฉด ๋ ๊ฒฝ์ฐ ๋ชจ๋์์ ์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค.
์ด๋ค ์ด์ ๋ก ๋กค์
์ด ๊ธฐ๋ณธ์ ์ผ๋ก '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 ๋๋ ์ฝ๋ ์กฐ๊ฐ์ด "3"์์ ๊ฐ์ ธ์จ ๋ค์ ๋ค์ ์ค๋จ๋๊ธฐ ๋๋ฌธ์ ์คํ ๊ฐ๋ฅํ์ง ์์ต๋๋ค. 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๋ฅผ ๋ ๋ฒ ๋ก๋ํฉ๋๋ค. ํ ๋ฒ์ CDN์์, ํ ๋ฒ์ threejs.org์์ ๋ก๋ํฉ๋๋ค.
๋ชจ๋์ด 3๊ฐ์ ํจ๊ป ์ฌ์ฉ๋์ด์ผ ํ๋ ๋ฐฉ์์ด ์๋ ์๋ ์์ง๋ง 106๊ฐ ์ด์ ๋ถํฐ 1000๊ฐ์ ์ฌ์ดํธ์ ์์ ๊ฐ ์์ต๋๋ค.
<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>
๋ชจ๋ ์์ ๋ ๋น๋(๋ฒ๋ค๋ง) ๋์ ๋ผ์ด๋ธ ๋ชจ๋์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๋ฏ๋ก ์ด๋ค ์๋ฏธ์์๋ ์์ ์ฒ๋ผ three.js๋ฅผ ์ฌ์ฉํ๋ ์ค์ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ฃผ์ง ์์ต๋๋ค. ์ฆ, ์ด์ ์์ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ํ์ต๋๋ค. ์ ์์ ๋ AFAIK๊ฐ ์๋๋๋ค. ์์ ๊ฐ ์๋ํ๋ ค๋ฉด ์์ ์์ JavaScript๋ฅผ ์ถ์ถํ๊ณ ๋ณ๋์ .js ํ์ผ์ ๋ฃ์ ๋ค์ three.js๋ฅผ ๋ก์ปฌ๋ก(์๋ง๋ npm์ ํตํด) ๋ฃ์ด์ผ ํฉ๋๋ค. ํจํค์ง ๊ธฐ๋ฐ ๊ฒฝ๋ก(../.././build ์์)๊ฐ ๋๋๋ก ์์ ์ ๋ชจ๋ ๊ฒฝ๋ก๋ฅผ ์์ ํ๊ณ ๋ง์ง๋ง์ผ๋ก ๋กค์ ์ ์ฌ์ฉํฉ๋๋ค.
๊ฒฝ๋ก๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ๋ ๋น ๋ชจ๋ ๋ฒ์ ์์ ๊ฝค ํฐ ๋ณํ์ ๋๋ค.
@mrdoob
@adrian-delgado์ ์๋ ๊ตฌ์ฑ์ผ๋ก three.js๋ ํ ๋ฒ ํฌํจ๋๊ณ ๊ถค๋ ์ ์ด๋ ํ ๋ฒ ํฌํจ๋๋ฉฐ ํจํค์ง๋ ์ธ๋ถ๋ก ํ์๋์ง ์์ต๋๋ค. ๋ด๊ฐ ์ ์ํ ๊ตฌ์ฑ์๋ ์์ฑ๋ ๋ฒ๋ค์ three/build/three.module.js
๋ฐ three/examples/jsm/controls/OrbitControls.js
์ ๋ํ ์ธ๋ถ ์ข
์์ฑ์ด ์์ต๋๋ค.
@EliasHasle
์ฌ์ฉ์๊ฐ ๋ฒ๋ค์ "3" ์ธ์คํด์ค์ OrbitControls๋ฅผ ํฌํจํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น?
๊ทธ๋ฐ ๋ค์ external
ํ๋๋ ์ ์ธ๋์ด์ผ ํ๋ฉฐ ์ด ๊ฒฝ์ฐ 3๊ฐ์ ๋จ์ผ ์ฌ๋ณธ๊ณผ ๊ถค๋ ์ ์ด๊ฐ ๋ฒ๋ค์ ํฌํจ๋ฉ๋๋ค. rollup-plugin-node-resolve (๋ชจ๋ ํ์ธ์ ์ง์ํ๋ ๋กค์
์ ํ์ํ๋ฉฐ ์์ ๊ตฌ์ฑ์์ ์ฌ์ฉ๋จ)๋ ๊ธฐ๋ณธ์ ์ผ๋ก package.json์ ๋ชจ๋ ํ๋๋ฅผ ์ฌ์ฉํ๋๋ก ์ค์ ๋์ด ์์ต๋๋ค( mainFields
์ต์
์ฐธ์กฐ). ์ธ ์ฐธ์กฐ๋ฅผ ์ ์ดํ๊ณ "three"๋ ๋์ผํ ์คํฌ๋ฆฝํธ๋ก ํด์๋ฉ๋๋ค. _ mainFields
๊ฐ ["main", "module"]
mainFields
๋ก ๋ณ๊ฒฝ๋์ด package.json_์์ "module" ๋์ "main"์ด ์ฌ์ฉ๋๋ฉด 3๊ฐ์ ๋ณต์ฌ๋ณธ์ด ์ฌ๊ธฐ์ ํฌํจ๋๊ณ ๋ฌธ์ ๊ฐ ์ด์ ๋ฐฉ์์ผ๋ก ์ค๋จ๋ฉ๋๋ค. ์์ ์ธ๊ธํ. ๊ทธ๋ฌ๋ ํด๋น ํ๋๋ฅผ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ "main"์ด ์ฌ์ฉ๋๋ฉด rollup์ ๊ธฐ๋ณธ์ ์ผ๋ก require๋ฅผ ์ฌ์ฉํ๋ commonjs ํ์ผ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ rollup -plugin-commonjs ๋ ํ์ํ ์ ์์ต๋๋ค.
@๊ทธ๋ ๊ทธ๋ง
๋ถํํ๋ ๋๋ ์ด ๊ฒฝ์ฐ์ ์์งํ ๋ชจ๋ ๊ต์ฒด๊ฐ ๊ทธ๋ ๊ฒ ์ฝ๊ฒ ์๋ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์ ์๋ ์๋ฃจ์ ์ค ์ด๋ ๊ฒ๋ ์ด ๊ฒฝ์ฐ๋ฅผ ๋ค๋ฃจ์ง ์์ผ๋ฉฐ ๋ณ๋์ ํธ์คํธ์์ ํต์ฌ ์คํฌ๋ฆฝํธ์ ์์ ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ๋ฅผ ๋๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๊ณต์์ ์ธ ๊ฒ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ฐ์ ธ์ค๊ธฐ ์ง๋ ๋ ๋ด๊ฐ ์๋ ํ ์ด๊ฒ์ ๋๊ธฐ ์ํด ์์ ์ค์ธ ์ ์ผํ ๊ฒ์ ๋๋ค. ์์ ์ ์ธ ๊ฐ ๋ชจ๋ ๋์ผํ ํธ์คํธ์์ ๊ฐ์ ธ์จ ๊ฒฝ์ฐ ์ธ ๊ฐ์ ๋ณต์ฌ๋ณธ ํ๋๋ง ๋ก๋๋ฉ๋๋ค.
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';
์ฌ์ฉ ์ฌ๋ก์ ๋ฐ๋ผ ํด๋์ ์คํฌ๋ฆฝํธ ํ๊ทธ๋ฅผ ๊ณ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๋์๊น์?
@๊ทธ๋ ๊ทธ๋ง
๋ชจ๋์ ์ด๋ ๊ฒ ๋ผ์ด๋ธ๋ก ์ฌ์ฉํ๋ ค๊ณ ํ๋ฉด ๋น์ทํ ์ผ์ด ๋ฐ์ํ๋์ง ํ์คํ์ง ์์ต๋๋ค.
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๊ฐ ์ ๋ฒ์ ์ ํธ์ํ ๋๋ง๋ค ์ค๋จ๋๋ฏ๋ก ์๋ํ์ง ์์ต๋๋ค.
example/js ํด๋๋ฅผ CDN์ ํธ์ํ๊ณ ์์ ์ฝ๋์์ URL์ ์์ ํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ฌ์ ํ ์๋ํ๋๋ก 3๊ฐ๋ฅผ ํธ์ํ ์ ์์ต๋๊น? ์ด๋ 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์ ๋ชจ๋์ ์ ํฉํ์ง ์๋ค๊ณ ์ธ๊ธํ์ต๋๋ค(๋ณ๊ฒฝ๋์ง ์๋ ํ)
@๊ทธ๋ ๊ทธ๋ง
์ด์ ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ ์์ ์์ค๋ฅผ ๋ณด๊ณ jsfiddle/codepen ๋ฑ์ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ๊ณ ์คํฌ๋ฆฝํธ ํ๊ทธ์ ๊ฒฝ๋ก๋ฅผ ์์ ํ๋ฉด ์คํ๋ ์ ์์์ต๋๋ค.
๋ ๋ค ํธ์ด์ผ. ๋ชจ๋์ ์ต์
์ ๋ถ๋ถ์ ๋ ์ด์ ์์ ์ ์ฝ์์์ camera
๋๋ renderer
์ก์ธ์คํ ์ ์๋ค๋ ๊ฒ์
๋๋ค ๐
unpkg๋ฅผ ์ฌ์ฉํด ๋ณผ๊น์?
unpkg๋ฅผ ์ฌ์ฉํด ๋ณผ๊น์?
๋ชจ๋์ ํตํด ๊ฐ์ ธ์ค๊ธฐ ํ์ด์ง์ ๊ฐ์ ๋ฌธ์์์ ์ฌ์ฉํ๊ธฐ ์์ํ์ต๋๊น? ์๋๋ฉด ํ๋ก์ ํธ์์ ์ฌ์ฉํ๊ธฐ ์์ํ์ต๋๊น?
๋ชจ๋์ ์ต์ ์ ๋ถ๋ถ์ ๋ ์ด์ ์์ ์ ์ฝ์์์ ์นด๋ฉ๋ผ ๋๋ ๋ ๋๋ฌ์ ์ก์ธ์คํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
๋ค, ๋ต๋ตํฉ๋๋ค. ๋๋ ๋ก์ปฌ์์ ๊ฐ๋ฐํ ๋ ์ด๊ฒ์ (๋๋ ์ด์ ์ ์ฌํ) ์์ ์ ๋์ก์ต๋๋ค.
Object.assign( window, { camera, renderer, scene } );
๊ทธ๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ๊ฐ๋ฐ ๋๊ตฌ ํ์ฅ์ผ๋ก ํด๊ฒฐํ๊ณ ์ ํ๋ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค.
๋ช ๊ฐ์ง ์กฐ์ฌ๋ฅผ ์ทจํ ๊ฒ์ ๋๋ค,ํ์ง๋ง ์ฐ๋ฆฌ๋ ์ถ๊ฐ ๊ธฐ๊บผ์ด ๊ฒฝ์ฐ ... ์ฌ๋ฏธ์์ ์์๋ ํ๋ ๊ฐ์ ์์ด๋์ด ์์ ๋งต polyfill์ ๋๋ ์ฐ๋ฆฌ๊ฐ ์์ ์ ํ ์ ์๋ค๊ณ ์๊ฐ, ๋ชจ๋ ์์ ๋ 100 % ๋ณต์ฌ / npm-์ ํธํ์ด ๋ถ์ฌ ์ฌ์ฉ ๋ฐ ๋ฒ๋ค๋ฌ ๊ธฐ๋ฐ ์ํฌํ๋ก. ์๋ฅผ ๋ค์ด:
<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/ ์ https://unpkg.com/[email protected]/ ?
unpkg๊ฐ ์ฌ๊ธฐ์ ๋ ผ์ํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
๋ค, ๋ต๋ตํฉ๋๋ค. ๋๋ ๋ก์ปฌ์์ ๊ฐ๋ฐํ ๋ ์ด๊ฒ์ (๋๋ ์ด์ ์ ์ฌํ) ์์ ์ ๋์ก์ต๋๋ค.
Object.assign( window, { camera, renderer, scene } );
์ผ์ ! ใ
๊ทธ๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ๊ฐ๋ฐ ๋๊ตฌ ํ์ฅ์ผ๋ก ํด๊ฒฐํ๊ณ ์ ํ๋ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค.
์! ๐ค
@๊ทธ๋ ๊ทธ๋ง
๋ชจ๋์ ์ด๋ ๊ฒ ๋ผ์ด๋ธ๋ก ์ฌ์ฉํ๋ ค๊ณ ํ๋ฉด ๋น์ทํ ์ผ์ด ๋ฐ์ํ๋์ง ํ์คํ์ง ์์ต๋๋ค.
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
์ฐพ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ๋ฉ์ฌ๋ฅผ ๋ ๋๋งํ์ง ์์์ต๋๋ค. ๋ค๋ฅธ ๋ชจ๋ ๊ฒ์ ์๋ํ์ง๋ง ๐ถ
์ด๊ฑฐ ๊ฝค ํธํธํ๋ค...
์ต์ํด์ง ์ผ๋ง ๋จ์ ๊ฒ ๊ฐ์์. ์ด์ ์ดํด๊ฐ ๋๋๊น ์ง๊ธ ์ํ๊ฐ ๊ด์ฐฎ๋ค๊ณ ์๊ฐํฉ๋๋ค.
BTW ์ ๋ threejsfundamentals๋ฅผ ๋ชจ๋ esm ๊ธฐ๋ฐ์ผ๋ก ์ ๋ฐ์ดํธํ์ต๋๋ค. ๐ค
๊ทธ๋๋ three.module.min.js
๊ฐ ์์ผ๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค(๋๋ three.min.module.js
๐).
+1
ES6 ๋ชจ๋๋ก 3๊ฐ์ & ๊ถค๋ ์ปจํธ๋กค์ ๊ฐ์ ธ์ค๊ณ ์์ต๋๋ค. ๊ถค๋ ์ปจํธ๋กค์ด ๋น๋ ํด๋ ๋ด์์ 3๊ฐ๋ฅผ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์ ๊ฒฝ๋ก๋ฅผ ํ์ ํ๋ ๋ฐ ์๊ฐ์ด ์ข ๊ฑธ๋ ธ์ต๋๋ค.
์ํผ ํฌ ์ฐ๋ฆฌ๋ 3๊ฐ๋ฅผ ๋ชจ๋๋ก ์ฌ์ฉํ ์ ์์ง๋ง ์ด๊ฒ์ ๋ํด ๋ ๋ง์ ์ ์ฐ์ฑ์ ๊ฐ๋ ๊ฒ์ด ์ข์ ๊ฒ์ ๋๋ค. ๋ค๋ฅธ ๋ชจ๋๋ ๋ง์ฐฌ๊ฐ์ง๋ผ๊ณ ๊ฐ์ ํ๊ณ ๊ถค๋ ์ ์ด ํ์ผ๋ก ์ด๋ํ์ฌ ์๋ง์ด ๋๊ธฐ ์์ํ์ง ์์ ๊ฒ์ ๋๋ค.
๋ํ three.min.module.js์ ๊ฒฝ์ฐ +1 ๐
# 18239์์ ์ด๋, ๋๋ ์ํํ์ฌ ๊ฑฐ๊ธฐ์ ๋น์ทํ ๋ฌธ์ ๋ฅผ ์กํ npm link
๋ค๋ฅธ ํจํค์ง ๊ทธ ์ฌ์ฉ์ three.js๋ฅผ์.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ด ๋ ์ ์๋ ํ๋ฌ๊ทธ์ธ 3๋ถํ ๋๊ตฌ ๋ฅผ ๊ฐ๋ฐํ์ต๋๋ค.
๋๋ ๊ฐ์ ๋ฌธ์ ์ ์ง๋ฉด ํด์๋ค. three.js๋ฅผ ์ฌ์ฉํ์ฌ React ๊ตฌ์ฑ ์์๋ฅผ ์์ฑ ์ค์ด๋ฉฐ ์์ ์์ ์ผ๋ถ ๋ชจ๋์ ๊ฐ์ ธ์ค๊ณ ์์ต๋๋ค. ๋กค์ ๊ณผ ํจ๊ป ๋ฒ๋ค๋ก ์ ๊ณต๋๋ฉด ๋ฒ๋ค์ ๋ณด๋ฉด 3๊ฐ์ ๋ํ 1๊ฐ์ import ๋ฌธ์ด ์๊ณ ๊ทธ ๋ค์ Three.js ์ฝ๋๊ฐ ์์์ ์ ์ ์์ต๋๋ค.
๋ด ๊ตฌ์ฑ ์์์์ ์ด import ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ: import * as THREE from "three/build/three.module"
์ผ์ด ์ ๋๋ก ์๋ํ์ง๋ง Three๊ฐ ๋ฒ๋ค์ ํฌํจ๋์ด ์๋๋ฐ, ์ด๋ ๋ด๊ฐ ์ํ์ง ์๋ ๊ฒ์
๋๋ค.
3๊ฐ์ ๋ํ ์์
๋ช
์ธ์๋ฅผ ๊ฐ๊ณ ์ถ์ต๋๋ค. import * as THREE from "three
๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฒ๋ค์ 3๊ฐ๋ฅผ ๋ชจ๋๋ก ๊ฐ์ ธ์ค์ง๋ง ์์ ์ค ํ๋๋ฅผ ์ฌ์ฉํ์๋ง์ three.js๊ฐ ๋ฒ๋ค์ ์ถ๊ฐ๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ 3)์ ์ฝ๋๋ก ์ธํด ๊ถ๊ทน์ ์ผ๋ก ๋ด ์ฝ๋๊ฐ ์์๋ฉ๋๋ค.
@chabb
three.js๋ฅผ ์ฌ์ฉํ์ฌ React ๊ตฌ์ฑ ์์๋ฅผ ์์ฑ ์ค์ด๋ฉฐ ์์ ์์ ์ผ๋ถ ๋ชจ๋์ ๊ฐ์ ธ์ค๊ณ ์์ต๋๋ค. ๋กค์ ๊ณผ ํจ๊ป ๋ฒ๋ค๋ก ์ ๊ณต๋๋ฉด ๋ฒ๋ค์ ๋ณด๋ฉด 3๊ฐ์ ๋ํ 1๊ฐ์ import ๋ฌธ์ด ์๊ณ ๊ทธ ๋ค์ Three.js ์ฝ๋๊ฐ ์์์ ์ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ ๊ฒ์๋ ์๋ฃจ์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ํฉ๋๋ค: https://github.com/mrdoob/three.js/issues/17482#issuecomment -530957570.
๋๋ ์ด๋ฌํ ๋ฌธ์ ์ ๋๋ถ๋ถ์ด ๊ทธ๋ค์ ๋ฒ๋ค๋ฌ(์ดํดํ ์ ์์)์์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์์ ํ ์ดํดํ์ง ๋ชปํ๋ ์ฌ๋๋ค๋ก๋ถํฐ ํ์๋๋ค๊ณ ์๊ฐํ์ง๋ง ์ด๋ฌํ ๋ฌธ์ ๋ ์ธ ๊ฐ์ง์๋ง ๊ตญํ๋์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ค์๋ก 3๊ฐ์ ์ฝ์ด๋ฅผ ์ด์ค์ผ๋ก ๊ฐ์ ธ์ค๋ ๊ฒ์ด ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ณด๋ค ๋ ๋์ ๋ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. lodash, ๋ฐ์ ๊ตฌ์ฑ ์์ ๋๋ OrbitControls์ ๊ฐ์ ์ธ๋ถ์ฉ ์ข ์์ฑ์ ๋ฒ๋ค๋งํ๋ ๊ฒ์ ๋ ์ฝ๊ฒ ๋์น ์ ์์ต๋๋ค.
์ธ๋ถ ํจํค์ง์ ๋ฐ๋ผ Rollup์ ์ด ๋์์ ๋ฌธ์ํํ๊ณ ์ฌ๊ธฐ ์ ์ต์ ์ ์ ๊ณตํ๋ฉฐ Webpack์ ์ฌ๊ธฐ์ ์ ์ฌํ ์ต์ ์ ์ ๊ณต
๋ฒ๋ค๋ฌ์ ๊ฒฝ์ฐ ์๋ง๋ ๋ต์ ๋ฌธ์ํํ๊ฑฐ๋ ๋ฌธ์ ํด๊ฒฐ ๊ฐ์ด๋๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๋ชจ๋์ ํตํด ๊ฐ์ ธ์ค๊ธฐ ํ์ด์ง ์์ ๊ณตํต ๋ฒ๋ค๋ฌ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋งํฌ์ผ ๊ฒ์ ๋๋ค.
examples/jsm
ํจํค์ง๊ฐ ์ด ํจํด์ ๋ณ๊ฒฝํ ์ ์๋ค๋ฉด...
// <strong i="7">@file</strong> GLTFLoader.js
// Before
import { Mesh } from '../../build/three.module.js';
// After
import { Mesh } from 'three';
... ์ด๋ฌํ ๋ฌธ์ ๋ ํจ์ฌ ์ฝ๊ฒ ํด๊ฒฐํ ์ ์์ต๋๋ค. ๋ถํํ๋ ๋ณต์กํ ๋น๋ ์ค์ ์์ด threejs ์น ์ฌ์ดํธ ๋ด์์ HTML ์์ ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. threejs ์น์ฌ์ดํธ์ ๊ฐ์ ธ์ค๊ธฐ ๋งต ํด๋ฆฌํ๋ก ํด๊ฒฐํ ์ ์์ง๋ง ํ์คํ์ง ์์ต๋๋ค. :/
์์ ํ์ผ์ด ๋์ "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๋ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ ๋ฒ ๊ฐ์ ธ์ค์ง ์์ต๋๋ค.
์ฌ๋๋ค์ external: [ 'three' ]
์ต์
์ด ์ด ๋์์ ๋ฌ์ฑํ๊ธฐ๋ฅผ ๊ธฐ๋ํ์ง๋ง(์ ๋ ํ์คํ ๊ทธ๋ฌ์ต๋๋ค) ๋ฌธ์์ด์ด OrbitControls ๊ฐ์ ธ์ค๊ธฐ ๊ฒฝ๋ก์ ์ผ์นํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ์ง ์์ต๋๋ค. ๊ทธ ๊ฒฐ๊ณผ OrbitControls
๊ฐ ์๋์น ์๊ฒ ๋ฒ๋ค๋์ด ../../../build/three.module.js
๋ ํจ๊ป ๋ฒ๋ค๋ฉ๋๋ค(๋ฌธ์์ด๊ณผ ์ผ์นํ์ง ์๊ธฐ ๋๋ฌธ์). ์ฌ๋๋ค์ด ๋ฒ๋ค๋ก ์ ๊ณต๋๋ three.js ํต์ฌ ํ์ผ์ ๊ฐ๋ฆฌํค๋ ์ด์ ๋ ์ ํ๋ฆฌ์ผ์ด์
์ค๋จ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฒ๋ค์ด ํจ์ฌ ๋ ํฐ ๋ฑ์ ํจ์ฌ ๋ ๋์ ๋๊ธฐ ๋๋ฌธ์
๋๋ค. ์ฌ๊ธฐ์ ํ์ค์ _OrbitControls ํ์ผ์ด ๋ฒ๋ค๋ก ์ ๊ณต๋์ด์๋ ์ ๋๋ค๋ ๊ฒ์
๋๋ค. ์ฒซ ๋ฒ์งธ ์ฅ์._ ์ฌ๊ธฐ์ Rollup์ ๊ตฌ์ฑํ๋ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ ์ต์
์ external: path => /^three/.test( path )
๋ก ์ค์ ํ๋ ๊ฒ์
๋๋ค.
์ด๋ 3๋ช
์๊ฒ๋ง ๊ตญํ๋ ๊ฒ์ด ์๋๋ค. Rollup ์ ๋ฌธ์์์ ์ฌ์ฉ ํ์ง๋ง 'lodash/merge'
๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ๋์ ๋ฒ๋ค๋ก ํฌํจ๋์ด ์๋์ง ํ์ธํ๊ธฐ ์ด๋ ต๊ฑฐ๋ ๋ถ๊ฐ๋ฅํ ๊ฒ์
๋๋ค. ๋๋ฌด ์์์ ์ค๋ณต ๊ฐ์ ธ์ค๊ธฐ ๋ฒ๊ทธ๋ฅผ ์ผ์ผํค์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๋จธํฐ๋ฆฌ์ผ UI ๋ ๊ฐ์ ธ์ค๊ธฐ์์ ์ค์ฒฉ๋ ํ์ผ ์ฐธ์กฐ๋ฅผ ๊ถ์ฅํ๋ฉฐ ๋ง์ฐฌ๊ฐ์ง๋ก external: ['@material-ui/core']
์ค์ ์ ๋ฒ๋ค์์ '@material-ui/core/Button'
๋ฅผ ์ ์ธํ์ง ๋ชปํฉ๋๋ค.
์ด๋ฌํ ์ฌ์ฉ ์ฌ๋ก์ ๋ํ ์์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๋ฒ๋ค๋ฌ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑ๋์ด ์์ผ๋ฉด ์กด์ฌํ์ง ์์ ์ค๋ณต ์ฝ๋๊ฐ ๊ณ์ ์์ฑ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ฌ๊ธฐ์ ๋ ๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
(1) ์ฌ์ฉ์๋ threejs์ ์์ ๊ฐ ํ ๋ฒ ํฌํจ๋๊ธฐ๋ฅผ ์ํ๊ณ ๋ฌด์ธ๊ฐ๋ฅผ ๋ ๋ฒ ์ป์ต๋๋ค.
์๋ฅผ ๋ค์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ๋ ๋์.
(2) ์ฌ์ฉ์๋ threejs์ ์์ ๊ฐ 0๋ฒ ํฌํจ๋๊ธฐ๋ฅผ ์ํ๊ณ 1๋ฒ ์ด์ ๋ฌด์ธ๊ฐ๋ฅผ ์ป์ต๋๋ค.
์๋ฅผ ๋ค์ด ์ธ๋ถ ๋๋ ํผ์ด ์ข ์์ฑ์ผ๋ก 3๊ฐ๊ฐ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋น๋ํ๋ ๋์.
๋ด๊ฐ ์๋ ํ (1)๊ณผ (2)๋ ์ฌ์ ํ ๊ฑธ๋ ค ๋์ด์ง๊ธฐ ์ฌ์ด ๋ฌธ์ ์
๋๊น? ์์ ์ ๊ทผ ๋ฐฉ์์ผ๋ก (1)์ด ํด๊ฒฐ๋๋ฉด ๊ทธ๊ฒ๋ง์ผ๋ก๋ ๋์์ด ๋ฉ๋๋ค. (2)๋ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์๋ง๋ /^three/.test( path )
ํธ๋ฆญ์ด ๋ชจ๋์ ํตํ ๊ฐ์ ธ์ค๊ธฐ์ ์ธ๊ธ๋์ด์ผ ํฉ๋๊น?
@gkjohnson ์ค๋ช ๊ฐ์ฌํฉ๋๋ค. ๋ด ์๊ฐ์ ๋ช ํํํ๋ ๋ฐ ์ ๋ง ๋์์ด๋์์ต๋๋ค.
๋ด ๋กค์
๊ตฌ์ฑ์์ external
์ด๋ฐ ์์ผ๋ก ์ ์ํ์ต๋๋ค.
[
...Object.keys(pkg.dependencies || {}),
...Object.keys(pkg.peerDependencies || {}),
...other_stuff
]
์ธ ๊ฐ์ง๊ฐ ์ธ๋ถ ์ข
์์ฑ์ผ๋ก ์ทจ๊ธ๋๋ฏ๋ก ์๋ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋น์ ์ด ์ธ๊ธํ๋ฏ์ด ์ ๊ท์์ ์ฌ์ฉํด์ผํฉ๋๋ค (๋ด๊ฐ ์ดํดํ๋ ํ ์๊ฐ ์ํํ๊ธฐ ๋๋ฌธ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
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)์ด ๊ฑธ๋ ค ๋์ด์ง๊ธฐ ์ฝ์ต๋๋ค. ๋๊ตฐ๊ฐ๊ฐ ์์ ์ ๋ฒ๋ค๋ฌ๋ฅผ ๊ตฌ์ฑํ ๋ฐฉ๋ฒ์ ํ์ธํ๊ธฐ ์ํด ๋ฌธ์ ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ค์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ณด๊ณ ์ถ์ง๋ง ์ฌ๊ธฐ์ (์ง๊ธ๊น์ง) ํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ชฉ๋ก์ด ์์ต๋๋ค.
'three/src/Three.js'
๋๋ 'three/build/three.min.js'
์์ ๋ช
์์ ์ผ๋ก ๊ฐ์ ธ์ต๋๋ค(๋ฌธ์์์๋ ๊ถ์ฅํ์ง ์์).package.module
ํ๋๊ฐ ์๋ package.main
ํ๋๋ฅผ ์ฌ์ฉํ๋๋ก ๋ฒ๋ค๋ฌ๋ฅผ ์ฌ๊ตฌ์ฑํ์ญ์์ค. ๊ทธ๋ฌ๋ ์ธ ๊ฐ์ง ํฐ ๋ฒ๋ค๋ฌ์ธ Rollup , Webpack ๋ฐ Parcel์ ๋ชจ๋ ๊ธฐ๋ณธ์ ์ผ๋ก main
๋ณด๋ค module
๋ฅผ ์ ํธํฉ๋๋ค. ์ด ์ฌ์ฉ ์ฌ๋ก๋ ๋๋ฌผ์ง๋ง ๊ฐ์ ์ผ ๋ฟ์
๋๋ค.npm link
๋ฅผ ์ฌ์ฉํ์ฌ ์ธ ๊ฐ์ง์ ์์กดํ๋ ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ ํจํค์ง๋ฅผ ํฌํจํฉ๋๋ค(๋กค์
์ preserveSymlinks
์ต์
์ ์ฌ์ฉํ์ฌ ์์ ๋จ).์ฌ๋๋ค์ด ๋๋ฌด ํ๋ค๊ธฐ๋ฅผ ์ํด 1์ ํ๊ณ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์ซ์ 4๋ ์ฝ๊ฒ ๊ฑธ๋ ค ๋์ด์ง ์ ์๋ ์ ์ผํ ๊ฒ ๊ฐ์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋๋ค์ ์์ ์ด ํต์ ํ ์ ์๊ฑฐ๋ ๋งค์ฐ ๋๋ฌผ๋ค๊ณ ๋๋๋๋ค.
@chabb
๋ด๊ฐ ์ดํดํ๋ ํ, ์์ ๊ฐ
import from "../../../build/three.module.js";
ํ๊ณ ์๊ธฐ ๋๋ฌธ์ธ ๊ฒ ๊ฐ์ต๋๋ค ...
์ด๊ฒ์ ๋ด๊ฐ ์ค๋ช
ํ ๋ด์ฉ์ด ์๋๋๋ค: https://github.com/mrdoob/three.js/issues/17482#issuecomment -583694493. /^three
๋ 'three/examples/jsm/controls/OrbitControls.js'
๋ฌธ์์ด๊ณผ ์ผ์นํ๊ธฐ ๋๋ฌธ์ ์๋ํฉ๋๋ค. 'three'
๋ฌธ์์ด์ ๊ทธ๋ ์ง ์์ ๋ฐ๋ฉด three.js ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ผ๋ถ์ด๊ธฐ ๋๋ฌธ์ ์ธ๋ถ์ฌ์ผ ํฉ๋๋ค. ๋ค๋ฅธ ์ข
์์ฑ์์๋ ๋์ผํ ์ผ์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ ์ ์๋ ํจ์ ์ ํผํ๊ฑฐ๋ ๋ฒ ์ด ๋ชจ๋ ์ง์ ์๊ฐ ์๋ ํจํค์ง์ ์ผ์น์ํค๊ธฐ ์ํด ๋ชจ๋ ์ข
์์ฑ์ ๋ํด ์ ๊ท์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
@gkjohnson ์์ธํ ์ค๋ช ๊ฐ์ฌํฉ๋๋ค. ์ดํด๊ฐ ๋ฉ๋๋ค.
์ด๊ฒ์ ๊ฒฐ๊ตญ ์ด ์ค๋ ๋์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํ๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฌ์ง๋ง ์ค๋ ๋์์ ์ด๋ฏธ ๋ช ๋ฒ ์ธ๊ธํ๊ธฐ ๋๋ฌธ์ ๋ง์นจ๋ด ๊ฐ์ ธ์ค๊ธฐ ๋งต ํด๋ฆฌํ์ ํ
์คํธํ์ต๋๋ค. https://github.com/KhronosGroup/ KTX-Software/pull/172/files. ํด๋น ํด๋ฆฌํ์ ์ฌ์ฉํ๋ฉด ์น ๋ธ๋ผ์ฐ์ ์์ import * as THREE from 'three';
์๋ํฉ๋๋ค.
๋ธ๋ผ์ฐ์ ๋ง ์ฝ๊ฐ์ ์์ ๊ฐ์ ๋ณด์๋ค๋ฉด...
https://github.com/WICG/import-maps/issues/212#issuecomment -663564421
๋ด ํ๋ก์ ํธ ์ค ํ๋์ ํต๊ณผ ํ์ ํด๋์ค๋ฅผ ์ถ๊ฐํ ๋ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
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์์ ํด๊ฒฐ๋์์ต๋๋ค. ๋กค์ ์ ์ฌ์ฉ ์ค์ด๊ณ ์์ ๋ชจ๋์ ์ฌ์ฉํ ๋ 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 ์์ ๊ฐ "๊ทธ๋ฅ ์๋"ํ๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ต์ํด์ง ์ผ๋ง ๋จ์ ๊ฒ ๊ฐ์์. ์ด์ ์ดํด๊ฐ ๋๋๊น ์ง๊ธ ์ํ๊ฐ ๊ด์ฐฎ๋ค๊ณ ์๊ฐํฉ๋๋ค.
BTW ์ ๋ threejsfundamentals๋ฅผ ๋ชจ๋ esm ๊ธฐ๋ฐ์ผ๋ก ์ ๋ฐ์ดํธํ์ต๋๋ค. ๐ค