Three.js: three.js์šฉ Google ํด๋กœ์ € ์ปดํŒŒ์ผ๋Ÿฌ "externs" ํŒŒ์ผ?

์— ๋งŒ๋“  2011๋…„ 07์›” 10์ผ  ยท  61์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: mrdoob/three.js

์•ˆ๋…•ํ•˜์„ธ์š”

three.js์— ๋Œ€ํ•œ externs ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚ด ๋ง์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

http://code.google.com/closure/compiler/docs/api-tutorial3.html#externs

๊ฐ์‚ฌ ํ•ด์š”
๋ ˆ๋ชจ

Question

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

ํ , ๋‚˜๋Š” ์—ฌ์ „ํžˆ ์ฝ”๋“œ์— ์ˆ˜๋งŽ์€ ์ฃผ์„์ด ์žˆ๋Š” ๊ฒƒ์— ๋งŒ์กฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋•Œ๋•Œ๋กœ ๋‚˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ TypeScript ์™€ ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ํฌํŒ…ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์ง€ ์•Š์€์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  61 ๋Œ“๊ธ€

์•„๋‹ˆ์š”, three.js์—๋Š” ์™ธ๋ถ€ ์ข…์†์„ฑ์ด ์—†์œผ๋ฏ€๋กœ ์ง€๊ธˆ๊นŒ์ง€ ์ด์™€ ๊ฐ™์€ ๊ฒƒ์ด ํ•„์š”ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋‚˜๋„ ์•Œ์•„, ํ•˜์ง€๋งŒ ์ปดํŒŒ์ผ ๊ฐ€๋Šฅํ•œ ํ™˜๊ฒฝ์—์„œ THREE.js๋ฅผ ํ†ตํ•ฉํ•˜๋Š” ๊ฒƒ์ด ์ž์ฒด ํ”„๋กœ์ ํŠธ์—์„œ๋„ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌํ•œ ํŒŒ์ผ์€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ์Šต๋‹ˆ๊นŒ? ๊ณต์œ ํ•œ ๋งํฌ์— ์ด๋ฏธ ์„ค๋ช…๋˜์–ด ์žˆ๋‹ค๋ฉด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ํŽ˜์ด์ง€๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์„œ(ํ…์ŠคํŠธ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์Œ) ์ฝ๊ณ /์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@mrdoob , ๋‹ค์Œ์—์„œ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

http://code.google.com/p/closure-compiler/source/browse/#svn %2Ftrunk%2Fexterns

๋˜๋Š”

http://code.google.com/p/closure-compiler/source/browse/#svn %2Ftrunk%2Fcontrib%2Fexterns

๋‹ค์Œ ์‚ฌํ•ญ๋„ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

http://code.google.com/closure/compiler/docs/js-for-compiler.html

๋Œ“๊ธ€/ํ—ค๋”? ์ฝ”๋“œ๋ฅผ ์ฝ๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค ๊ฒƒ ๊ฐ™์€๋ฐ...

์˜ˆ, ํ•˜์ง€๋งŒ ์ „์ฒด ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ์ด extern ํŒŒ์ผ์—๋งŒ ํ•ด๋‹น๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋‚˜ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ•„์ˆ˜๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

http://www.dotnetwise.com/Code/Externs/index.html ๋กœ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Three.js์—์„œ๋Š” ์™„์ „ํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ •์˜๊ฐ€ ์ถ”์ถœ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

๋ธ”๋กœ๊ทธ ํ•ญ๋ชฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

http://blog.dotnetwise.com/2009/11/closure-compiler-externs-extractor.html

this.method = function(){} ํŒจํ„ด์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ํ”„๋กœํ† ํƒ€์ž…์€ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค...

@mrdoob , ํด๋กœ์ € ์ปดํŒŒ์ผ๋Ÿฌ ๊ณ ๊ธ‰ ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์žˆ๋Š” ์ž์ฒด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— THREE.js๋ฅผ ํ†ตํ•ฉํ•˜๊ธฐ ์œ„ํ•œ ๊ถŒ์žฅ ์‚ฌํ•ญ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ํ˜„์žฌ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ด ์‚ฌ์‹ค์ž…๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ์•„๋Š” ํ•œ ๊ณ ๊ธ‰ ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ์‚ฌ์šฉ ์ค‘์ธ ํด๋ž˜์Šค๋งŒ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋งž๋‚˜์š”? ์ด๋ก ์ ์œผ๋กœ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค... ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

three.js๋กœ ๊ณ ๊ธ‰ ์ตœ์ ํ™”๋ฅผ ์‹œ๋„ํ•˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ ์ฝ”๋“œ๋ฅผ ๊นจ๋Š” ๋ฐ ์‚ฌ์šฉํ•œ ๋‹ค๋ฅธ ๊ฒƒ๋“ค์„ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ "์•ˆ์ „"ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋‹จ์ˆœ ์ตœ์ ํ™”์—์„œ๋Š” ํ•ญ์ƒ ์ž‘๋™ํ•˜์ง€๋งŒ ๊ณ ๊ธ‰์—์„œ๋Š” ๋•Œ๋•Œ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ปดํŒŒ์ผํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๊นจ์ง€์ง€๋งŒ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ(๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ํฌํ•จ๋จ)์œผ๋กœ์„œ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ฃ ?

@mrdoob ์ด ์ปดํŒŒ์ผ๋œ(์ตœ์ ํ™”๋œ) ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ชจ๋“  ํด๋ž˜์Šค์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•˜๋Š” "externs" ํŒŒ์ผ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ ์—†์ด๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ three.js์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ๋‹ค๋ฅธ ๋„๊ตฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚ด three.js ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๋‚œ๋…ํ™”(์ถ”ํ•œ)ํ•˜๋ ค๋ฉด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ•œ ํ›„๋ณด๋Š” https://github.com/mishoo/UglifyJS ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

Google ํด๋กœ์ € externs๋Š” ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ „์ฒด ๊ฐœ์ฒด๋ฅผ ์„ค๋ช…ํ•˜๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.
์ด ํŒŒ์ผ์ด ์—†์œผ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ•จ์ˆ˜ ์ด๋ฆ„์—์„œ a() ๋˜๋Š” b()์™€ ๊ฐ™์€ ๊ฒƒ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ์€ JQuery์šฉ์ž…๋‹ˆ๋‹ค. http://code.google.com/p/closure-compiler/source/browse/trunk/contrib/externs/jquery-1.7.js

externs๊ฐ€ three.js๋ฅผ ์œ„ํ•œ ๊ฒƒ์ด๋ผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ดœ์ฐฎ์ง€๋งŒ ์Šค์Šค๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@yurikor , node.js๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ node-browserify์™€ uglify-js๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์•„๋ฌด๊ฒƒ๋„ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@remo ์กฐ์–ธ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์‹œ๋„ํ•ด ๋ณผ๊ฒŒ.

