안녕하세요 저번 블로그 포스팅 에서는 TypeScript를 입문하기 위해서 한글 공식 문서와 함께 vscode상에서의 프리티어 

 

설정 등을 하여서 정말 기본중의 기본 튜토리얼만 진행 해보았습니다.

 

// TypeScript Documentation korea Language 

https://typescript-kr.github.io/pages/tutorials/TypeScript%20in%205%20minutes.html

 

TypeScript 한글 문서

TypeScript 한글 번역 문서입니다

typescript-kr.github.io


그런데 제가 하고자 하는 거랑은 맞지 않았던 것이 있습니다.

TypeScript를 JS로 빌드 하지만 JS만으로는 한계가 있기 때문에 기본적으로 html 파일과 css파일이 필요합니다만

 

ts만 따로 빌드하기엔 뭔가 깔끔하지 않는 느낌이랄까요 그래서 같이 한꺼번에 할수 없을까 하여

 

이것저것 찾아 보았습니다. 이왕하는거 sass도 쓰고 이것저것 해보는것이 더 좋은 것 같아서

 

webpack v4

 

웹팩 요즘 많이들 이야기 나오는 번들러 입니다. 해당 번들러에 ts-loader ( TypeScript Loader ) 를 사용하면 같이 이용해볼수 있을 것 같더군요

 

물론 각자 검색해서 공식홈으로 가도 되시겟지만   아래 일단 공유 !

https://webpack.js.org/

 

webpack

webpack is a module bundler. Its main purpose is to bundle JavaScript files for usage in a browser, yet it is also capable of transforming, bundling, or packaging just about any resource or asset.

webpack.js.org

webpack 구조

위의 사진을 보시면 딱 원하는 것들이 나왔습니다.

저는 좌측에

 

.ts .js .scss .png, .jpg .html   .....   -> .html,.css,.js .jpg.png ... 이외 리소스 정도로 사용할수 있겠네요 

 

일단 webpack 을 설치 하여야 합니다.

 

npm i -D webpack webpack-cli webpack-dev-server

webpack , webpack-cli, webpack-dev-server 입니다. 

그리고 같은 프로젝트에 에 webpack.config.js 파일을 생성 합니다. 

webpack 기본 세팅을 하기 위해서는 여러가지 방법이 필요한데요

 

 

const path = require('path');
const HtmlWebPackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

module.exports = {
    name:'myTypeScript-setting',
    mode:'development', // "production" | "development" | "none"
    devtool:'eval',  // source-map   hidden-source-map
    resolve:{
        modules:['node_modules'],
        extensions:['.ts','json','.jsx','.scss','.css','.js'],
        alias:{
            "@gdlComponents":path.resolve(__dirname,'src/gdlComponents'),
            "@gdlCommonLayout":path.resolve(__dirname,'src/gdlComponents/CommonLayout'),
            "@gdlCommonWidget":path.resolve(__dirname,'src/gdlComponents/CommonWidget'),
            "@gdlUtils":path.resolve(__dirname,'src/gdlUtils'),
            "@gdlConfig":path.resolve(__dirname,'src/gdlConfig/_config'),
            "@userCSS":path.resolve(__dirname,'src/css/userCSS')
        }
    },
    entry:{
        index:['./src/index.ts']
    }, 

    module: {
		rules: [
			{
				test: /\.ts$/,
                use: ['ts-loader'],
                exclude:["/node_modules"]
            },

            {
                test:/\.html$/, // html loader
                use:[
                    {
                        loader:'html-loader',
                        options:{minimize:true}
                    }
                ]
            },
            {
                test:/\.scss$/,
                use:[
                    MiniCssExtractPlugin.loader,
                    'css-loader',
                    'sass-loader',
                ]
            },
            {
                test:/\.(png|svg|jpg|gif)$/,
                use:[
                    {
                        loader:'file-loader',
                        options:{
                            name:'[hash].[ext]', // [path][name].[ext]?[hash] result : path/to/file.png?e43b20c069c4a01867c31e98cbce33c9
                            outputPath:'res/images',
                            publicPath:'res/images'
                        }
                    }
                ]
              
                    
            },
        
		]
    },
    
    plugins:[
        new HtmlWebPackPlugin({
            template:'./src/index.html',
            filename:'./index.html'
        }),
        new MiniCssExtractPlugin({
            filename:'[name].css',
            chunkFilename:'[id].css'
        })
    ],
    optimization:{},
    output:{
        path:path.join(__dirname,'./dist/src'),
        filename:'[name].js'
    },
  
}

