🙌🏻 해당 글은 Three.js Journey의 강의 노트입니다.
이전 포스트에서 작성했던 것과 같이 three.min.js 파일을 직접 가져오는 것이 가장 쉬운 방법이기는 하나, 아쉽게도 그러한 방식에는 한계가 있다. 몇몇 무거운 클래스들을 로드해올 수 없다. 또한 이미지 조작을 위해 결국 서버를 실행해야 하고, 보안상의 이유로 로컬 서버를 실행할 수밖에 없다. 다양한 방식이 있지만, 그중 가장 간단한 방법이 바로 번들러를 사용하는 것이다. 현재로서 가장 인기있는 번들러는 웹팩이라 할 수 있다.
쉽게 말해 번들러는 이미지, 타입스크립트, 스타일러스 등 웹 친화적이지 않은 asset들(여기에는 웹 친화적이지 않은 상태의 JS, CSS, HTML도 포함된다.)을 웹친화적인 asset으로 구성한 번들로 출력하는 도구를 말한다. 번들러는 또한 로컬서버를 만들고, 디펜던시를 관리하고, 호환성을 개선하고, 모듈을 지원하고, 이미지를 최적화하고, 서버를 배포하고, 코드를 축소하는 등의 역할을 수행할 수 있다.
Three.js에서는 우선 웹팩을 하나하나 뜯어보고 이해하기 전에 템플릿을 제공해주었다.
해당 템플릿을 다운받아 npm install
, npm run dev
를 실행하면, 브라우저에서 코드가 실행되는 것을 살펴볼 수 있다.
이전 실습과 달리 우리가 따로 수동으로 index.html
에 스크립트 태그를 추가해줄 필요가 없다는 것이다. 이 부분은 웹팩이 알아서 추가해준다!
이전 레슨03에서의 html과 js코드를 그대로 가져올 것이다!
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>04 - Webpack</title>
</head>
<body>
<canvas class="webgl"></canvas>
</body>
</html>
위에서 언급했다시피, 우리는 그 어떤 스크립트태그도 추가해줄 필요가 없다.
// script.js
import './style.css'
import * as THREE from 'three'
//...
JS파일에도 기존과 다른 점이 하나 있는데, node_modules 폴더 안에 있는 ThreeJS 모듈을 임포트해서 THREE라는 변수로 꺼내오고 있는것을 알 수 있다. (css의 경우에는 ./style.css
를 모듈로 스타일을 적용하는 것!)
위와 같이 로컬 서버가 잘 실행되고 브라우저에서 우리가 만든 scene을 확인할 수 있다.
2022.9.23일에 포스트를 새로 수정하였습니다.
Three.js Journey에서는 Webpack 구성을 이미 해놓았고, npm install
을 통해 쉽게 install만 하면 번들러가 작동되어 잘 three.js 라이브러리를 로드해올 수 있다!
그러나 Webpack의 작동원리를 아직 자세히 알고 있지 못하다.
현재로서는 서버와의 소통을 해야하는데 클라이언트, 즉, 브라우저에서 바로 소통할 수는 없다는 것 정도를 짐작해볼 수 있다. 사실 이 전에 강의를 듣지 않고 혼자서 three.js를 로드해보려고 할 때마다 너무 많은 오류를 마주했었다. 다른 라이브러리들과 달리 단순히 npm install만해서 되는 것이 아니었다.
일단 내가 마주했던 에러들을 기록해놓고, 후에 다시 Webpack을 공부하며 하나씩 차근 차근 해결해 나가려고 한다!
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>04 - Webpack</title>
</head>
<body>
<canvas class="webgl"></canvas>
<script src="./script.js"></script>
</body>
</html>
//js
import "./style.css";
import * as THREE from "three";
// ...
위와 같이 구성하고 나면 아래와 같은 에러가 콘솔에 찍힌다.
구글링을 통해 힌트를 얻어 script 태그에 타입을 설정해주었다!
ES6 import syntax를 사용해주기 위함이다.
<script type="module" src="./script.js"></script>
이렇게 지정해주고나면 또 다른 에러가 출력된다.
import "./style.css";
import * as THREE from "./node_modules/three/build/three.module";
그랬더니 또 다른 에러가 발생한다.
에러의 연속...
404에러가 발생한다! 서버와의 소통에 문제가 있는 것으로 파악된다.
index.html
에서 수동으로 script
를 삽입해줄 필요가 없다.import "./style.css";
import * as THREE from "three";
위와 같이 깔끔하게 코드를 작성해주어도 모든 것이 잘 작동한다.
이 작동원리에 대해서는 Webpack을 공부하며 다시 정리해보기로 한다.