์ด ๋ฌธ์ œ๋Š” ์ž ์‹œ ๋™์•ˆ ๋น„ํ™œ์„ฑํ™”๋˜์—ˆ์ง€๋งŒ ๋‚˜์ค‘์— ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์ •๋ณด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ ๋‚ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ๋Š” ์ถฉ๋ถ„ํ•œ threejs ๋‚ด๋ณด๋‚ด๊ธฐ๊ฐ€ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ํŒŒ์ผ ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ํด๋กœ์ € ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ชจ๋“  ์œ ํ˜•์„ ํ™•์ธํ•˜๊ณ  ๋‚ด ์ฝ”๋“œ์—์„œ ๋ช‡ ๊ฐ€์ง€ ๋ฒ„๊ทธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ์œ ์šฉํ•œ ์œ ํ˜• ์ฃผ์„์ด ํ•จ๊ป˜ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์„ ์ˆ˜๋™์œผ๋กœ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ฃผ๋กœ ๋ฒ„๊ทธ ๊ฒ€์‚ฌ๋ฅผ ์œ„ํ•ด ํด๋กœ์ € ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ์ถ•์†Œ๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋œ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ ์•ˆ์ „ํ•œ uglifyjs ๋ฅผ ์‚ฌ์šฉ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ํด๋กœ์ € ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋‚ด ๊ณต์šฉ ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐํ˜ธ์˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ์ค„์˜ ์ฝ”๋“œ ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ blah.xyz ๋ฅผ ํ†ตํ•ด ์•ก์„ธ์Šคํ•œ ๋ชจ๋“  ์†์„ฑ์˜ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜์ง€๋งŒ blah["xyz"] ๋ฅผ ํ†ตํ•ด ์•ก์„ธ์Šคํ•œ ์†์„ฑ์€ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ window['ColladaLoader2'] = ColladaLoader2 ๋ผ์ธ ์€ ํด๋กœ์ € ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์ด ํด๋ž˜์Šค๋ฅผ ์ „์—ญ ๋ฒ”์œ„๋กœ ๋‚ด๋ณด๋‚ด์•ผ ํ•จ์„ ์•Œ๋ฆฌ๋Š” ๋ฐ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ํ”„๋กœ๋•์…˜์— ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฒ„๊ทธ ๊ฒ€์‚ฌ๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ž˜์š”
extern ํŒŒ์ผ์„ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ์‹คํ–‰ ์ข…๋ฃŒ
์ ๊ทน์ ์ธ ์ตœ์ ํ™”๊ฐ€ ์—†์œผ๋ฉด extern ํŒŒ์ผ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ๋‚ด๊ฐ€ ๋ฏฟ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒ€์ฆ ๋˜๋Š” ์•„๋งˆ๋„ ๋ชจ๋“ 
ํ™•์ธ. ์•„๋งˆ๋„ ๋‹น์‹ ์€ ๋ช…ํ™•ํžˆ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด ์ „ํ™”์—์„œ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ๋ฒ•๊ณผ ๊ฐ„๊ฒฐํ•จ์„ ์œ ๊ฐ์Šค๋Ÿฝ๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
2013๋…„ 2์›” 12์ผ ์˜ค์ „ 5์‹œ 19๋ถ„์— "Robert Carnecky" [email protected]์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์ž ์‹œ ๋™์•ˆ ๋น„ํ™œ์„ฑํ™”๋˜์—ˆ์ง€๋งŒ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์›ํ•˜๋Š” ๊ฒฝ์šฐ
ํ–ฅํ›„ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์ •๋ณด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ ๋‚ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ๋Š” ์ถฉ๋ถ„ํ•œ threejs ๋‚ด๋ณด๋‚ด๊ธฐ๊ฐ€ ํฌํ•จ๋œ ๊ฐ„๋‹จํ•œ ํŒŒ์ผ( https://github.com/crobi/ColladaAnimationCompress/blob/master/threejs-exports.js) ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์˜จ๋‹ค
ํด๋กœ์ €๋ฅผ ํ™œ์„ฑํ™”ํ•  ๋•Œ ๋งค์šฐ ์œ ์šฉํ•œ ์œ ํ˜• ์ฃผ์„ ํฌํ•จ
์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์œ ํ˜•์„ ํ™•์ธํ•˜๊ณ  ๋‚ด ์ฝ”๋“œ์—์„œ ๋ช‡ ๊ฐ€์ง€ ๋ฒ„๊ทธ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฐ€์ง€๊ณ ์žˆ๋‹ค
์ด ํŒŒ์ผ์„ ์ˆ˜๋™์œผ๋กœ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ฃผ๋กœ ๋ฒ„๊ทธ์— ํด๋กœ์ € ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
ํ™•์ธ, ์‹ค์ œ ์ถ•์†Œ๋ฅผ ์œ„ํ•ด ๋œ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ ์•ˆ์ „ํ•œ ๊ฒƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
uglifyjs https://github.com/mishoo/UglifyJS.

๋˜ํ•œ ํด๋กœ์ € ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋‚ด ๊ณต์šฉ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด
๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ช‡ ์ค„์˜ ์ฝ”๋“œ ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค
ํด๋กœ์ € ์ปดํŒŒ์ผ๋Ÿฌ๋Š” blah.xyz๋ฅผ ํ†ตํ•ด ์•ก์„ธ์Šค๋˜๋Š” ๋ชจ๋“  ์†์„ฑ์˜ ์ด๋ฆ„์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ blah["xyz"]๋ฅผ ํ†ตํ•ด ์•ก์„ธ์Šค๋˜๋Š” ์†์„ฑ์€ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ https://github.com/crobi/ColladaAnimationCompress/blob/366344d3aa5dbbc0a53c47a2c1759b86bb1e0fcd/ColladaLoader2.coffee#L3383 ์ฐฝ['ColladaLoader2']
= ColladaLoader2(๋ฌธ์ž์—ด ์‚ฌ์šฉ์— ๋‹ค์‹œ ์ฃผ์˜)๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ด ํด๋ž˜์Šค๋ฅผ ์ „์—ญ ๋ฒ”์œ„๋กœ ๋‚ด๋ณด๋‚ด์•ผ ํ•˜๋Š” ํด๋กœ์ € ์ปดํŒŒ์ผ๋Ÿฌ.

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ Gi tHubhttps://github.com/mrdoob/three.js/issues/341#issuecomment -13426131์—์„œ ํ™•์ธํ•˜์„ธ์š”.

๋‚ด๊ฐ€ ์•„๋Š” ํ•œ ๋‹จ์ˆœ ๋ชจ๋“œ ๋Š” ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ „ํ˜€ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ง€์—ญ ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ๊ณ  ์•Œ ์ˆ˜ ์—†๋Š” ๊ธฐํ˜ธ๋ฅผ ๋งŒ๋‚˜๋ฉด ์ „์—ญ ๋ณ€์ˆ˜๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๊ทธ๋Œ€๋กœ ๋‘ก๋‹ˆ๋‹ค.

๊ณ ๊ธ‰ ๋ชจ๋“œ ๋Š” ๊ฐ•๋ ฅํ•œ ํ˜•์‹์˜ ์–ธ์–ด์—์„œ ์ปดํŒŒ์ผ๋Ÿฌ์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค(ํ˜•์‹ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •): ์•Œ ์ˆ˜ ์—†๋Š” ํ•จ์ˆ˜ ๋˜๋Š” ์†์„ฑ์— ๋Œ€ํ•ด ๊ฒฝ๊ณ ํ•˜๊ณ  ์ž˜๋ชป๋œ ์ˆ˜์˜ ์ธ์ˆ˜๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ์ˆ˜๊ฐ€ ์˜ˆ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹จ์ˆœ ๋ชจ๋“œ๋Š” ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

function fn() {
    var foo = {}; // local variable, safe to rename this
    foo.bar();    // undefined property, will crash here
}
fn();

์–ด๋–ค ๊ฒฝ๊ณ ๋„ ์—†์ด

function fn(){({}).bar()}fn();

({}).bar() ์—์„œ ๋ถ„๋ช…ํžˆ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค. ๊ณ ๊ธ‰ ๋ชจ๋“œ๋Š” ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

({}).a(); // fn() inlined, private member 'bar' renamed to 'a'

์—ฌ์ „ํžˆ ์ถฉ๋Œํ•˜์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ฒฝ๊ณ ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Property bar never defined on foo at line 3 character 0.
  • ๋ฐœ๊ฒฌ๋œ ๋ฒ„๊ทธ ํด๋กœ์ €๋Š” ํ•จ์ˆ˜ ์ด๋ฆ„์— ์˜คํƒ€๊ฐ€ ์žˆ๊ฑฐ๋‚˜ x, y ๋ฐ z ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ์„ธ ๊ฐœ์˜ ๊ฐœ๋ณ„ ์ˆซ์ž ๋Œ€์‹  ํ•˜๋‚˜์˜ THREE.Vector3 ๋ฅผ Matrix4.makeTranslation ์ „๋‹ฌํ•œ ๋ฒ„๊ทธ ์œ ํ˜•์ด์—ˆ์Šต๋‹ˆ๋‹ค
  • ์ „์ฒด ํ…Œ์ŠคํŠธ ๋ฒ”์œ„๊ฐ€ ์žˆ์—ˆ๋‹ค๋ฉด(๋‚˜๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Œ) ์กฐ๋งŒ๊ฐ„ ํ•ด๋‹น ๋ฒ„๊ทธ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ฆ‰์‹œ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์œผ๋ฉด ๋””๋ฒ„๊ทธํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • threejs๊ฐ€ ๊ฐ ์ƒˆ ๋ฆด๋ฆฌ์Šค์™€ ํ•จ๊ป˜ ์ตœ์‹  ๋‚ด๋ณด๋‚ด๊ธฐ ํŒŒ์ผ์„ ์ œ๊ณตํ–ˆ๋‹ค๋ฉด(์œ ์ง€ ๊ด€๋ฆฌ์— ์—„์ฒญ๋‚œ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•จ) ํด๋กœ์ € ์ปดํŒŒ์ผ๋Ÿฌ๋Š” API ๋ณ€๊ฒฝ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ํฌ์ฐฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค( Matrix4.makeTranslation ์˜ ๊ฒฝ์šฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€).
  • ํด๋กœ์ € ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์€ ์ž๋ฐ” ๋Ÿฐํƒ€์ž„์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์—๊ฒŒ ๋„ˆ๋ฌด ๋งŽ์€ ์ž‘์—…์ž…๋‹ˆ๋‹ค. ๋‚ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋‹ค๋ฅธ ๋ชจ๋“  ๋„๊ตฌ๋Š” ๋…ธ๋“œ/์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” ํ˜„์žฌ THREE.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํด๋กœ์ € ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ†ตํ•ฉํ•˜๊ธฐ ์œ„ํ•ด ํด๋กœ์ € ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ externs.js ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ์ฐพ์œผ๋ ค๋Š” ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๋ชจ๋“  THREE.js ํด๋ž˜์Šค์™€ ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ๊ตฌํ˜„ํ•˜๋Š” ํ”„๋กœํ† ํƒ€์ž… ๋ฉ”์„œ๋“œ์˜ ๋ชฉ๋ก์ด ์–ด๋”˜๊ฐ€์— ์žˆ์Šต๋‹ˆ๊นŒ? ๋ชฉ๋ก์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

THREE.ํ…์Šค์ฒ˜
THREE.Texture.constructor
THREE.Texture.clone
THREE.Texture.dispose
THREE.DataTexture.clone

(๋“ฑ๋“ฑ...)

Ps- Three.js๋Š” ํ›Œ๋ฅญํ•˜์ง€๋งŒ ์ ์ ˆํ•œ jsDocs๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด ๋ชฉ๋ก์„ ์‰ฝ๊ฒŒ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :)