현재 제가 사용하고 있는 webpack.config.js 입니다. 

https://github.com/lgance/gdlComponent

 

lgance/gdlComponent

my TypeScript Play Ground. Contribute to lgance/gdlComponent development by creating an account on GitHub.

github.com

해당 코드는 위의 주소에서 계속 최신화를 하고 있습니다. 받으신 후에 

npm i

npm audit fix

npm start

하시면 dist폴더에서 index.html 을 더블클릭으로 결과물 확인이 가능합니다

 

코드 를 보여준 이유는 뭔가 기본적으로 딱 돌아가는 형태를 확인하면 이해하는데 있어서 훨씬 빠르게 이해할수 있기

 

때문입니다. 제가 만약에 계속 작성되는 코드 때문에 이글을 읽을 당시에 이해하기 힘들정도로 

 

코드가 많아 질수 있기 때문에 

 

2f75f71e41738ca5b3dcb85d521c9980bfcac647 < commit id  의 커밋을 받아서 확인해 보시면 될것 같습니다.

 

해당 커밋의결과 물은 

 

이와 같이 나타납니다. 하단의 img태그가 있긴 한데 이거는 아직 테스트용으로 index.html 에서 img태그 를 지우시면

 

문제없이 화면에 채워서 나타날 겁니다. 

 

다시 webpack.config.js 로 돌아오게 되면

 

기본적으로 중요하게 봐야 할 부분은

 

 

entry 

 

시작점을 뜻합니다. 현재 프로젝트에서 시작하여야 하는 소스코드의 위치를 뜻합니다. 저는 

./src/index.ts 로 작성이 되어있는데요 

 

해당 위치를 시작점으로 잡습니다. 

현재 프로젝트 구조인데요 보시면 ./src를 저는 기준으로 실 소스 코드를 작성하기 때문에 entry 포인트를 위와같이 잡았습니다.

webpack 명령어를 실행시 config를 확인하여서 src/index부터 번들링할 코드를 찾게 됩니다.

 

output

 

엔트리가 시작 점이였다면 아웃풋(output)은 끝점 어디로 나와야 하는가 입니다. 위의 사진에서 보면

 

좌측에 있는 여러가지 번들링되어야 하는 리소스(webpack 에선 모두 모듈이라고합니다.) 들이 이리저리 엮여있는데 

 

이 시작점은 entry 로 이미 지정이 되어있습니다.  그럼 다 묶인상태에서 어디로 나올것인가 에 대한 지정을 하는곳이 이

 

ouput 이라고 할수 있습니다.

 

위의 코드에 보시면 output은

 output:{
        path:path.join(__dirname,'./dist/src'),
        filename:'[name].js'
    },

로 되어있으니 현재 프로젝트 위치에서 ./dist/src에 번들링된 파일들이 나오게 될 것으로 보입니다. 

 

파일네임에 지정된 name값은  entry 에서 지정한 이름이 들어가게 됩니다.

entry:{
        index:['./src/index.ts']
    }, 

index라는 값이 들어갈 것 같습니다

 

현재까지 entry 와 output에 대해 작성하였는데 webpack 은 사실 더 복잡하고 세밀하게 제어가 됩니다. 

 

현재는 entry 와 output이 1개씩이지만 entry 를 여러개 만들어서 output을 대응시킬수도 있습니다. 

 

해당 작업은 추후에 작성해보면 될 것 같습니다. 

 

module

 

모듈 은 이제 중간 단계라고 보실수 있습니다. Entry 에서 시작점을 잡았고 해당 위치에서 엮어야 할 파일들을 다 엮은 

 

