๐Ÿ”จ typescript๋กœ ์›น ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค!๐Ÿ”ฅ

11692 ๋‹จ์–ด typescriptdevopswebdevjavascript

๐Ÿ‘‹๐Ÿป ์†Œ๊ฐœํ•˜๋‹ค.


Pixuim์—์„œ ์šฐ๋ฆฌ๋Š” ๊ฐ์ข… ์‚ฌ์ดํŠธ๋ฅผ ์œ„ํ•ด ์›น ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์ž์ฃผ ๋ฐœ๊ฒฌํ•œ๋‹ค.
์ด๊ฒƒ์€ script ํƒœ๊ทธ๋ฅผ ํ†ตํ•ด ํ†ตํ•ฉํ•œ ๋‹ค์Œ ์ฝ”๋“œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ํŒจํ‚ค์ง€๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:
<script src="https://mycdn.a/latest/bundle.js"></script>
<script>
    pixiumPackage.helloWorld()
</script>
์ด ํŒจํ‚ค์ง€๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๊ณผ์ •์—์„œ ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  package.json ์Šคํฌ๋ฆฝํŠธ์™€ ์ •๋ณด๋ฅผ ๋‹ค์‹œ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์ž์ฃผ ๋ฐœ๊ฒฌํ•œ๋‹ค.๋”ฐ๋ผ์„œ ์‰ฝ๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ํ…œํ”Œ๋ฆฟ์„ ๋งŒ๋“ค๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ด ๊ธ€์—์„œ ์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ค ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ด ์Šˆํผ ํ…œํ”Œ๋ฆฟ์„ ๋งŒ๋“ค์—ˆ๋Š”์ง€ ๋ณผ ๊ฒƒ์ด๋‹ค!

๐Ÿ”ง ์‚ฌ์šฉ๋œ ๋„๊ตฌ


๋‹ค์Œ์€ ์‚ฌ์šฉํ•œ ๋„๊ตฌ์˜ ๋น ๋ฅธ ๋ชฉ๋ก๊ณผ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋น ๋ฅธ ์„ค๋ช…์ž…๋‹ˆ๋‹ค
๊ณต๊ตฌ.
๋ฌ˜์‚ฌ
์‚ฌ์„ 
ํŒจํ‚ค์ง€ ์„ค์น˜ ์ฒ˜๋ฆฌ
Npm
๊ฐ€๋ฐฉ์„ npm ๋“ฑ๋กํ‘œ์— ๋ฐœํ‘œ
ํƒ€์ž ์›๊ณ 
๊ฐ•๋ ฅํ•œ ์œ ํ˜• JavaScript
์›น ํŒจํ‚ค์ง€
typescript๋ฅผ ๋‹จ์ผ JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋ฒˆ๋“ค
๋ˆˆ์ด ์Œ“์ด๋‹ค
ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ํ•ซ ๋ชจ๋“ˆ ๋‹ค์‹œ ๋กœ๋“œ
๋™์‹œ์—
๋™์‹œ์— ์—ฌ๋Ÿฌ ๋ช…๋ น ์‹คํ–‰

๐Ÿ—„๏ธ ๊ด€๋ฆฌ ๊ตฌ์กฐ


ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์˜ ํด๋”์™€ ํŒŒ์ผ์„ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค

webpack-demo/
โ”œโ”€โ”€ README.md
โ”œโ”€โ”€ dist
โ”œโ”€โ”€โ”€โ”€...
โ”œโ”€โ”€ node_modules
โ”œโ”€โ”€โ”€โ”€...
โ”œโ”€โ”€ package.json
โ”œโ”€โ”€ snowpack.config.js
โ”œโ”€โ”€ src
โ”œโ”€โ”€โ”€โ”€...
โ”œโ”€โ”€ test
โ”œโ”€โ”€โ”€โ”€...
โ”œโ”€โ”€ tsconfig.json
โ”œโ”€โ”€ webpack.config.js
โ””โ”€โ”€ yarn.lock
๋ณด์‹œ๋‹ค์‹œํ”ผ ํ”„๋กœ์ ํŠธ์—๋Š” 4๊ฐœ์˜ ์ฃผ์š” ํด๋”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
ํด๋”
์‚ฌ์šฉ
๊ฑฐ๋ฆฌ
์ปดํŒŒ์ผ๋œ ์ค€๋น„ ๊ฒŒ์‹œ ํŒจํ‚ค์ง€ ํฌํ•จ
๋…ธ๋“œ ๋‹จ์œ„
ํ”„๋กœ์ ํŠธ์— ํ•„์š”ํ•œ ๋ชจ๋“  npm ํŒจํ‚ค์ง€
src
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์›๋ณธ ํŒŒ์ผ
ํ…Œ์ŠคํŠธ
ํŒจํ‚ค์ง€๋ฅผ ์ธ์šฉํ•˜์—ฌ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๋Š” ์ธ๋ฑ์Šค ํŒŒ์ผ