์—ฌ๊ธฐ ์— three.js ๋‚ด๋ณด๋‚ด๊ธฐ์˜ ๋ถ€๋ถ„ ๊ตฌํ˜„์ด

@crobi : ์™œ ๊ฑฐ๊ธฐ์— ๋ฌธ์„œ ์ฃผ์„์„ ๋„ฃ์—ˆ์Šต๋‹ˆ๊นŒ? ์•„๋ฌด๋ž˜๋„ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฌ๊ณ  ๊ทธ๋Ÿด ํ•„์š”๊ฐ€ ์—†์„ ๊ฒƒ ๊ฐ™๊ธด ํ•œ๋ฐ...

@taoeffect : ์ฃผ์„์€ ๋Œ€๋ถ€๋ถ„ ํด๋กœ์ € ์ปดํŒŒ์ผ๋Ÿฌ ๊ณ ๊ธ‰ ๋ชจ๋“œ์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฐ•๋ ฅํ•œ ํ˜•์‹์˜ ์ฝ”๋“œ๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

@crobi , ์˜ค ๋Œ“๊ธ€๋กœ ์ธํ•ด ๊ฐ•์ œ ์ž…๋ ฅ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ? ๋ฉ‹์ง€๋„ค์š”.

ํด๋กœ์ € ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ํ˜• ์˜ค๋ฅ˜๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ. typescript ์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ์ฃผ์„์ด ๋‹ฌ๋ฆฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ผ๋ฐ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ „์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปดํŒŒ์ผ ํƒ€์ž„ ๊ฒ€์‚ฌ ์ „์šฉ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์žˆ๋Š” ํด๋กœ์ €์˜ ๊ณ ๊ธ‰ ์ตœ์ ํ™” ๋ชจ๋“œ์— ๋Œ€ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ์˜๊ฒฌ์€ ์ •ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ http://www.dotnetwise.com/Code/Externs/์— ๋Œ€ํ•œ ํด๋กœ์ € extern์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

๋˜ํ•œ ๋‹จ์ˆœํžˆ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  three.js๋ฅผ ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค๋ฉด ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

--language_in=ECMASCRIPT5

์ด์— ๋Œ€ํ•œ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ค‘์š”ํ•œ ์˜ˆ ๋ฐ Google Closure๋ฅผ ํ†ตํ•ด ์‹คํ–‰ํ•˜๋Š”์ง€ ํ™•์ธ
์ตœ์ ํ™”๊ฐ€ ์ž˜ ๋œ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ฐจ์ด๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
-๋ฒค

2014๋…„ 1์›” 13์ผ ์›”์š”์ผ ์˜คํ›„ 12์‹œ 31๋ถ„, Rodrigo Formigone <
[email protected]>์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ฝ”๋“œ ์ž…๋ ฅ์œผ๋กœ three.js๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค๋ฉด
๋‹จ์ˆœํžˆ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

--language_in=ECMASCRIPT5

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ Gi tHubhttps://github.com/mrdoob/three.js/issues/341#issuecomment -32191167์—์„œ ํ™•์ธํ•˜์„ธ์š”.
.

์นœ์• ํ•˜๋Š”,
๋ฒค ํœด์Šคํ„ด
์Œ์„ฑ: 613-762-4113 ์Šค์นด์ดํ”„: ben.exocortex ํŠธ์œ„ํ„ฐ: @exocortexcom
http://Clara.io - ์ „๋ฌธ๊ฐ€๊ธ‰ WebGL ๊ธฐ๋ฐ˜ 3D ์ฝ˜ํ…์ธ  ์ œ์ž‘

๊ทธ๋Ÿฐ ๊ธ€์„ ์“ธ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์š”. ๊ทธ๋Ÿฌ๋‚˜ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด (externs ํŒŒ์ผ์˜ ์œ ๋ฌด์— ๊ด€๊ณ„์—†์ด) ํด๋กœ์ €๋ฅผ ํ†ตํ•ด Three.js๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋Š” ์ด์œ ๋Š” ๋ฐ˜๋“œ์‹œ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋งŒ์„ ์œ„ํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ํด๋กœ์ €๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ JavaScript(ํŠนํžˆ ๋งค์šฐ ํฐ ์ฝ”๋“œ ๊ธฐ๋ฐ˜)์—์„œ ์œ ์ง€ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๋ชฉํ‘œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ JavaScript๋ฅผ "ํ”ผํ•˜๋Š”" ๊ฒƒ์ด ์•„๋‹ˆ๋ผ(GWT ๋˜๋Š” ๊ธฐํƒ€ ์œ ์‚ฌํ•œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ) JavaScript๋ฅผ "๊ธธ๋“ค์ธ"(๊ธฐ๋ณธ JS ์ž‘์„ฑ)์„ ๋•๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ Three.js๋ฅผ Closure ํ”„๋กœ์ ํŠธ์˜ ์ผ๋ถ€๋กœ ์ปดํŒŒ์ผํ•˜๋ ค๊ณ  ํ•˜๋ฉด Three.js๊ฐ€ ์ผ๋ถ€ ํ‘œ์ค€์„ ์ค€์ˆ˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์†Œ๋ฆฌ๋ฅผ ์ง€๋ฅด๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(JSDoc์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€๊ฐ€์š”?). --language_in ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ˜„์žฌ๋กœ์„œ๋Š” ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ์ž์‹ ์˜ JS ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜๊ณ  ์‹ถ์ง€๋งŒ Three.js๋ฅผ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ฐธ์กฐํ•˜๋ ค๋Š” ๊ฒฝ์šฐ(๋”ฐ๋ผ์„œ Three.js์˜ ๋ชจ๋“  ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ์ตœ์ ํ™”ํ•˜์ง€ ์•Š์€ ์ฑ„๋กœ ๋‘๋Š” ๊ฒฝ์šฐ) ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ externs ํŒŒ์ผ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. externs ํŒŒ์ผ์ด ์—†์œผ๋ฉด Closure๋Š” THREE.*๊ฐ€ ์–ด๋””์—๋„ ์„ ์–ธ๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

Closure ํ”„๋กœ์ ํŠธ์—์„œ Three.js๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ์ž‘์„ฑํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ Google Closure ๋„๊ตฌ์— ๋Œ€ํ•œ ์ตœ๊ณ ์˜ ์†Œ๊ฐœ ํ”„๋ ˆ์  ํ…Œ์ด์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. (Google I/O 2011์—์„œ) https://www.youtube.com/watch?v=M3uWx-fhjUc (๊ธด ๋น„๋””์˜ค๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๋ชฉ์ ์ด ๋ฌด์—‡์ธ์ง€, ๋‹ค๋ฅธ ์ปดํŒŒ์ผ ๋ชจ๋“œ๊ฐ€ ์‹ค์ œ๋กœ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ๋ถ„๋ช…ํžˆ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. extern ํŒŒ์ผ์ด ํ•„์š”ํ•œ ์ด์œ ).

์•ˆ๋…•ํ•˜์„ธ์š”, three.js๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ADVANCED_OPTIMIZATIONS ์˜ต์…˜ ์ง€์›์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ๋“œ ์ฝ”๋“œ ์ œ๊ฑฐ๋Š” ์ž„๋ฒ ๋”ฉ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด Three.js ๊ธฐ๋Šฅ์˜ ์ผ๋ถ€๋งŒ ์‚ฌ์šฉํ•  ๋•Œ ๊ฐ•๋ ฅํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ three.js๋Š” "three.min.js๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค!"๋กœ ์ œํ•œ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๋‹จ์ผ ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณ ์ „์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์ง€๋งŒ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ JavaScript ์ตœ์†Œํ™” ํ”„๋กœ๊ทธ๋žจ์ด ์ฝ”๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜ ์ด๋ฆ„ ์ถ•์†Œ(์งง์€ ๋ณ€์ˆ˜ ์ด๋ฆ„์—๋Š” ํšจ๊ณผ์ ์ด์ง€ ์•Š์Œ), ๊ณต๋ฐฑ ์ œ๊ฑฐ(๋“ค์—ฌ์“ฐ๊ธฐ ๊ณต๋ฐฑ, ํƒญ ๋ฐ ์ค„ ๋ฐ”๊ฟˆ์—๋งŒ ์œ ํšจ) ๋ฐ ๊ธฐํƒ€ ์ €๋ ดํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

