Webpack 정리노트


1. 개념 

2. webpack 간단 사용법

3. 설정 파일 사용법

4. CSS 사용법 (나중에 다른 파일형식으로 응용가능) 

5. ES6 사용법

6. 외부 모듈 사용법 

7. 다중 output 파일 생성법

8. 파일 관리

9. asset 파일 관리

10. sourcemap 생성

11. ES7 .. 더넘어서


1. Webpack 간단 개념


Image result for webpack


위의 그림으로 부가적으로 설명하자면 여러가지의 의존성을 가진 파일들을 모아 한가지 파일로 만들어주는 역할을 한다.

기존 browser 내 자바스크립트에서 모듈기능의 부재로 인해 많은 방법론들과 라이브러리들 탄생했는데 ( requirejs, commonjs, AMD..) 이런 문제를 해결해주는 방법의 하나로 보면 된다. 


번들링하는 과정중에 transpiling 을 지원하므로 ES6 문법을 활용한 코딩도 가능하다. 

자바스크립트파일뿐만 아니라 css, sass, image files 등 다른 파일들에 대한 묶음(bundle)기능도 제공한다. 


- 어디에 사용해야 할까?

프론트 엔드 프레임워크와 함께 SPA 에서 프론트 엔드를 헤비하게 사용하는 곳에서 엄청난 강점을 발휘

반면 프론트 엔드 코드 베이스가 크지 않은 곳에서는 overhead로 다가올수도 있다. (설정하는데 한세월...)


이렇게 하면 사실 잘다가오지 않아서 실제적인 예를 들고자 한다.


추가 참고:

http://blog.andrewray.me/webpack-when-to-use-and-why/


2. Webpack 간단사용법 


  •  webpack 설치

npm install webpack -g  


  • 모듈파일 작성

1. 모듈 참조 파일 작성

moduleA.js

moduleB.js


entry.js


import a from "./moduleA";

import b from "./moduleB";


* npm에서 다운로드 받은 파일 (node_modules)에 있는 파일들은


import dfd from "module"; 식으로 사용 가능


2. webpack entry.js bundle.js


bundle.js 파일 생성


bundle.js안에 moduleA와 moduleB를 사용할수 있다.


  • webpack 을 통한 묶음


 [--watch]



3. 설정 파일 사용법


위의 같은 경우같이 계속해서 수동으로 파일 위치를 지정해주는 것은 비효율적이므로 webpack.config.js 설정 파일만들어 자동화가 가능하다. 


기본 설정파일 구조