후에 output의 설정대로 dist(저는 dist로 설정)로 번들링된 결과물을 만들어 냅니다. 그러면 중간에 entry 로 부터

 

읽어들인 파일들을 어떤식으로 불러서 처리해야 할까? scss css ts이런것들은 그냥 부른다고 되는게 아니라 기존에는 

 

빌드 과정을 거쳐서 하였던 것들인데 이것들을 중간에 처리 해주는 과정이 있는데 이부분을 module 에 기록하며

 

각각의 파일들을 불러서 처리 해주는 녀석을 Loader (로더) 라고 합니다. webpack 은 파일들을 처리해주어야 하는데

 

JS만 동작하기 때문에 이부분들을 로더를 통해서 진행이 됩니다. 로더는 test 와 use로 동작하게 되는데 이중

 

test 어떠한 파일을 로딩할건지 지정 

 

use 해당 파일을 읽어 올 로더를 설정 

 

저는 일단 읽어와야 할 파일들이 html,ts scss, 이외 이미지 파일들 이 있기 때문에

 

ts-loader, html-loader, css-loader, sass-loader, file-loader를 사용 하였습니다. 이외에도 노드에서 sass를 읽어오기 위한

 

node-sass등 여러가지 디펜던시 등을 추가하였습니다. 아래 그림 참고

 

** npm i -D 로 설치 하셔야 합니다. 런타임에선 사용하지않기 때문에 devDependencies로 넣어야 합니다.

현재 사용하고있는 모듈들이며 모듈에 대해서 각각 따로 자료 조사를 해보면 더 쉽게 나오겠지만 간단하게만 설명을 하자면

 

css-loader  - css파일을 import하여 사용할수 있게 도와줌

style-loader - css를 style태그를 만들어서 index.html 에 추가를 도와줌

sass-loader - scss 파일을 css로 변환 ( node-sass 와 같이 사용하여야 함)

file-loader,url-loader - 리소스 파일들을 변환

html-loader - html 파일을 변환

html-webpack-plugin - html 파일을 변환시 해당 플러그인을 통하여 추가 변환

mini-css-extract-plugin - css파일을 새로하나 만들어서 번들링 (이게없을 경우 index.css가 생기지않아 한쪽에 css가 너무 많아져 성능 문제가 생김)

ts-loader - .ts파일들을 js로 변환 (tsconfig.json 을 참고하여 컴파일)

 

이제 맨 위에 있는 module중 ts-loader부터 말씀드리겠습니다.

 

 

ts-loader

 

말그대로 entry 포인트 부터 ts파일들을 찾아서 지정할 부분입니다. 보시면

( TypeScript를 안쓴다면 babel이 대체됩니다.  babel-loader 를 사용하시면 됩니다. )

 

{
     test: /\.ts$/,
     use: ['ts-loader'],
     exclude:["/node_modules"]
},

 

test - 어떠한 파일들을 로딩할지 정규식형태로 .ts로 되어있습니다.

user : ts-loader 해당 읽어들인 파일들을 어떠한 로더로 읽어올지 입니다. test에서 ts를 읽었기 때문에 ts-loader를

        선택하여 읽어 옵니다.

exclude: 선택옵션인데 읽지 말아야할 경로를 지정했습니다. 저는 node_modules를 했습니다.

 

 

html-loader

 

html을 만난다면 해당 html을 읽어서 번들링할때 포함해줍니다.

{
  test:/\.html$/, // html loader
    use:[
      {
      loader:'html-loader',
      options:{minimize:true}
      }
 	]
},

options : minimize:true  -> html 파일들을 공백 개행없이 만들어 줍니다. ( 더 많은 옵션은 html-loader 를 참조 )

 

이외에 모듈들도 위와같은 형태를 가지며

 

추가적으로 사용하고 있는 plugins하나만 소개해드리면

 

plugins

 

MiniCssExtractPlugin 을 사용하고있는데 이는 npm 에서 새로 설치 한후에 require로 가져와서

 