"Closure ์ปดํŒŒ์ผ๋Ÿฌ ์Šคํƒ€์ผ" ์ฝ”๋“œ์— ADVANCED_OPTIMIZATIONS ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„ ํฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๊ฐ€์ค‘์น˜๋ฅผ ์ฃผ๋Š” ์ „์ฒด "ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ"๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Closure ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์™€ ๊ฐ™์€ ์ปค์กŒ์ง€ ๋งŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์ž์™€ ๊ฐœ๋ฐœ์ž๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๊ฐ€ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์ œ๊ฑฐ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๊ด€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

three.js๋Š” ์ด๋ฏธ ๊ฐ์ฒด ์ง€ํ–ฅ ์Šคํƒ€์ผ๋กœ ์ž‘์„ฑ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด ์ฝ”๋“œ๋ฅผ "ํด๋กœ์ € ์ปดํŒŒ์ผ๋Ÿฌ ์Šคํƒ€์ผ" ์ฝ”๋“œ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์ด (๊ธฐ์ˆ ์ ์œผ๋กœ) ์–ด๋ ต์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ฑฑ์ •ํ•˜๋Š” ๊ฒƒ๋“ค...

  • ํด๋กœ์ € ์ปดํŒŒ์ผ๋Ÿฌ ์Šคํƒ€์ผ์—๋Š” ๊ฐ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ฃผ์„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ทธ๋“ค ์ค‘ ๋ˆ„๊ตฌ๋„ ์—†์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ๊ฐœ๋ฐœ๋œ ๋ชจ๋“  ๊ธฐ๋Šฅ์— ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ์–ผ๋งˆ๋‚˜ ๊ฑธ๋ฆฝ๋‹ˆ๊นŒ?
  • ํด๋กœ์ € ์ปดํŒŒ์ผ๋Ÿฌ์—๋Š” ์—„๊ฒฉํ•œ ์œ ํ˜• ์ •์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. null ๋ฐ undefined์— ๋Œ€ํ•ด์„œ๋„ ์ ์ ˆํ•˜๊ฒŒ ์ž‘์—…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. "null-allowed" ๋งค๊ฐœ๋ณ€์ˆ˜, "undefined-allowed" ๋งค๊ฐœ๋ณ€์ˆ˜, ...
  • ADVANCED_OPTIMIZATIONS์— ์˜ํ•ด ์ปดํŒŒ์ผ๋œ "์ „์ฒด ๋ฒ„์ „ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ"๋ฅผ ์ค€๋น„ํ•˜๋ ค๋ฉด ์ ์ ˆํ•œ extern ํŒŒ์ผ์„ ์ค€๋น„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ด ์Šค์ผ€๋‘˜ ์†Œ๋ฅด,

์ด๊ฒƒ์€ ์ข‹์€ ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค. ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž‘์€ ์Šค๋‹ˆํŽซ์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
์ด๊ฒƒ์€ three.js์— ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๊ด€๋ จํ•˜์—ฌ,

๋žŒ์ˆœ๋‹ค๋ฅด ๋งˆ๋‹ค๋ฐ˜

2014๋…„ 6์›” 24์ผ ํ™”์š”์ผ ์˜คํ›„ 4:23 Schedul Xor [email protected]
์ผ๋‹ค:

์•ˆ๋…•ํ•˜์„ธ์š”, three.js๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ADVANCED_OPTIMIZATIONS ์˜ต์…˜ ์ง€์›์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ๋“œ ์ฝ”๋“œ ์ œ๊ฑฐ๋Š” ์ž„๋ฒ ๋”ฉ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋งŒ ์‚ฌ์šฉํ•  ๋•Œ ๊ฐ•๋ ฅํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
Three.js ํ•จ์ˆ˜์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ three.js๋Š” ๋ชจ๋“  ๋‹จ์ผ ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์˜๋„๋œ ์‚ฌ์šฉ์€ "3.min.js๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค!"๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ณ ์ „
์ ‘๊ทผ ๋ฐฉ์‹์€ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์ง€๋งŒ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ
JavaScript ์ตœ์†Œํ™” ํ”„๋กœ๊ทธ๋žจ์€ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์ถ•์†Œํ•ด์•ผ๋งŒ ์ฝ”๋“œ ํฌ๊ธฐ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
(์งง์€ ๋ณ€์ˆ˜ ์ด๋ฆ„์—๋Š” ์œ ํšจํ•˜์ง€ ์•Š์Œ), ๊ณต๋ฐฑ ์ œ๊ฑฐ(์œ ํšจ
๋“ค์—ฌ ์“ฐ๊ธฐ ๊ณต๋ฐฑ, ํƒญ ๋ฐ ์ค„ ๋ฐ”๊ฟˆ) ๋ฐ ๊ธฐํƒ€ ์ €๋ ดํ•œ ํŠธ๋ฆญ.

ADVANCED_OPTIMIZATIONS ์˜ต์…˜์„ "ํด๋กœ์ € ์ปดํŒŒ์ผ๋Ÿฌ ์Šคํƒ€์ผ"์— ์‚ฌ์šฉ
์ฝ”๋“œ์—์„œ ๋Œ€๋ถ€๋ถ„ ๊ฐ€์ค‘์น˜๋ฅผ ๋ถ€์—ฌํ•˜๋Š” "ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ" ์ „์ฒด๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋Œ€ํ˜• ๋„์„œ๊ด€. ํด๋กœ์ € ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
https://developers.google.com/closure/library/ ๊ฐ€ ์ปค์กŒ์ง€๋งŒ
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์ž์™€ ๊ฐœ๋ฐœ์ž๋Š” ๊ทธ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋Š” ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

three.js๋Š” ์ด๋ฏธ ๊ฐ์ฒด ์ง€ํ–ฅ ์Šคํƒ€์ผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฏ€๋กœ
(๊ธฐ์ˆ ์ ์œผ๋กœ) ์ „์ฒด ์ฝ”๋“œ๋ฅผ "ํด๋กœ์ € ์ปดํŒŒ์ผ๋Ÿฌ"๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
styled" ์ฝ”๋“œ. ๋‚ด๊ฐ€ ๊ฑฑ์ •ํ•˜๋Š” ๊ฒƒ์€...

  • ํด๋กœ์ € ์ปดํŒŒ์ผ๋Ÿฌ ์Šคํƒ€์ผ์—๋Š” ๊ฐ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ฃผ์„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
    ํ˜„์žฌ ๊ทธ๋“ค ์ค‘ ๋ˆ„๊ตฌ๋„ ์—†์Šต๋‹ˆ๋‹ค. ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ์–ผ๋งˆ๋‚˜ ๊ฑธ๋ฆฝ๋‹ˆ๊นŒ?
    ์ด์ œ๊นŒ์ง€ ๊ฐœ๋ฐœ๋œ ๋ชจ๋“  ๊ธฐ๋Šฅ์—?
  • ํด๋กœ์ € ์ปดํŒŒ์ผ๋Ÿฌ์—๋Š” ์—„๊ฒฉํ•œ ์œ ํ˜• ์ •์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. null์— ๋Œ€ํ•ด์„œ๋„
    ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—๊ฒŒ๋Š” ํž˜๋“  ์ผ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
    "null-allowed" ๋งค๊ฐœ๋ณ€์ˆ˜, "undefined-allowed"๊ฐ€ ์žˆ๋Š” ํ•จ์ˆ˜
    ๋งค๊ฐœ๋ณ€์ˆ˜, ...
  • ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์ ์ ˆํ•œ externs ํŒŒ์ผ์„ ์ค€๋น„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    ์— ์˜ํ•ด ์ปดํŒŒ์ผ๋œ "์ „์ฒด ๋ฒ„์ „ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ" ์ค€๋น„
    ADVANCED_OPTIMIZATIONS.

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/mrdoob/three.js/issues/341#issuecomment -46957189.

@schedul-xor ์šฐ๋ฆฌ๋Š” ํ™•์‹คํžˆ ๋„์›€์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค... ์ฝ”๋“œ ์ฃผ์„์ด ์‹ค์ œ๋กœ ํ•„์š”ํ•œ๊ฐ€์š” ์•„๋‹ˆ๋ฉด extern์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š”,

์ €๋Š” ์ด ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ์ฒ˜์Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๊ธฐ์—ฌํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๋ณ€๊ฒฝ.

๊ด€๋ จํ•˜์—ฌ,

๋žŒ์ˆœ๋‹ค๋ฅด ๋งˆ๋‹ค๋ฐ˜

2014๋…„ 6์›” 24์ผ ํ™”์š”์ผ ์˜คํ›„ 7์‹œ 23๋ถ„์— Mr.doob [email protected]์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