๐Ÿ•ธ ์›น ํŒจํ‚ค์ง€


์ด ํ”„๋กœ์ ํŠธ์—์„œ ์šฐ๋ฆฌ๋Š” webpack์™€ ts-loader๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.Webpack๋Š” ๋ธŒ๋ผ์šฐ์ €์— ๊ณต๊ฐœ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ๋‚ด์šฉ์— ์‚ฌ์šฉ๋˜๋ฉฐ ts-loader ํ•„์š”ํ•œ typescript๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
์›น ํŒจํ‚ค์ง€ ์„ค์ •์— ๋Œ€ํ•ด output:library ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณต๊ฐœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
์›น ํŒจํ‚ค์ง€.๋ฐฐ์น˜ํ•˜๋‹ค.js
const path = require('path');

module.exports = {
    entry: './src/index.ts',
    module: {
        rules: [
            {
                test: /\.tsx?$/,
                use: 'ts-loader',
                exclude: /node_modules/,
            },
        ],
    },
    resolve: {
        extensions: ['.tsx', '.ts', '.js'],
    },
    output: {
        // Define the package name
        library: 'pixiumPackage',
        libraryTarget: 'umd',
        globalObject: 'this',
        filename: 'bundle.js',
        path: path.resolve(__dirname, 'dist'),
    },
};
์ฆ‰, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
<script>
    pixiumPackage.myFunctionName()
    pixiumPackage.myClassName()
</script>

โ„๏ธ๏ธ ๋ˆˆ์ด ์Œ“์ด๋‹ค


Snowpack๋Š” ์ตœ๊ทผ์— Pixium์—์„œ ๋ฐœ๊ฒฌํ•œ ํ›Œ๋ฅญํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.์ด๊ฒƒ์€ ํ˜„๋Œ€์˜ ์ „๋‹จ ๊ตฌ์ถ• ๋„๊ตฌ๋กœ ์†๋„๊ฐ€ ๋งค์šฐ ๋น ๋ฅด๋‹ค!