아래와같이 플러그인을 사용할수 있습니다. 

 

entry -> module( loader )  ->  plugins  -> output  와같이 중간단계에서 추가적으로 해주어야 할 작업들에 대해서

 

이와같이 webpack 자체적으로 추가하여 사용할수 있습니다.

 plugins:[
        new HtmlWebPackPlugin({
            template:'./src/index.html',
            filename:'./index.html'
        }),
        new MiniCssExtractPlugin({
            filename:'[name].css',
            chunkFilename:'[id].css'
        })
    ],

 

해당 설정들 말고 위에 resolve나 devtool, mode name 등에 대한 옵션들은 하나씩 찾아가며 하면 어렵지 않은 부분이라

 

이번 포스팅에서는 제외하였습니다.  webpack 이 한번에 이해가 안될때 보일러 플레이트 같은 프로젝트를 돌려보면

 

이해가 좀 쉬울거라고 생각되어집니다. 위의 공유된 github에서 clone후 실행해보면서 이해할수 있으면 좋을 것 같습니다.

 

 

우선 TypeScript 백문이 불 여일 타 라고 docs가 너무 잘되어있는 사이트가 있어서 한번 다 입력하면서 이것저것 내용들을 작성해볼까 합니다. 기존에 바닐라 JS도 TS로 이어서.. 진행하려고 합니다. 

 

앞으로 작성할 Type Script 일지에 관련된 URL을 2가지만 적고 가려고합니다.

 

// TypeScript Documentation korea Language 

https://typescript-kr.github.io/pages/tutorials/TypeScript%20in%205%20minutes.html

 

TypeScript 한글 문서

TypeScript 한글 번역 문서입니다

typescript-kr.github.io

 

TypeScript 설치 

Node.js와 NPM 이 설치되어있다는 가정하에 다음 명령어로 설치합니다.

npm i -g typescript

TypeScript 설치 확인 

npm ls -g --depth=0

TypeScript @3.4.5 가 확인됩니다.

자 설치가 확인됐으면 Lint를 설치하러 갑니다.

사실 Lint를 없어도 TypeScript는 tsc라는 명령어를 통해서 컴파일을 하게 되는데 이 부분에서 에러가 있다면 알아서 다 잡아줍니다. (에러가 있다고 컴파일이 안되진 않습니다. 경고를 통해서 알려줄 뿐)

 

test.tsc 파일을 생성하고 아래와 같은 코드를 입력합시다. 

function greeter(person:string){
	return 'hello, ' + person;
}

greeter(1);

와 같이 적었을 경우 에러를 vsc자체에서는 보여주지 않습니다. 하지만 tsc 명령어를 통해서 빌드하게 되면 아래와 같이 에러 부분을 보여주게 됩니다.

 

아래의 명령어를 입력하게 되면 TypeScript 가 컴파일을 해주게 됩니다.

tsc test.ts

에러는 났지만 정상적으로 컴파일이 된 상태 

이외 기본적인 튜토리얼들은 TypeScript 공식을 참조 

 

하지만 언제나 많은 코드들을 매번 컴파일하는 거보다 에디터에서 미리 볼 수 있으면 좋기 때문에 Visual Studio Code에 확장으로 TSLint를 설치합니다.

 

TSlint 

Ctrl + Shift + X (입력)

가장 다운로드 많은 것을 설치하자!(deprecated 는 제외)

이제 위의 greeter를 다시 가보면 아래 사진과 같이 잘못된 부분을 잡아 주는 효과를 볼 수 있습니다.

 

TSLint의 효과!!

사실 Lint는 해당 내용보다는 autofix라고 해서 자동으로 값이나 필요한 구문들을 도와주는 기능이 핵심이라고 볼 수 있습니다. (C 나 JAVA에서 Assist라고도 하는)

 

tslint 확장을 제어하기 위해서 tslint 모듈도 설치합니다.

 

npm i -g tslint

tslint --init