@schedul-xor https://github.com/schedul-xor ์šฐ๋ฆฌ๋Š” ํ™•์‹คํžˆ ๋„์›€์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค
๊ทธ๊ฒƒ์œผ๋กœ ... ์ฝ”๋“œ ์ฃผ์„์ด ์‹ค์ œ๋กœ ํ•„์š”ํ•œ์ง€ ์•„๋‹ˆ๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๊นŒ?
์™ธ๋ถ€์ธ?

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/mrdoob/three.js/issues/341#issuecomment -46973166.

๊ณ ๊ธ‰ ์ตœ์ ํ™”์—๋Š” ํŠน์ • ์ฝ”๋”ฉ ์Šคํƒ€์ผ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ฝ”๋“œ๊ฐ€ ์†์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด three.js๋Š” uniforms["diffuse"] ๋ฐ uniforms.diffuse ํ˜ผํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํด๋กœ์ € ๊ณ ๊ธ‰ ์ตœ์ ํ™”์—์„œ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. #3222๋„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋ชจ๋“  ๊ณณ์— ์—„๊ฒฉํ•œ ์œ ํ˜• ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์—„์ฒญ๋‚œ ์–‘์˜ ์ž‘์—…์ด๋ฉฐ ๋งŽ์€ ์ฃผ์„ ํ–‰์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค(์ œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ํ–‰ ์ˆ˜๊ฐ€ 2๋ฐฐ ์ฆ๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค).

๋‹ค๋ฅธ ์›น ํ”„๋ ˆ์ž„์›Œํฌ/์–ธ์–ด์— ๋Œ€ํ•œ extern ํŒŒ์ผ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

ํŠœํ† ๋ฆฌ์–ผ ์— ๋”ฐ๋ฅด๋ฉด, externs๋Š” ์ด๋ฆ„์„ ๋ฐ”๊พธ๊ณ  ์‹ถ์ง€ ์•Š์€ ๋ณ€์ˆ˜๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ณต๊ฒฉ์ ์ธ ๋ณ€์ˆ˜ ์ด๋ฆ„ ๋ณ€๊ฒฝ์œผ๋กœ๋ถ€ํ„ฐ ํด๋กœ์ € ์ปดํŒŒ์ผ๋Ÿฌ ์Šคํƒ€์ผ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(๋น„ํด๋กœ์ € ์ปดํŒŒ์ผ๋Ÿฌ ์Šคํƒ€์ผ)๋ฅผ ๋ณดํ˜ธํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

externs ํŒŒ์ผ์ด ์ œ๊ณต๋˜๋Š” ์œ ์ผํ•œ ๊ฒฝ์šฐ์—๋„ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์—ฌ์ „ํžˆ ๋ฐ๋“œ ์ฝ”๋“œ๋ฅผ ์ž๋ฅด๋ ค๊ณ  ํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ธฐ๋Šฅ์— ์ฃผ์„์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค extern ํŒŒ์ผ๋งŒ ์ž‘์„ฑํ•˜๋ฉด ํ›จ์”ฌ ๋” ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค...

์ œ ์ƒ๊ฐ์—๋Š” ๊ฐ ํ•จ์ˆ˜์— ์–ด๋…ธํ…Œ์ด์…˜์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด extern์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํƒ€์ž… ์ •์˜ ํŒŒ์ผ๊ณผ ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฅด๋ฉด ๋‚˜์ค‘์— extern ํŒŒ์ผ์„ ๋™๊ธฐํ™”ํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ฐ ๊ธฐ๋Šฅ ์ˆ˜์ •์— externs ํŒŒ์ผ ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์–ผ๋งˆ๋‚˜ ์„ฑ๊ฐ€์‹œ๊ฒŒ ๋ ์ง€ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ํƒ(externs ๋˜๋Š” /** */ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ฃผ์„)์—๋Š” ์ฃผ์„์ด ํ•„์š”ํ•˜๋ฉฐ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋” ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด ์ด๊น๋‹ˆ๋‹ค.

three.js๋Š” ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋””์„œ ๋จผ์ € ์ž‘์—…ํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

ํŒŒ์ผ ํ—ค๋”๋ฅผ ๋„ฃ๊ณ  ํ•จ์ˆ˜๋ณ„ ์ •์˜ โ€‹โ€‹์Šคํƒ€์ผ์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์€ ์–ด๋–จ๊นŒ์š”?

THREE.Material = function(){
  :
};
THREE.Material.prototype = {
    constructor: THREE.Material,
    setValues: function ( values1, value2 ) {}
    getValues: function () { return this.a; }
    :
};

โ†“

goog.provide('THREE.Material'); โ† Write goog.provide('package.classname') at the first line

โ† three empty lines before <strong i="10">@constructor</strong>

/**
 * <strong i="11">@constructor</strong> โ† Add <strong i="12">@constructor</strong> annotation to constructor
 */
THREE.Material = function(){
  :
};

โ† two empty lines before function definition
/**
 * <strong i="13">@param</strong> {!Array.<!string>} values1 Values1 explanation โ† values1 is an array of strings. values1 can't be null, and elements inside values1 can't be null.
 * <strong i="14">@param</strong> {!number} value2 Value2 explanation โ† value2 is a number.
 */
THREE.Material.prototype.setValue = function(values1, value2){
  goog.asserts.assertArray(values1);
  goog.asserts.assertNumber(value2);
  :
};


/**
 * <strong i="15">@return</strong> {!number} โ† This function returns a non-null number.
 */
THREE.Material.prototype.getValue = function(){
  return this.a;
};

๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์„ ์—„๊ฒฉํ•˜๊ฒŒ ์ œํ•œํ•˜๊ณ  ๊ฐ’ ์œ ํ˜•์„ null์ด ์•„๋‹Œ ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ADVANCED_OPTIMIZATIONS ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋ฅผ ํ›จ์”ฌ ๋” ์‰ฝ๊ฒŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ , ๋‚˜๋Š” ์—ฌ์ „ํžˆ ์ฝ”๋“œ์— ์ˆ˜๋งŽ์€ ์ฃผ์„์ด ์žˆ๋Š” ๊ฒƒ์— ๋งŒ์กฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋•Œ๋•Œ๋กœ ๋‚˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ TypeScript ์™€ ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ํฌํŒ…ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์ง€ ์•Š์€์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

Typescript๋Š” ํด๋กœ์ €๋ณด๋‹ค ๊ฐ•๋ ฅํ•œ ํ˜•์‹์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํ›จ์”ฌ ๋” ์ข‹๊ฒŒ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ ๋‹นํ•œ ํฌ๊ธฐ์˜ ์ฝœ๋ผ๋‹ค ๋กœ๋”๋ฅผ ๋จผ์ € ํด๋กœ์ € ํ˜ธํ™˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์žฌ์ž‘์„ฑํ•œ ๋‹ค์Œ ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ๋กœ ์žฌ์ž‘์„ฑํ•œ ํ›„์˜ ๊ฒฝํ—˜์ž…๋‹ˆ๋‹ค. ๋‘ ์ ‘๊ทผ ๋ฐฉ์‹ ๋ชจ๋‘ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ๋ฒ„๊ทธ๋ฅผ ์ฐพ๋Š” ๋ฐ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Closure๋Š” ๋‚ด ์ฝ”๋“œ์— ๋Œ€ํ•ด ๊ฝค ์ข‹์€ ์ตœ์ ํ™”(์ธ๋ผ์ด๋‹, ๋ฐ๋“œ ์ฝ”๋“œ ์ œ๊ฑฐ)๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์œผ๋ฉฐ nullable ํ˜•์‹์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ์—„์ฒญ๋‚œ ์–‘์˜ ์ฃผ์„์€ ์ฃผ์˜๋ฅผ ์‚ฐ๋งŒํ•˜๊ฒŒ ํ–ˆ๊ณ  IDE ์ง€์›(์ฝ”๋“œ ์™„์„ฑ์„ ์œ„ํ•œ)์€ typescript๋งŒํผ ์ข‹์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ECMAScript6๊ณผ ์œ ์‚ฌํ•œ class ํ‚ค์›Œ๋“œ๋กœ ์ธํ•ด typescript๋กœ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์‰ฝ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๊ฐœ์ธ์ ์ธ ์˜๊ฒฌ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๋” ์ค‘์š”ํ•œ ๊ฒƒ์€ ๊ณ ๊ธ‰ ์ปดํŒŒ์ผ ๋ชจ๋“œ์—์„œ ํด๋กœ์ €๋ฅผ ๊ณต์‹์ ์œผ๋กœ ์ง€์›ํ•˜๊ธฐ ์ „์— ๋ชจ๋“  ์†์„ฑ ์•ก์„ธ์Šค๊ฐ€ ์ผ๊ด€ ์ ์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋‹ค์‹œ ๊ฐ•์กฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. externs ํŒŒ์ผ์„ ๊ฐ–๋Š” ๊ฒƒ์€ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์†์„ฑ ์•ก์„ธ์Šค๋Š” ๋‚ด๋ณด๋‚ด์ง€์ง€ ์•Š๋Š” ๋‚ด๋ถ€ ๊ฐœ์ฒด์— ๋Œ€ํ•ด ์ผ๊ด€์„ฑ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋‹น์‹ ์€ ๊ทธ๊ฒƒ๋“ค์„ ์ ๊ทน์ ์œผ๋กœ ์ด๋ฆ„์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜/์ธ๋ผ์ธ/์ œ๊ฑฐํ•˜๊ธฐ๋ฅผ _์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ํด๋ž˜์Šค์™€ ๋ชจ๋“  ๋ณ€์ˆ˜์— ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ผ๊ด€์„ฑ ์—†๋Š” ์†์„ฑ ์•ก์„ธ์Šค๋ฅผ ํฌ์ฐฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ „์ฒด three.js ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๋Œ€ํ•ด ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ๋ช‡ ์ฃผ๊ฐ€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค(๋‚ด ํ”„๋กœ์ ํŠธ์— ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์„ ์ถ”์ •ํ•˜๋ฉด).