module.exports = { context: path.resolve(__dirname, './src'), // 소스 디렉토리 루트 폴더 위치 entry: './entry.js', output: { path: __dirname, filename: 'bundle.js' } };


webpack 명령어를 치면 기본적으로 webpack.config.js 파일을 찾는다. 하지만 보통 프로덕션, 테스팅, 로컬 환경에 따라 다른 파일을 쓰게 되므로

다른 설정파일을 쓰고 싶은 경우 

webpack --config 설정파일경로 로 설정한다 


* __dirname은 현재 폴더를 나타낸다.


4. CSS 사용법

webpack 은 javascript 모듈뿐만 아니라 css도 지원한다. 


- CSS

파일안에 CSS 추가파일 참조


ES5 버전 이하 

require('!style!css!./style.css');


ES6 이후

import './style.sass';


- SASS

npm install sass-loader node-sass --save-dev

require('!style!css!sass!./style.sass');


module.exports = {

  entry: './entry.js',

  output: {

    path: __dirname,

    filename: 'bundle.js'

  },

  module: {

    loaders: [

      { test: /\.sass$/, loader: 'style!css!sass' }

    ]

  }

};


- LESS

npm install less-loader less --save-dev


module.exports = {

  module: {

    loaders: [

      {

        test: /\.less$/,

        loader: "style!css!less"

      }

    ]

  }

};


* 설정파일에 CSS 설정 추가법



5. ES6 사용법 


ES6의 경우는 사용법이 더 간결하다. ES6자체 모듈 기능을 활용하자.

( ES5까지의 노가다 코딩 과정을 ES6과정을 통해 확연히 줄이자 ES6 만세! ) 


webpack 로더 추가 


npm install --save babel-loader babel-core babel-preset-es2015


module.exports = {

  entry: './entry.js',

  output: {

    path: __dirname,

    filename: 'src/js/dist/bundle.js'

  },

  module: {

       loaders: [

            {

                test: /\.js$/,

                loader: 'babel',

                exclude: /(node_modules|bower_components)/,

                query: {

                    presets: ['es2015']

                }

            }

       ]

  }

};




6. 외부 모듈 사용법


{

    output: {

        // export itself to a global var

        libraryTarget: "var",

        // name of the global var: "Foo"

        library: "Foo"

    },

    externals: {

        // require("jquery") is external and available

        //  on the global var jQuery

        "jquery": "jQuery"

    }

}


위와 같은 설정을 할시에 jquery 파일은 어디에 위치해 놓아야 하는가?


혹은 ES6의 경우 npm 설치시에 import  설정해주면 바로 작동된다 


예를들어 jquery 사용시 파일안에 


import $ from 'jquery'; 로 사용 가능





* 추가 참고: 

1. https://webpack.github.io/docs/library-and-externals.html

2. http://stackoverflow.com/questions/22530254/webpack-and-external-libraries

3. http://stackoverflow.com/questions/28969861/managing-jquery-plugin-dependency-in-webpack


7. 다중 output 파일 생성법


인풋파일 (엔트리 포인트)가 여러가지일 경우 대처 (https://webpack.github.io/docs/multiple-entry-points.html)


SPA(Single Page Application) 어플케이션이 아니라 전통의 웹 어플리케이션을 확장하다보면 하나의 아웃푸 파일에 모든 파일에 집어 넣기 보다는 필요한 모듈만 바꾸어서 아우풋 파일을 내야하는 경우가 많다. 


웹팩 페이지의 다중 output 파일 기본설정


{

    entry: {

        a: "./a",

        b: "./b",

        c: ["./c", "./d"]

    },

    output: {

        path: path.join(__dirname, "dist"),

        filename: "[name].entry.js"

    }

}


여기서 웹팩에서 



* 추가 참고: 

1. https://github.com/webpack/webpack/issues/1189

2. https://webpack.github.io/docs/configuration.html



8. CSS외에 다른 로더들도 사용해보자 (스킵 가능)


필자는 C#의 창시자 엔더스 헤일즈버그를 좋아한다. 그러므로 그가 참여한 프로젝트인 Typescript 또한 주목하고 있었고 현재 프로젝트에는 적용하고 못하고 있지만 군침만흘리고 있다. webpack 에서도 typescript 및 다른 css trasnpiler 들을 알아보자. 각각의 프로젝트에 맞는 로더를 구글링해서 아래와 비슷한 형식으로 추가해주면 된다.


$ npm install ts-loader --save


module.exports = {
  entry: './app.ts',
  output: {
    filename: 'bundle.js'
  },
  resolve: {
    // Add `.ts` and `.tsx` as a resolvable extension.
    extensions: ['', '.webpack.js', '.web.js', '.ts', '.tsx', '.js']
  },
  module: {
    loaders: [
      // all files with a `.ts` or `.tsx` extension will be handled by `ts-loader`
      { test: /\.tsx?$/, loader: 'ts-loader' }
    ]
  }
}


typescript 는 tsconfig.json 파일을 설정파일로 사용한다. 

{

  "compilerOptions": {

    "target": "es5",

    "sourceMap": true

  },

  "exclude": [

    "node_modules"

  ]

}


** exlcude 설정 

exclude 를 설정하게 되면 exclude 경로안에 파일들은 제외하고 컴파일한다. 



* 추가 참고:

1. http://www.jbrantly.com/typescript-and-webpack

2. https://www.typescriptlang.org/docs/handbook/react-&-webpack.html

3. https://github.com/TypeStrong/ts-loader



9. asset 파일 관리

webpack 이 이미지파일도 모듈단위로 bundling 을 할수 있다. (이쯤되면 webpack이 못하는게 뭐야?)

예제로 그림파일을 첨부하는 방법을 설명한다. 먼저 에셋 파일들을 처리할수 있는 filter-loader 를 설치하자 



* 추가 참고:



10. Uglify

자바스크립트를 최소화하고 싶을때 쓰는 것.

Plugin 형태로 매우 쉽게 사용가능하다. 아래와 같이 설정 파일에 덧붙여주자


  plugins: [

      new webpack.optimize.UglifyJsPlugin()

  ]


이쯤되면 loader 와 plugin 의 차이점이 무엇인지 궁금할 것이다. (본인 스스로에서 나온 경함담..)


11. soucremap 생성법

sourcemap 은 옵션을 추가해서 간단하게 생성가능하다. Happy Javascript Debugging


{

devtool: 'source-map'

}



12. ES7 



추가 참고: 

http://jamesknelson.com/using-es6-in-the-browser-with-babel-6-and-webpack/



지금까지 다읽은 분들은 최종 설정파일들이 어떤식으로 궁금한지도 궁금할 것이다. 

(부분 소스코드만으로는 이해하기 어려운 경우르 많이 겪었다.) 

그래서 지금까지 차근 차근 읽어오면서 설정을 추가하면 아래와 같은 설정파일이 나올것이다.



** 유용한 플러그인 

https://www.npmjs.com/package/webpack-fail-plugin


** 웹팩 플러그인 리스트 

https://github.com/webpack/docs/wiki/list-of-plugins



전체참고:

1. https://webpack.github.io/

2. http://d2.naver.com/helloworld/0239818

3. http://hyunseob.github.io/2016/04/03/webpack-practical-guide/

4. https://medium.com/@dtothefp/why-can-t-anyone-write-a-simple-webpack-tutorial-d0b075db35ed#.qbdn1ed8y

5. https://github.com/petehunt/webpack-howto

6. https://medium.com/@rajaraodv/webpack-the-confusing-parts-58712f8fcad9#.2d2825m5u

7. https://web-design-weekly.com/2014/09/24/diving-webpack/ 

8. https://blog.madewithenvy.com/getting-started-with-webpack-2-ed2b86c68783#.cq6srzptu


* browserlify 유저들을 위한 webpack 으로 전환하기 

http://webpack.github.io/docs/webpack-for-browserify-users.html


* gulp 와 webpack 함께 사용하기




Python 자체의 Hang 현상때문에 프로레스가 출력 값을 리턴하지 않으면 강제 종료 하는 기능을 구현

파이썬에 의해 실행되는 프로그램이 30분이상 걸리지 않는 다는 전제 하에 실행하기로 한다.

파이썬 3.3+ 버전때부터는 프로세스를 실행하는 함수자체 내에서 timeoout 기능을 지원한다.

2.7 버전 subprocess:

https://docs.python.org/2/library/subprocess.htm

3.5 버전 subprocess

https://docs.python.org/3/library/subprocess.html

위 두버전의 문서를 체크해보면

2.7 버전에서

subprocess.check\_output(args, \*, stdin=None, stderr=None, shell=False, universal\_newlines=False)

3.5 버전에서

subprocess.call(args, \*, stdin=None, stdout=None, stderr=None, shell=False, timeout=None)

차이가 있는 것을 볼수 있다.

2점대 버전에서

* threading 을 이용해 우회적으로 구현하는 방법이 있긴 있다.

http://stackoverflow.com/questions/1191374/using-module-subprocess-with-timeout

* Hang현상은 프로세스에 말그대로 Hang(걸려)있는 현상으로 프로그램이 정상적으로 종료되지 않고 계속적으로 남아있는 현상이다.

* 추가팁:

파이썬 스크립트 동작 추적하기

python -m trace --trace 파이썬스크립트파일.py

참고자료:

http://stackoverflow.com/questions/3443607/how-can-i-tell-where-my-python-script-is-hanging

Unix 환경 (Linux, Mac OS) :
/path/to/php-i | grep -i "Thread"

 

Windows 환경:
php -i | findstr -i "thread"

 

위의 명령어 타이핑시 아래중에 하나를 리턴하게된다

 

1. Threadsafe일 경우:
Thread Safety => enabled

 

2. Nonthreadsafe일 경우:
Thread Safety => disabled

 

 

참고자료:

http://stackoverflow.com/questions/5799843/find-if-the-installed-php-is-threadsafe-or-nonthreadsafe

리눅스 폴더 tree 구조 보기


yum install tree -y


Centos 에서는 디폴트로 설치되어 있지 않기 때문에 패키지 매니저를 통해 설치해주어야한다.


설치이후


tree /보고자하는/경로 를 치면 된다


더 자세한 옵션은


man tree 를 참조



참고자료:

http://stackoverflow.com/questions/5732696/centos-directory-structure-as-tree

'Linux (Ubuntu based)' 카테고리의 다른 글

리눅스 tail 명령어로 실시간 로그보기  (0) 2016.07.19
Socket 이란?  (0) 2014.11.06
Ubuntu Mysql 설치  (0) 2014.10.30

현재 유저의 이름에 따라 다르게 실행하는 함수 구현

Python에서 현재 실행 중인 시스템의 사용자를 가져오고, 사용자 이름에 따라 다른 동작을 수행하려면 getpass 모듈의 getuser() 메서드를 사용할 수 있습니다.


기본 예제

getpass.getuser()를 사용하여 현재 시스템 사용자의 이름을 가져올 수 있습니다.

코드 예시

import getpass

# 현재 사용자 이름 가져오기
current_user = getpass.getuser()
print(f"Current user: {current_user}")

출력

Current user: ethan

사용자에 따라 다른 작업 실행

아래는 사용자 이름에 따라 특정 동작을 실행하는 함수의 예제입니다.

코드 예시

import getpass

def execute_based_on_user():
    # 현재 사용자 이름 가져오기
    current_user = getpass.getuser()

    # 사용자 이름에 따라 다르게 동작
    if current_user == "ethan":
        print("Hello Ethan! You have admin privileges.")
        # Ethan 전용 동작
    elif current_user == "alice":
        print("Hi Alice! Limited access granted.")
        # Alice 전용 동작
    else:
        print(f"Hello {current_user}! Default access granted.")
        # 기본 동작

# 함수 실행
execute_based_on_user()

출력 (사용자에 따라 다름)

Hello Ethan! You have admin privileges.

또는

Hi Alice! Limited access granted.

참고사항

  • getpass.getuser()는 환경변수 LOGNAME, USER, LNAME, USERNAME 중 첫 번째로 유효한 값을 반환합니다.
  • 보안 주의사항: 사용자 이름은 신뢰할 수 없는 환경에서는 보안적으로 민감하지 않은 작업에만 사용하는 것이 좋습니다.

추가 기능: 사용자 이름 기반 권한 시스템

아래는 사용자 이름에 따라 권한을 설정하는 간단한 예제입니다.

코드 예시

import getpass

def get_user_permissions():
    # 사용자별 권한 설정
    permissions = {
        "ethan": "admin",
        "alice": "read-only",
        "bob": "editor"
    }
    # 현재 사용자 가져오기
    current_user = getpass.getuser()

    # 권한 가져오기
    user_permission = permissions.get(current_user, "guest")
    return user_permission

# 권한 확인
permission = get_user_permissions()
print(f"Current user permission: {permission}")

출력

Current user permission: admin

참고 자료

  1. Python 공식 문서 - getpass 모듈
  2. Python getuser 동작 설명

리눅스에서 크론탭으로 정기적인 스케쥴에 대한 설정이 가능하다. 


- 크론탭 명령어 추가

crontab -e 


- 크론탭 명령어 보기: 

crontab -l  


- 크론탭 삭제 :

crontab -r


- 크론탭 재식작:



크론탭 필드 


분 시 일 월 년 명령어


ex) * 1 * * * python = 매일 1시 python


매분:  * * * * * 

매시:  * 1 * * * 

매일: 

매월 


- 크롭탭 로그 장소

/var/log/cron


로그확인: tail -30 /var/log/cron


추가되는 로그 지속적으로 확인하기 

tail 명령어에 관한 포스팅은 여기

크론탭 사용시 주의사항
크론탭은 자체적으로 가장 최소화된 환경으로 실행되기때문에 로컬에서 지정된 경로의 프로그램으로 실행되지 않을수 있다. 
그렇기때문에 명령어의 실행프로그램을 절대경로 지정해주어야한다

실제로 
python2.7 



참고자료:

1. http://www.tested.co.kr/board/Study/view/wr_id/15/sca/5

2. http://kthan.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4Linux-%ED%81%AC%EB%A1%A0%ED%83%ADcrontab-%EC%84%A4%EC%A0%95-%EB%B0%8F-%EC%82%AC%EC%9A%A9%EB%B0%A9%EB%B2%95


'Linux (Ubuntu based) > CentOS' 카테고리의 다른 글

리눅스 방화벽 설정 Iptables  (0) 2016.10.18

tail 명령어로 기록되는 로그에 대해 실시간으로 체크하자 


옵션 


-f 업데이트에 대해 지속저록 


-n 출력하고자 하는 행의 갯수 (파일의 끝 기준) 


명령어 예: 


tail -f -n 20


끝에 20 줄 실시간 보기


실시간 로그 보그 


더많은 옵션은 


man tail 을 참조하자 


참고자료:

http://windfree.tistory.com/40

'Linux (Ubuntu based)' 카테고리의 다른 글

Centos 에서 폴더 tree 구조 보기  (0) 2016.07.22
Socket 이란?  (0) 2014.11.06
Ubuntu Mysql 설치  (0) 2014.10.30

이클립스 기준 톰캣 7.x 버전으로 설정


CENTOS 기준


$CATALINA_HOME/catalina.bat 파일 안에 


CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n"

JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n"


* 중요 

카탈리나 아래명령어와 함께 재실행

catalina.sh jpda start



안에 위에것을 추가해주고 톰캣을 재시작해준다. 

* 8000은 자기 포트번호에 맞게 변경한다.


* 당연한 이야기지만 서버측에서도 포트번호 8000번을 열어주어야한다. 보안이 강화된 환경에서 라우터 또는 방화벽에서 포트번호를 막을수도 있다. 필자는 이것때문에 원인을 찾지 못하고 삽질을.. 



이제 이클립스를 설정해주어야한다.

Run - Debug Configurations 


Remote Java Application 항목에서 오른쪽 클릭후 New를 클릭해준다


Project를 디버깅하고자는 프로젝트를 선택하고


서버가 존재하는 아이피를 클릭하고

위에 카탈리나 bat파일에서 입력한 포트번호를 입력한다




설정완료 후 Debug 버튼을 클릭하면 디버깅 Perspective 로 전환되는 것을 볼수 있다.


참고자료:

http://wonzopein.com/56

http://bryan7.tistory.com/143

http://stackoverflow.com/questions/3835612/remote-debugging-tomcat-with-eclipse


Eclipse 내에서 Java doc 코멘트를 자동 생성해주는 방법 단축키


두가지 방법이 있는데 메소드 이름 위에서


1. 단축키

Alt+ Shift J


2. /** + Enter 


아래와 같이 사용할수 있다.

/**
 * @param fooPa
 */
public void foo(String fooPa) { }


'Tools' 카테고리의 다른 글

Scala IDE eclipse 맥에서 실행시 에러 현상  (0) 2016.11.18
Hyper-V 와 VirtualBox 쉽게 변경하기  (0) 2016.10.05

+ Recent posts