์ด ํ”„๋กœ์ ํŠธ์—์„œ ์Šค๋…ธ์šฐํŒฉ์˜ ์‚ฌ์šฉ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๋‹ค.ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์‹œ๊ฐํ™”ํ•˜์—ฌ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.์ด๊ฒƒ์€ ์—ด ๋ชจ๋“ˆ ๊ต์ฒด๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์›น ํŒจํ‚ค์ง€๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ƒˆ ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•˜๊ณ  ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์ด ๋‹ค์‹œ ๋ถˆ๋Ÿฌ์˜จ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ ์„ค๋ฐฐ์น˜ํ•˜๋‹ค.js
/** @type {import("snowpack").SnowpackUserConfig } */
module.exports = {
    mount: {
        test: '/',
        dist: '/dist',
    },
    plugins: ['@snowpack/plugin-typescript'],
    install: [
        /* ... */
    ],
    installOptions: {
        installTypes: true,
    },
};
์—ฌ๊ธฐmount ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๊ฐ€์žฅ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
  • test: '/',๋Š” ํ…Œ์ŠคํŠธ ํด๋”๋ฅผ ์›น์˜ ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ๋งˆ์šดํŠธํ•  ๊ฒƒ์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค
  • dist: '/dist'๋Š” ๋””์Šค์ผ“ ํด๋”๋ฅผ /dist์— ๋ถˆ๋Ÿฌ์˜ฌ ๊ฒƒ์ด๋ผ๊ณ  ๋ฐํ˜”๋‹ค.์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๋””์ŠคํŠธ์—์„œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด <script src="./dist/bundle.js"></script>
  • ๐Ÿ’ป ์ €ํฌ ์ฝ”๋“œ ๊ณต๊ฐœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


    ์ด์ œ ์ฝ”๋“œ์™€ ์ƒ์ˆ˜, ํ•จ์ˆ˜, ํด๋ž˜์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ๊ณต๊ฐœํ•˜๋Š”์ง€ ์‚ดํŽด๋ด…์‹œ๋‹ค.

    ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ ‘๊ทผ ์ฝ”๋“œ๋ฅผ ํ†ต๊ณผํ•˜๋ ค๋ฉด export ๋ฐฉ๋ฒ•๋งŒ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    /**
     * Say hello world in the console
     */
    export const PixiumHello = () => {
        console.log(`hello world`)
    }
    
    ์šฐ๋ฆฌ๋Š” ์•„๋ž˜์˜ ๋ฐฉ์‹์œผ๋กœ ๊ทธ๊ฒƒ์„ ํ˜ธ์นญํ•  ์ˆ˜ ์žˆ๋‹ค.
    <script>
    pixiumPackage.PixiumHello()
    </script>
    
    ๋˜ํ•œ ํด๋ž˜์‹ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด DOM์™€ ์†์‰ฝ๊ฒŒ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    // Set the inner text
    document.getElementById("pixiumBanner").innerText = "Pixium Digital Pte Ltd";
    

    ๐Ÿ ๊ฒฐ๋ก 


    ์šฐ๋ฆฌ๋Š” ํ…Œ์ŠคํŠธ์— ํŽธ๋ฆฌํ•˜๋„๋ก ์•„์ฃผ ๊ฐ„๋‹จํ•œ typescript ๊ท€์†๊ณผ HMR ์‹œ์Šคํ…œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
    ํŒจ์น˜, ๋ถ€์ฐจ์ ์ธ ํ”„๋กœ๊ทธ๋žจ, ์ฃผ์š” ํ”„๋กœ๊ทธ๋žจ์„ npm๋กœ ์‰ฝ๊ฒŒ ์ „์†กํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ช…๋ น ๋‹จ์ถ• ๋ฐฉ์‹์ด ์žˆ๋‹ค.
    ์ด ๋ชจ๋“  ๊ฒƒ์— CDN์„ ๋”ํ•˜๋ฉด, ๋„ˆ๋Š” ๋„ˆ์˜ ์•ž๋ถ€๋ถ„์— ๋†€๋ผ์šด ๋น ๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.
    ์ „๋ฉด ํ™˜๋งค

    ์Šคํ‚จ ๋””์ง€ํ„ธ / typescript ํŒจํ‚ค์ง€ ํ…œํ”Œ๋ฆฟ


    typescript ์ง€์› ์›น ํŒจํ‚ค์ง€


    Typescript ํŒจํ‚ค์ง€ ํ…œํ”Œ๋ฆฟ


    ์ด ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ์—์„œ ์›น์„ ์œ„ํ•œ ์•„์ฃผ ๊ธฐ๋ณธ์ ์ธ typescript ํŒจํ‚ค์ง€๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.
    ์šฐ๋ฆฌ๋Š” ์›น ํŒจํ‚ค์ง€๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์— ๊ฐ€๋ฐฉ์„ ๊ณต๊ฐœํ•ฉ๋‹ˆ๋‹ค.

    ์žฅ์น˜


    ๋‹ค์Œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ dev ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
    yarn
    

    ๋ฐœ์ „์‹œํ‚ค๋‹ค

    yarn start
    
    ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ปดํŒŒ์ผํ•˜๊ธฐ ์œ„ํ•ด ์›น ํŒจํ‚ค์ง€๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
    ๋˜ํ•œ snowpack์„ ์‹œ์ž‘ํ•˜์—ฌ ์ƒ‰์ธ์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.์›น ํŒจํ‚ค์ง€์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ปดํŒŒ์ผ๋˜๋ฉด html์ด ํ…Œ์ŠคํŠธ๋ฉ๋‹ˆ๋‹ค

    ์ง“๋‹ค

    yarn build
    

    ํŒจํ‚ค์ง€ ๊ฒŒ์‹œ


    npm cli์— ๋กœ๊ทธ์ธํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋จผ์ € ๋กœ๊ทธ์ธํ•˜์‹ญ์‹œ์˜ค.
    npm login
    
    package.json์—์„œ ๋‹ค์Œ ์ค„์„ ์‚ญ์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    private: true,
    
    ํŒจ์น˜ ๊ฒŒ์‹œ
    yarn patch
    
    ๋ฏธ์„ฑ๋…„์ž ๋…ผ๋ฌธ์„ ๋ฐœํ‘œํ•˜๋‹ค
    yarn minor
    
    ๋ฐœํ‘œ ์ „๋ฌธ
    yarn major
    
    View on GitHub
    PixUIM Digital - ๊ธฐ์ˆ  ๋ฐ ํ˜์‹ ์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์™„์„ฑํ•˜์‹ญ์‹œ์˜ค.
    https://pixiumdigital.com
    https://github.com/pixiumdigital

    ์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