๋งˆ์ง€๋ง‰์œผ๋กœ three.js์™€ ๊ฐ™์€ ํฐ ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ค๋ฅธ ์–ธ์–ด/ํ”„๋ ˆ์ž„์›Œํฌ/์ฝ”๋”ฉ ์Šคํƒ€์ผ๋กœ ์ด์‹ํ•˜๋Š” ๊ฒƒ์€ ์ž์„ธํžˆ ๋…ผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ข‹์Šต๋‹ˆ๋‹ค. three.js๊ฐ€ ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ ๊ธฐ๋Šฅ์— ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ๋ช‡ ์ฃผ๊ฐ€ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋กœ์ €๋ณด๋‹ค ๋” ๋‚˜์€ AltJS๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ (๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ์ด์‹ํ•˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•œ๋‹ค๋ฉด) ๋” ๊นŠ์ด ๋…ผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ปค๋ฐ‹์„ ํฌํฌํ•˜๊ณ  ํฌํŒ…์„ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”,

์ด ์ฃผ์„ ์ถ”๊ฐ€๋ฅผ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
build.py์— ์ถ”๊ฐ€ํ•˜๊ณ  ํด๋กœ์ €์˜ ๊ณ ๊ธ‰ ์ตœ์ ํ™”๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์ง์ „์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๊ด€๋ จํ•˜์—ฌ,

๋žŒ์ˆœ๋‹ค๋ฅด ๋งˆ๋‹ค๋ฐ˜

2014๋…„ 6์›” 25์ผ ์ˆ˜์š”์ผ ์˜ค์ „ 6:05, Schedul Xor [email protected]
์ผ๋‹ค:

์ข‹์•„์š”, three.js๊ฐ€ ๊ฑฐ๋Œ€ํ•˜๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ๊ฐ์— ์ฃผ์„์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
๊ธฐ๋Šฅ์€ ๋ช‡ ์ฃผ๊ฐ€ ์†Œ์š”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณด๋‹ค ๋‚˜์€ AltJS๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ์‡„. ์ด๊ฒƒ์€ ๋…ผ์˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋งŒ์•ฝ ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„
๋‹ค๋ฅธ ๊ฒƒ) ๋” ๊นŠ์ด.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ปค๋ฐ‹์„ ํฌํฌํ•˜๊ณ  ํฌํŒ…์„ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/mrdoob/three.js/issues/341#issuecomment -47047966.

@ramsundhar20 , ์ œ ์˜๊ฒฌ์œผ๋กœ๋Š”

Three.js์—๋Š” ํ˜„์žฌ 1354๊ฐœ์˜ ํ•จ์ˆ˜๊ฐ€ ์ •์˜๋œ 163๊ฐœ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ, ๊ทธ๊ฒƒ์€ ๊ฑฐ๋Œ€ํ•˜์ง€๋งŒ ๋„ˆ๋ฌด ๋จผ ๋ชฉํ‘œ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

// ์ด ์ฃผ์ œ๊ฐ€ ์ ์ ˆํ•˜์ง€ ์•Š์œผ๋ฉด ๋‘๋ ต์Šต๋‹ˆ๋‹ค ...

@schedul-xor ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ €๋Š” ๊ธฐ๋Šฅ๋ณ„๋กœ ์ฃผ์„์„ ๋‹ฌ๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค./

@mrdoob ๋„ค ,

๊ท€ํ•˜์˜ ์ •์ฑ…์„ ์กด์ค‘ํ•˜์—ฌ ๋‚ด ํฌํฌ ์—๋งŒ ๊ธฐ๋Šฅ๋ณ„ ์„ค๋ช…์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋Š” ์ ˆ๋Œ€ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์›๋ž˜ three.js ์ˆ˜์ • ์‚ฌํ•ญ์„ ํด๋กœ์ € ์Šคํƒ€์ผ์˜ ํฌํฌ๋กœ ์ด์‹ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ํ˜ธ์˜์ ์ธ ๋ฐฐ๋ ค๋ฅผ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๊ทธ ์ข‹์€ ์†Œ๋ฆฌ :)

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ํด๋กœ์ € ์ปดํŒŒ์ผ๋Ÿฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๊ธฐ๋ณธ three.js externs ํŒŒ์ผ์ด ์ตœ์†Œํ•œ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๋Š” Three.js ์†Œ์Šค ์ฝ”๋“œ์— ์ถ”๊ฐ€ Google ์Šคํƒ€์ผ ์ฃผ์„์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” three.js๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์™ธ๋ถ€ app.js์—์„œ ๋งํฌ๋ฅผ ์ถฉ๋ถ„ํžˆ ์ปดํŒŒ์ผ ๊ฐ€๋Šฅ/๋‚œ๋…ํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ three.js๋ฅผ ์œ„ํ•œ ๊ณ ํ’ˆ์งˆ์˜ ์™„์ „ํ•œ externs ํŒŒ์ผ์— ๋งค์šฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ํ•˜๋‚˜์ด์ง€๋งŒ ์™„์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

https://github.com/cljsjs/packages/blob/master/three/resources/cljsjs/three/common/three.ext.js

ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ์‹œ์ž‘ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ํ•ญ๋ชฉ์„ ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ, ๋‚ด ํˆฌํ‘œ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๊ณ ๊ธ‰ ๋ชจ๋“œ ์ปดํŒŒ์ผ ๊ฐ€๋Šฅ, 100% ์œ ํ˜• threejs ๋˜๋Š” ์ตœ์†Œํ•œ externs ํŒŒ์ผ์— ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค.

์œ ํ˜• ์ถ”๋ก ์ด ํ–ฅ์ƒ๋˜๊ณ  ํ•„์š”ํ•œ ํ˜ผ๋ž€์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค. ๋ฒ”์œ„์™€ ๋ณ„์นญ์ด ์žˆ์œผ๋ฉด ์ฝ”๋“œ๋ฅผ ํด๋กœ์ € ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒํผ ์žฅํ™ฉํ•˜๊ฒŒ ์ฝ์„ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊นจ๋—ํ•œ ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ ์ž…๋ ฅ๋œ ์ธ๋ผ์ธ ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ท€๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ๋ชจ๋“  ์ด์ ์„ ๋Šฅ๊ฐ€ํ•  ๋งŒํผ ์ถฉ๋ถ„ํžˆ ๋‚˜์œ๊ฐ€?

๊ณ ๊ธ‰ ๋ชจ๋“œ + JS ์••์ถ• + ์œ ํ˜• ๊ธฐ๋ฐ˜ ์ตœ์ ํ™”์™€ ๊ฐ™์€ ๋งค์šฐ ๊ณต๊ฒฉ์ ์ธ ์„ค์ •์€ ๋ฐ๋“œ ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ตœ์ ํ™” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋ฉ‹์ง„ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ช…๋ช…๋œ ์ƒ์ˆ˜ / ์—ด๊ฑฐํ˜•์€ ์ˆซ์ž๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” constness๋ฅผ ์ถ”์ ํ•˜๊ณ  ๋‹ค๋ฅธ ์ƒ์ˆ˜๋กœ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ํ•„์š”ํ•œ ๊ณณ์— ์ผ๋ฐ˜ ์ˆซ์ž๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ข…์† ํ๋ฆ„ ์ œ์–ด๋Š” ๋ฌผ๋ก  ๋ฐ๋“œ ์ฝ”๋“œ ์ œ๊ฑฐ์˜ ๋Œ€์ƒ์ด ๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ํ™œ์„ฑ ํ˜ธ์ถœ ์‚ฌ์ดํŠธ๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ๋Š” ํ•จ์ˆ˜์™€ ์••์ถ•๋œ ํ˜•์‹์ด ์ •์˜์—์„œ ์ €์žฅํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ž‘์•„์ง€๋Š” ํ•จ์ˆ˜๋Š” ์ธ๋ผ์ธ๋ฉ๋‹ˆ๋‹ค. ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ๋ณดํ˜ธ๋˜์ง€ ์•Š๋Š” ๋ชจ๋“  ์ด๋ฆ„์€ ์ตœ์†Œ๋กœ ์ถ•์†Œ๋ฉ๋‹ˆ๋‹ค.

