기본 콘텐츠로 건너뛰기

webpack을 이용한 javascript 모듈관리

안녕하세요 멍개입니다.

javascript로 구현가능 부분이 많아지면서 javascript 코드의 양이 점점 많아지고 있습니다. 코드의 양이 많아질 수록 모듈화를 통해 코드를 관리를 하게 됩니다. javascript언어 자체에서는 모듈 시스템을 지원을 하지 않기 때문에 여러가지 도구를 활용하게 됩니다 그중의 하나가 webpack입니다.

즉, webpack은 javascript 모듈관리 도구입니다.

webpack말고도 commonJS나 AMD(Asynchronous Module Definition)이 있습니다. webpack은 이 두가지의 기능을 모두 지원을 하기때문에 다른 도구보다 많이 사용되고 있습니다.
webpack을 사용하면 어떤식으로 모듈을 관리를 할 수 있는지 알아보겠습니다.
우선 우리는 webpack을 설치를 해야합니다. 하지만 npm이 설치되어 있다면 매우 손쉽게 설치를 할 수 있습니다.

$ npm install -g webpack
로컬환경에서 전역으로 사용하기위해 -g 글로벌 옵션 설정을 해줍니다.

아래와 같이 코드를 작성해줍니다.
// test.js
module.exports = {message: 'webpack'};
object하나를 외부에서 사용 할 수 있도록 하였습니다.

// app.js
console.log(require('./test'));
이제 test모듈을 app에서 사용하기 위해 require을 사용합니다.
이렇게 만든 app은 브라우저에서 직접 실행 할 수 없습니다 webpack을 이용하여 웹브라우저에서 사용할 수 있는 형태로  컴파일을 해주어야 합니다.
컴파일을 하지 않은채 웹 브라우저에서 호출을 해보도록 하겠습니다.
1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script src="./app.js"></script>
</body>
</html>
cs
이제 해당 소스를 웹 브라우저로 열어보겠습니다.


웹 브라우저에서는 require을 사용 할 수 없습니다.

$ webpack ./app.js bundle.js

Hash: 3fc5c338f76bfd986a18
Version: webpack 2.2.1
Time: 70ms
    Asset     Size  Chunks             Chunk Names
bundle.js  2.88 kB       0  [emitted]  main
   [0] ./test.js 90 bytes {0} [built]
   [1] ./app.js 83 bytes {0} [built]

$
webpack을 이용하여 app.js를 웹에서 사용 할 수 있는 형태인 bundle.js로 컴파일 완료가 되었습니다.
1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script src="./bundle.js"></script>
</body>
</html>
cs
app.js를 호출을 bundle.js로 바꾸어 호출을 해줍니다. 
웹 브라우저를 띄어보면 정상적으로 실행됨을 확인을 하실 수 있습니다.
여기서 app.js을 entry파일이라고 합니다. entry파일은 각종 모듈들을 호출을 하여 여러 모듈에 의존적인 성격을 띄게 될 겁니다. 이러한 모듈의 의존성을 하나의 bundle파일로 만들게 됩니다. 즉 모듈의 의존성을 하나의 파일로 합쳐버리면서 의존성을 없애는 역할을 하기도 합니다. 
추가적으로 node.js와 같은 타 영역에서 사용을 하는 js코드를 사용이 가능해집니다.
근데 여기서 우리는 매우 귀차니즘이 가득한 개발자임을 기억을 해야합니다. 
코드가 바뀔 때마다 bundle.js파일을 만들기 위해 webpack ./app.js bundle.js를 입력하는건 매우 귀찮은 일입니다.
그래서 --watch 옵션을 사용을 합니다.

$ webpack --watch ./app.js bundle.js

Hash: 3fc5c338f76bfd986a18
Version: webpack 2.2.1
Time: 70ms
    Asset     Size  Chunks             Chunk Names
bundle.js  2.88 kB       0  [emitted]  main
   [0] ./test.js 90 bytes {0} [built]
   [1] ./app.js 83 bytes {0} [built]

