Razzle: Typescript๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

์— ๋งŒ๋“  2019๋…„ 04์›” 14์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: jaredpalmer/razzle

๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๊ณ  ํ•œ ๋ฒˆ์— ํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ Typescript๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

--with-typescript๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ ํ•œ ๋ฒˆ์— ๋ชจ๋“  ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ๋ฐ”๊ฟ”์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ํŒŒ์ผ์ด typescript ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ์ฑ„ํƒํ•˜๋Š” ๋™์•ˆ ๋ณ€ํ™˜๋˜์ง€ ์•Š์€ ํŒŒ์ผ์ด ์ดˆ๊ธฐ ํ™•์žฅ์ž๋ฅผ ์œ ์ง€ํ•˜๋„๋ก ์ฒœ์ฒœํžˆ ๋ณ€ํ™˜ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

razzle์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋‚˜์š”?

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

์•Œ์•„๋ƒˆ์–ด!

npm i -D @babel/preset-typescript ts-loader typescript

.babelrc์— @babel/typescript ์ถ”๊ฐ€

"presets": [
    "razzle/babel",
    "@babel/typescript"
]

์ด๊ฒƒ์„ razzle.config.js์— ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

config.resolve.extensions = config.resolve.extensions.concat(['.ts', '.tsx']);
config.module.rules.push({ test: /\.tsx?$/, loader: 'ts-loader' });

tsconfig.json ์ƒ์„ฑ

{
    "compilerOptions": {
        "experimentalDecorators": true,
        // Target latest version of ECMAScript.
        "target": "esnext",
        // Search under node_modules for non-relative imports.
        "moduleResolution": "node",
        // Process & infer types from .js files.
        "allowJs": false,
        // Enable strictest settings like strictNullChecks & noImplicitAny.
        "strict": false,
        // Disallow features that require cross-file information for emit.
        "isolatedModules": true,
        // Import non-ES modules as default imports.
        "esModuleInterop": true,
        "jsx": "react"
    },
    "include": [
        "src"
    ],
    "exclude": [
        "node_modules",
    ]
}

์ด์ œ ํ™•์žฅ๋ช…์„ .ts ๋ฐ .tsx๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ํ•ด๋‹น ํŒŒ์ผ์— ๋Œ€ํ•œ typescript๋ฅผ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š” with-typescript ์˜ˆ์ œ๋ฅผ jsx ํŒŒ์ผ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์˜ ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ํ—ˆ์šฉํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๋ˆ„๊ตฌ๋“ ์ง€ ์ด ๋ชฉํ‘œ๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์•Œ์•„๋ƒˆ์–ด!

npm i -D @babel/preset-typescript ts-loader typescript

.babelrc์— @babel/typescript ์ถ”๊ฐ€

"presets": [
    "razzle/babel",
    "@babel/typescript"
]

์ด๊ฒƒ์„ razzle.config.js์— ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

config.resolve.extensions = config.resolve.extensions.concat(['.ts', '.tsx']);
config.module.rules.push({ test: /\.tsx?$/, loader: 'ts-loader' });

tsconfig.json ์ƒ์„ฑ

{
    "compilerOptions": {
        "experimentalDecorators": true,
        // Target latest version of ECMAScript.
        "target": "esnext",
        // Search under node_modules for non-relative imports.
        "moduleResolution": "node",
        // Process & infer types from .js files.
        "allowJs": false,
        // Enable strictest settings like strictNullChecks & noImplicitAny.
        "strict": false,
        // Disallow features that require cross-file information for emit.
        "isolatedModules": true,
        // Import non-ES modules as default imports.
        "esModuleInterop": true,
        "jsx": "react"
    },
    "include": [
        "src"
    ],
    "exclude": [
        "node_modules",
    ]
}

์ด์ œ ํ™•์žฅ๋ช…์„ .ts ๋ฐ .tsx๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ํ•ด๋‹น ํŒŒ์ผ์— ๋Œ€ํ•œ typescript๋ฅผ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฏธ๋ž˜์—์„œ ์—ฌ๊ธฐ๋กœ ์˜ค๋Š” ๊ฒฝ์šฐ ์—ฌ๊ธฐ์—์„œ ํ›Œ๋ฅญํ•œ razzle ์ง€์› typescript ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ™•์ธ ํ•˜์‹ญ์‹œ์˜ค .

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

๊ด€๋ จ ๋ฌธ์ œ

dizzyn picture dizzyn  ยท  3์ฝ”๋ฉ˜ํŠธ

howardya picture howardya  ยท  5์ฝ”๋ฉ˜ํŠธ

ewolfe picture ewolfe  ยท  4์ฝ”๋ฉ˜ํŠธ

knipferrc picture knipferrc  ยท  5์ฝ”๋ฉ˜ํŠธ

JacopKane picture JacopKane  ยท  3์ฝ”๋ฉ˜ํŠธ