์กฐํšŒ๋Š” JavaScript์—์„œ ๋น„๊ต์  ๋น„์šฉ์ด ๋งŽ์ด ๋“ญ๋‹ˆ๋‹ค. ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ, ์ง€์†์ ์ธ ์ ‘๊ธฐ ๋ฐ ์ธ๋ผ์ธ์„ ๊ฒฐํ•ฉํ•˜๋ฉด ๋งŽ์€ ์กฐํšŒ์™€ ์ˆ˜๋งŽ์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์ ์ ˆํ•œ ํ—ค๋”๊ฐ€ ์ฃผ์–ด์ง€๋ฉด(ํด๋กœ์ € ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํ•˜๋‚˜๊ฐ€ ์žˆ์Œ) ๋ชจ๋“  ํ‘œ์ค€ํ™”๋œ WebGL ์ƒ์ˆ˜๋ฅผ ๋ Œ๋”๋Ÿฌ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ ๊ฒฐ๊ณผ ๋” ์ž‘๊ณ  ๋” ๋น ๋ฅด๋ฉฐ ์ž์ฒด ๋ฌธ์„œํ™”๋˜๊ณ  ์ž๋™์œผ๋กœ ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ€๋Šฅํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋˜ํ•œ ๋” ๊ณต๊ฒฉ์ ์ธ ์„ค์ •์—์„œ ๋” ๋งŽ์€ ๋ฒ„๊ทธ๋ฅผ ํฌ์ฐฉํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ฝ”๋“œ ๊ฒ€ํ† ๊ฐ€ ์‰ฌ์›Œ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๋‚œ๋…ํ™” ํšจ๊ณผ์ž…๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉ์ž ์ •์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด externs ํŒŒ์ผ์„ ํ†ตํ•ด ๋ณด์กด๋œ ๊ธฐํ˜ธ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์ฝ”๋“œ๋ณด๋‹ค ์ง€์  ์žฌ์‚ฐ๊ถŒ ๋„๋‚œ์„ ํ›จ์”ฌ ๋” ์ž˜ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์ง€์ ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์•„์ง ํƒ€์ดํ•‘๋œ ๋ฒ„์ „์œผ๋กœ ์ž‘์—…ํ•˜๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@mrdoob ๋ฉ”์ธ ๋ผ์ธ์— ๋Œ€ํ•œ ๋งˆ์Œ์˜ ๋ณ€ํ™”์— โ€‹โ€‹๋Œ€ํ•œ ํฌ๋ง์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ธฐ๊บผ์ด ๋„์™€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

@mrdoob ๋ฉ”์ธ ๋ผ์ธ์— ๋Œ€ํ•œ ๋งˆ์Œ์˜ ๋ณ€ํ™”์— โ€‹โ€‹๋Œ€ํ•œ ํฌ๋ง์ด ์žˆ์Šต๋‹ˆ๊นŒ?

ํ˜„์žฌ ์ €๋Š” WebGLRenderer ๋ฆฌํŒฉํ† ๋ง์— ์ง‘์ค‘ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿ˜‡

์— ์ƒ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ const ๋ณด๋‹ค๋Š” var ์ข‹์€ ์ง€์›์ด ๋ชจ๋‘ WebGL์ด ๋ธŒ๋ผ์šฐ์ € https://kangax.github.io/compat-table/es6/ (const-> ๊ธฐ๋ณธ) ๋ฐ JS ์—”์ง„์€ const ๋Œ€ํ•œ ์ตœ์ ํ™”๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณ ์ • ํ•„๋“œ ์ตœ์ ํ™”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „์—ญ ์ƒ์ˆ˜์˜ ์†๋„๋ฅผ ๋†’์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ํฅ๋ฏธ๋กญ๊ฒŒ๋„ var ๋Œ€์‹ ์— ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๊ฐ€ ๋งํ•˜๋Š” ๊ฒฝ์šฐ์˜ ๊ทนํžˆ ์ผ๋ถ€์—๋งŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ฌ์ง€์–ด ์ƒ์ˆ˜์— ๊ด€ํ•œ ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ JIT ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ •์˜์ƒ ๊ธ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜คํ”„๋ผ์ธ ๋„๊ตฌ์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ์ „์ฒด ํ”„๋กœ๊ทธ๋žจ ์ตœ์ ํ™”์™€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ฒฝ์Ÿํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  JS ์—”์ง„์€ ์ฝ”๋“œ์˜ ๊ตฌ์กฐ๋ฅผ ์กด์ค‘ํ•ด์•ผ ํ•˜๋ฉฐ ์˜ˆ๋ฅผ ๋“ค์–ด ์ฝ˜์†”์„ ์—ด๊ณ  ๊ฑฐ๊ธฐ์— ๋„ฃ์€ ํ”„๋กœ๊ทธ๋žจ์„ ์ฐพ๊ณ  ํŠน์ • ๊ธฐ๋Šฅ์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•˜๋ฏ€๋กœ ์ž„์˜๋กœ ๋ฆฌํŒฉํ† ๋งํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํด๋กœ์ € ์ปดํŒŒ์ผ๋Ÿฌ ์ง€์›์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ: ๋‚˜๋Š” ์•ฝ๊ฐ„์˜ ์ฝ๊ธฐ์™€ ์‹คํ—˜์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์•Œ์•„๋‚ธ ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ๊ณ ๊ธ‰ ๋ชจ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์ฃผ์„์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ฃผ์„์„ ์ ์ง„์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜์—ฌ ์ตœ์ ํ™” ์ˆ˜์ค€์„ ๋†’์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ,
  • ๋กœ๋”๊ฐ€ ๊ณ„์† ์ž‘๋™ํ•˜๋ ค๋ฉด ์•ฝ๊ฐ„์˜ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ ์ƒ๋‹นํžˆ ์‰ฝ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ์„ธ ๊ฐ€์ง€ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ชจ๋ธ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•จ๊ป˜ ์••์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์••์ถ•๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋ธ์€ ๋Ÿฐํƒ€์ž„์— ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.
  3. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ธฐ๋ณธ ๋ชจ๋“œ๋กœ ์ปดํŒŒ์ผ๋˜์–ด ์žˆ์œผ๋ฉฐ ๊ณ ๊ธ‰ ๋ชจ๋“œ ์•ฑ์—์„œ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์„ธ ๋ฒˆ์งธ ๊ฒƒ์€ ๋ชจ๋“  Three.js์— ๋Œ€ํ•œ externs ํŒŒ์ผ์ด ํ•„์š”ํ•˜๋ฉฐ IMO์˜ ์ด์ ์ด ๋„ˆ๋ฌด ์ ๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์ฒ˜์Œ ๋‘ ๊ฐ€์ง€์— ๋Œ€ํ•ด์„œ๋งŒ ๋…ผ์˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์ด๊ฒƒ์ด ์„ ํ˜ธ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค:

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ณผ ๋•Œ

anObject['aProperty']

์†์„ฑ ์ด๋ฆ„์„ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋ฌธ์ž์—ด์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ).

anObject.aProperty