대기중 
해당 옵션을 사용을 하게되면 프로세스가 완료되지 않고 대기상태로 변환이 됩니다. 코드가 수정이 이루어 지면 자동으로 컴파일을 해주게 됩니다.
해당 소스를 옵저빙하여 코드변경이 이루어지면 자동으로 컴파일이 가능해졌습니다.

이제 엔트리 파일이 하나이상 번들 파일이 하나 이상일 경우 옵션이나 인자를 넘겨야 할게 복잡해 질 것입니다.
이를 해결하기 위해서는 설정파일을 만들어 한번에 작업을 하도록 합니다. 
webpack.config.js파일을 만들어 아래와 같이 코드를 작성을 해주도록 합니다.

//webpack.config.js module.exports = { context: __dirname + '/', // 모듈 파일 폴더 entry: { // 엔트리 파일 목록 app: ['./app.js'] }, output: { path: __dirname + '/dist', // 번들 파일 폴더 filename: '[name].bundle.js' // 번들 파일 이름 규칙 } }
엔트리 파일의 위치를 context에 넣어줍니다. 
엔트리가 될 대상을 entry.app에 리스트로 넣어줍니다
이제 번들파일을 설정해주어야 하는데 생성될 디렉토리 위치 및 파일이름 규칙을 정해줍니다. 


$ webpack 

OR

$ webpack --watch
의 형태로 진행을 하면 됩니다. 
이젠 bundle파일이 webpack.config.js['output']규칙에 맞추어서 생성이 될 겁니다.
웹팩은 다양한 옵션을 설정을 해줄 수 있습니다. 아래에 접속을 하면 다양한 옵션에 대한 설명을 보실 수 있습니다
http://webpack.github.io/docs/configuration.html

디버깅에 대해서 알아보자
많은 웹 개발자는 브라우저의 개발자 도구를 이용하여 디버깅을 하게 될 것입니다.
그런데 webpack을 사용하여 컴파일된 코드를 사용을 하게 될 경우 개발자 도구에서는 컴파일 된 파일만 나타나게 될 것입니다.

webpack.config.js에 
devtool: '#inline-source-map'을 추가를 해줍니다.


//webpack.config.js module.exports = { context: __dirname + '/', // 모듈 파일 폴더 entry: { // 엔트리 파일 목록 app: ['./app.js'] }, output: { path: __dirname + '/dist', // 번들 파일 폴더 filename: '[name].bundle.js' // 번들 파일 이름 규칙 }, devtool: '#inline-source-map', } 
다시 컴파일을 해주도록 합니다.
좌측을 보면 컴파일을 하기위한 각각의 파일을 직접 확인을 할 수 있습니다.














댓글

이 블로그의 인기 게시물

[javascript] 자스민(Jasmine)을 이용하여 TDD 작성후 웹 페이지에 적용해보자.

 다음 코드는  멍개의 코드 저장소 에 있습니다. 코드를 확인하고 싶으면 여기를 click 하세요 시작하기 전에... 책을 시작하기 전에 책에서 사용하는 자스민을 어떤식으로 이용하여 테스트 코드를 작성할 수 있는지 봐보자. 자스민 사용방법 테스트 러너파일 작성 테스트 러너란 자스민 코드와 소스파일, 스펙을 참조하는 html 파일 app_spec.html 테스트 코드를 작성하기 전에 첫째로 js 파일을 UI에서 완전히 분리하여 작성하는 것이 중요하다. 모듈패턴 테스트 코드가 가능한 코드를 작성하기 위해서는  모듈패턴 을 사용하도록 합니다. 모듈패턴이란? 함수로 데이터를 감추고, 모듈 API를 담고있는 객체를 반환하는 형태다. 모듈패턴은 자바스크립트에서 가장 많이 사용하는 패턴입니다. 두 가지 형태로 모듈패턴을 사용할 수 있습니다. 첫 번째는 호출하는 방식으로 사용합니다. 두 번째는 즉시 실행 함수 기반으로 사용할 수 있습니다. 여기서 즉시 실행 함수를  IIFE(Immediately Invoked Function Expression) 라고 합니다. 모듈 패턴 코드를 어떤식으로 작성할 수 있는지 간단하게 확인해보겠습니다. // 공간생성 let App = App || {}; // 생성된 공간에 함수를 추가한다. 인자로 함수를 넘긴다.( == 의존성 있는 함수를 주입) App.Person = function(God){ let name = God.makeName(); // API 노출 return { getName: function(){return name;}, setName: function(newName){name = newName;} } }; App 변수를 생성합니다. 생선된 변수에 Person() 함수를 만듭니다. person() 함수는 첫 번째 인자로 함수를 전달받습니다. retur...