tslint.json 에 있는 설정을 통해서 여러 가지 룰이나 룰에 적용되는 위치 등을 설정할 수 있습니다. (tslint.json이나 tsconfig.json 은 경험을 쌓다가 한 번에 정리하도록 하겠습니다.)

 

tslint 사용 전에 eslint와 문제로 인해서 vsc에서 수정하여야 할 부분이 있습니다.

settings 관련 내용

https://code.visualstudio.com/docs/getstarted/settings

 

Ctrl + Shift + P  -> settings 입력 - > 기본 설정 : 설정 열기 (JSON)

 

설정 파일(settings.json)에 아래 값을 입력합니다.

 "editor.formatOnSave": false,
  "tslint.autoFixOnSave": true, 

Unknown configuration setting 이 뜨게 되는 경우가 있는데요 

 

네... deprecated 됐다고 합니다.  프리티어로 변경합시다.

https://marketplace.visualstudio.com/items?itemName=eg2.tslint

 

TSLint (deprecated) - Visual Studio Marketplace

vscode-tslint (deprecated) Note: This extension has been deprecated in favor of the vscode-typescript-tslint-plugin. To learn about the differences between vscode-tslint and the new extension please refer to this document. Integrates the tslint linter for

marketplace.visualstudio.com

npm uninstall -g tslint 

제거 

 

VSCode Prettier Configuration( 프리티어 세팅 )

 

1. Prettier VSC에서 설치 

2. Ctrl + Shift + P  -> settings -> 기본 설정 (JSON)

"editor.formatOnSave": true 입력

3. npm 프리티어 설치 

npm i tslint-config-prettier

4. tslint.json 수정

{
  "defaultSeverity": "error",
  "extends": ["tslint:latest", "tslint-config-prettier"],
  "jsRules": {},
  "rules": {
    "semicolon": true
  },
  "rulesDirectory": []
}

5. test.js 작성 

let test = "test" 

6. 저장 시 자동으로 ; 가 붙는 현상 확인 

 

 

tslint.json rules

https://palantir.github.io/tslint/rules/

tsconfig.json 

https://www.typescriptlang.org/docs/handbook/tsconfig-json.html

tsconfig Schema 타입 스크립트 스키마 파일입니다.

http://json.schemastore.org/tsconfig

 


tsconfig.json

TypeScript에서 사용되는 환경 설정이라고 보시면 됩니다. 컴파일 옵션 (webpack 유사)

해당 파일을 생성하기 위해서 아래의 명령어를 입력합니다.

tsc --init

tsconfig.json

위의 옵션들은 너무 설명들이 많은데 간단하게 옆에 주석처리는 되어있습니다.

그리고 또 하나 문제점이 같은 위치에 ts와 js가 나눠져 있는데  코드를 작성하는 부분과 빌드된 부분들을 나눠야 할 것으로 보입니다.

 

결론은 TypeScript 세팅을 위해서

 

1. VSC에서 프리티어 확장을 설치 

2. npm에서 TypeScript (글로벌)와  tslint-config-prettier를 설치 후 vscode settings.json 에 

              "editor.formatOnSave": true, 추가 

3. tsc--init으로 tsconfig.json 생성 tslint.json으로 기본 룰 생성 

2. npm i prettier 설치

3. package.json 내에 prettier key 설정

package.json

 

  "prettier": {
    "printWidth": 80,
    "useTabs": false,
    "tabWidth": 2,
    "bracketSpacing": true,
    "semi": true,
    "singleQuote": false
  }
}

 

4. editor.formatOnSave true 설정

 

TypeScript 시작 전 환경 설정 완료

 

** 추가 사항  저는 사실 TypeScript 만 프리티어가 적용됐으면 하는데  기존에 사용하던 js들도 적용이 되서

아래와 같이 기본 formatOnSave는 true로 놓고  javascript 만 false하였습니다. 

 

 "editor.formatOnSave": true,
  "[javascript]": {
    "editor.formatOnSave": false
  }

위 방법 또는

 "editor.formatOnSave": false
"[typescript]": {
    "editor.formatOnSave": true,
  },

 

 

+ Recent posts