๋ฐ˜๋ฉด์— anObject ๊ฐ€ ์ปดํŒŒ์ผ๋˜๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์™ธ๋ถ€์— ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์ง€ ๋ชปํ•˜๋Š” ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์†์„ฑ ์ด๋ฆ„์„ ์ผ๊ด€๋˜๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‚ด์žฅ ๋˜๋Š” ๋ช…์‹œ์ ์œผ๋กœ ์ œ๊ณต๋œ _externs_๋ฅผ ํ†ตํ•ด ์ด๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์กฐ๋ฆฌ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค:

  • ๋กœ๋”๊ฐ€ ์  ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์†์„ฑ์— ์ผ๊ด€๋˜๊ฒŒ ์•ก์„ธ์Šคํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • ์ž…๋ ฅ์„ ์ž…๋ ฅํ•˜๊ณ  JSON์— ๋Œ€ํ•ด์„œ๋งŒ externs ํŒŒ์ผ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ํ•ด๋‹น externs ํŒŒ์ผ๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์€ ์œ ์Šค ์ผ€์ด์Šค 2๊ฐ€ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ „๋ถ€์ž…๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ ์‚ฌ๋ก€ 1์˜ ๊ฒฝ์šฐ externs ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  JSON์˜ ๊ฐ์ฒด ํ‚ค์—์„œ ๋”ฐ์˜ดํ‘œ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
{
    "camera": {
        "object": {
    // ...

๋‹จ์ˆœํžˆ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค

{
    camera: {
        object: {
    // ...

์•„์ฃผ ๊ฐ„๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์‚ฌ์šฉ ์‚ฌ๋ก€ 1์€ JSON ํ˜•์‹์ด ์™ธ๋ถ€ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ(์›์‹œ ๋˜๋Š” webgl-loader ๋˜๋Š” o3dgc๋ฅผ ํ†ตํ•ด ์••์ถ•)๋ฅผ ํ—ˆ์šฉํ•  ๋•Œ ํ›จ์”ฌ ๋” ๋งค๋ ฅ์ ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๊ธฐ์ˆ ์ ์œผ๋กœ ํด๋กœ์ € ์ง€์›๊ณผ ์™„์ „ํžˆ ์ง๊ตํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

externs ํŒŒ์ผ์€ ํŒŒ์ผ ํ˜•์‹์„ ๋ฌธ์„œํ™”ํ•˜๋Š” ์˜ค๋ž˜๋œ Wiki ํŽ˜์ด์ง€๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค :-).

๋‚˜๋Š” ์ด ๋ฌธ์ œ๊ฐ€ ๊ฝค ์˜ค๋žซ๋™์•ˆ ๋‹ซํ˜€ ์žˆ์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ตœ๊ทผ์— ํด๋กœ์ € ์ปดํŒŒ์ผ๋Ÿฌ ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ three.js๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์ด ํŽ˜์ด์ง€๋ฅผ ๋ฐฉ๋ฌธํ–ˆ์Šต๋‹ˆ๋‹ค. .d.ts(typescript ์„ ์–ธ ํŒŒ์ผ)๋ฅผ ํด๋กœ์ € ์ปดํŒŒ์ผ๋Ÿฌ ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋„๊ตฌ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋„๊ตฌ์™€ ์„ค๋ช…๋œ ConfirmedTyped/threejs ์„ค๋ช…์ž ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋ฉด ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
๋„๊ตฌ: https://github.com/eredo/tsd2cce ๋˜๋Š” npm install -g tsd2cce๋ฅผ ํ†ตํ•ด ์„ค์น˜

๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค...

์ € ๋ฅผ ์™„์ „ํžˆ ๋„์šด

@eredo @Corkle ๋˜๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด tsd2cce ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ๋ถ„๋ช…ํžˆ .d.ts ์ •์˜ ํŒŒ์ผ์ด์ง€๋งŒ ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. https://github.com/eredo/tsd2cce/issues/6

์‹ค์ œ๋กœ 2์›”์˜ r73 d.ts๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด tsd2cce์—์„œ ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ r73์€ ๋‚˜์—๊ฒŒ ๋„ˆ๋ฌด ์˜ค๋ž˜๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

์ด์ œ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์€ tsickle์„ ์‚ฌ์šฉํ•˜์—ฌ d.ts ํŒŒ์ผ์—์„œ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ๋‘ ์•ˆ๋…•,

ํ›„์†๊ณผ ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ์ด์ต์„ ์œ„ํ•ด Google Closure Compiler์˜ ADVANCED_OPTIMIZATIONS ๋ฐ ๊ธฐํƒ€ ์กฐ์ •์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋” ์ถ•์†Œํ•˜๋ ค๋Š” ๋‚ด ์ž์‹ ์˜ ์‹œ๋„์— ๋Œ€ํ•ด ์—ฌ๊ธฐ์— ๋ณด๊ณ ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ณ ๊ธ‰ ์ตœ์ ํ™”๊ฐ€ ์ผœ์ง„ Three.min.js๋ฅผ ํ—ˆ์šฉํ•˜๋Š” extern.js๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์™„๋ฒฝํ•จ๊ณผ๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฉ‰๋‹ˆ๋‹ค.

์ด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ด ์Šค๋ ˆ๋“œ์˜ ์ด์ „ ์˜ˆ์ œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ extern.js๋กœ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ์ปดํŒŒ์ผํ•˜๋ฉด ํ•ด๋‹น extern ํŒŒ์ผ์— ํฌํ•จ๋˜์ง€ ์•Š์€ ๋งน๊ธ€๋ง๋œ ์†์„ฑ์œผ๋กœ ์ธํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์†์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํด๋กœ์ € ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ --property_renaming_report ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งน๊ธ€๋ง๋œ ์†์„ฑ์˜ ์ „์ฒด ๋ชฉ๋ก์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์†์„ฑ์„ extern.js์— ์ถ”๊ฐ€ํ•œ ํ›„ ์†์„ฑ์€ ๋” ์ด์ƒ ๋งน๊ธ€๋ง๋˜์ง€ ์•Š์•˜๊ณ  ์ถœ๋ ฅ์€ SIMPLE_OPTIMIZATIONS์™€ ๋™์ผํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์—์„œ ๋‚˜๋Š” extern.js์˜ ์„น์…˜์„ ์„ ํƒ์ ์œผ๋กœ/์ˆ˜๋™์œผ๋กœ ์ฃผ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—ฌ์ „ํžˆ ์ถ•์†Œ๋œ ํ˜•ํƒœ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ์ถ”์ธก ๋ฐ ํ™•์ธ์„ ์ž๋™ํ™”ํ•˜๊ณ  ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ์†์„ฑ ์ด๋ฆ„์„ ์•ˆ์ „ํ•˜๊ฒŒ ์กฐ์ž‘ํ•˜๋Š” ์™„๋ฒฝํ•œ extern.js๋ฅผ ์–ป๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. THREE.JS์— ๋Œ€ํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํ…Œ์ŠคํŠธ ์‹คํŒจ๋ฅผ ์ดˆ๋ž˜ํ•œ ๋งน๊ธ€๋ง๋œ propname์„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ๊ฒฐ์ •ํ•˜๋Š” ์•„์ด๋””์–ด๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ ํ˜„์žฌ ๋ช…๋ น์ค„์—์„œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(์˜ˆ: phantomjs ์‚ฌ์šฉ). (์•„๋งˆ WebGL ๋•Œ๋ฌธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค) ?

์–ด๋Š ์ชฝ์ด๋“  ์ด๊ฒƒ์€ ๋” ์ž‘์€ ์ถ•์†Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ–ฅํ•œ "์ง„ํ–‰"์ด๋ฏ€๋กœ ์ „์ฒด SPA ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ํฌ๊ธฐ๋ฅผ ์ค„์ด๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

externs.js

์—…๋ฐ์ดํŠธ๋œ package.json ๋นŒ๋“œ ํด๋กœ์ € ๋ช…๋ น

๋˜ํ•œ build-closure ๋ช…๋ น์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ๋ฌธ์ž์—ด ๋ฐ”๊พธ๊ธฐ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋ชจ๋“  console.warn ๋ฐ console.error ๋ฉ”์‹œ์ง€๋ฅผ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ์˜ ํŠน์ • ์„น์…˜์„ ์ฃผ์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ์ง€๊ธˆ๊นŒ์ง€ ์ถ•์†Œ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์•ฝ 20% ์ถ•์†Œํ–ˆ์œผ๋ฉฐ ๊ฐœ์„ ์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@mrdoob ์—ฌ๊ธฐ์—์„œ ๋‚ด ๋ฐฉ๋ฒ•๊ณผ ๊ฐ™์€

@medmr1 ๊ต‰์žฅํ•ฉ๋‹ˆ๋‹ค! three.js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉํ•˜์—ฌ ์•ฑ์„ ์ปดํŒŒ์ผํ•ด ๋ณด์…จ์Šต๋‹ˆ๊นŒ? ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด externs ํŒŒ์ผ์ด ์ด์ƒ์ ์œผ๋กœ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ํด๋กœ์ € ๋‚ด์—์„œ ์ „์ฒด๋ฅผ ๊ตฌ์ถ•ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ž˜ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์ฐธ์กฐ๋˜๋Š” ์ผ๋ถ€ ์†์„ฑ์„ ๋งน๊ธ€๋งํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ? var thing = ShaderLib[ shaderType + "BumpMapFrag"] ์™€ ๊ฐ™์€ IE ํ•ญ๋ชฉ ๊ทธ๋Ÿฌ๋‚˜ ์•„๋งˆ๋„ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

์˜ˆ, var thing = ShaderLib[ shaderType + "BumpMapFrag"] ์™€ ๊ฐ™์€ ํ•ญ๋ชฉ์€ ๊ณ ๊ธ‰ ์ตœ์ ํ™”๋กœ ์ธํ•ด ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ์†์„ฑ ์ฐธ์กฐ๋Š” ์ •์ ์œผ๋กœ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function(shaderType) {
  if (shaderType == "a") {
    return ShaderLib.aBumpMapFrag;
  }
  if (shaderType == "b") {
    return ShaderLib.bBumpMapFrag;
  }
...

๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์ด Closure Compiler๋กœ ์•ฑ์„ ์ปดํŒŒ์ผํ•˜์ง€ ์•Š๊ณ  ๊ฒŒ์‹œ๋œ ์ถ•์†Œ ๋ฒ„์ „๋งŒ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์˜ฌ๋ฐ”๋ฅธ externs ํŒŒ์ผ์„ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์€ ํ”„๋กœ์ ํŠธ ์ „์ฒด์— ํ™•์‹คํžˆ ๋” ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

extern ๋Œ€์‹ 
https://github.com/google/closure-compiler/wiki/Annotating-JavaScript-for-the-Closure-Compiler#export -export-sometype

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