[알고리즘] snake게임 알고리즘

막무가네로 알고리즘을 공부하면 재미가 없으니 게임을 접목하여 다루어 보도록 하겠습니다. 게임의 대상은 스네이크 게임입니다. 많은 사람들은 어릴 때 뱀게임을 많이 해봤을 것 입니다. 이번에 다뤄볼 주제는 뱀이 움직임을 어떻게 구현을 할지 알아보겠습니다. 뱀은 크게 3가지의 경우가 있습니다 1. 가장 중요한 뱀을 움직이기 2. 음식먹기 이때 뱀은 크기가 늘어나야 합니다. 3. 뱀이 움직이는 정책   - 뱀이 움직이지 못하는 경우는 : 우측방향에서 좌측 방향으로 OR 위에 아래 방향고 같이 180도 반전되는 움직임은 막겠습니다. 순수한 알고리즘을 만드는 과정이기 때문에 음식을 먹었는지 안먹었는지 판단하는 부분은 랜덤으로 판단을 하도록 하겠습니다. def is_eat(): return random.choice([1, 0]) 랜덤으로 1, 0을 반환을 해줍니다. 실제로 게임을 만든다면 해당 함수는 뱀의 머리가 음식의 좌표와 같은지 검사를 해주면 되겠습니다. key_position_map = { 'w': [-1, 0], # up 's': [1, 0], # down 'a': [0, -1], # left 'd': [0, 1] # right } direction = key_position_map.get('d') 다음으로는 키맵핑을 한 오브젝트 입니다. direction은 현재 뱀의 방향을 나타냅니다. snake_body = [[2, 3], [1, 3],[1, 2], [1, 1]] 주인공이 되는 뱀의 좌표들 입니다. while True: key = input() new_direction = key_position_map.get(key) if new_direction and direction_check(direction, new_direction): directi...

[react] react 작업환경 설정

react-boilerplate 사용방법 해당 프로젝트는 일반적인 react를 사용하기 전에 이런저런 환경설정을 미리 셋팅을 해둔 프로젝트 입니다. 해당 프로젝트는 아래의 설정들을 거쳐 해당 명령어만 실행을 해주면 일반적인 react 프로젝트를 실행 시킬 수 있습니다. 1. git clone https://github.com/pjt3591oo/react-boilerplate.git - 프로젝트 클론하기 2. npm install – Dependency 설치하기 3. npm start – 개발 서버 실행하기 (포트: 7777) 위 명령어를 실행 하였으면 http://localhost:7777로 접속해보기 해당 프로젝트의 자세한 설명은 아래에 작성하였습니다. 시작하기 앞서서 npm 3.10.6이상 버전 설치 권장 : npm의 버전마다 설치 방식이 달라 2.x버전에서 아래에 나와있는 모듈을 설치 할 때 상당히 오래 걸릴 수 있습니다. 1. Global Package 설치하기 babel  : 아직 ECMAScript6를 지원하지 않는 환경에서 ECMAScript6 Syntax를 사용할 수 있게 해줌. webpack  : 모듈 번들러로서, Browserify처럼 브라우저 위에서 import(require)을 할 수 있게 해주고 자바스크립트 파일들을 하나로 합쳐준다. webpack-dev-server  : webpack에서 지원하는 간단한 개발서버로서 별도의 서버를 구축하지 않고도 웹서버를 열 수 있으며 hot-=loader를 통하여 코드가 수정될때마다 자동으로 리로드 되게 할 수 있다. $ npm install -g babel webpack webpack-dev-server 2. project생성 $ mkdir react-tutorial && cd react-tutorial $ npm init 3. Dependency 및 Plugin 설치 react사용을 위한 ...