SlideShare a Scribd company logo
1 of 13
Download to read offline
codesplit
임광규
2020.ReactJS 1
codesplit
리액트프로젝트를완성하여사용자에게제공할때는 빌드 작업을거쳐서배포합니다.
빌드작업을통해프로젝트에서사용되는자바스크립트파일안에서불필요한 주석 , 경고 메시
지 , 공백 등을제거하여파일크기를최소화하고브라우저에서JSX문법이나다른최신자바스
크립트문법이원활하게실행되도록코드의 트랜스파일 작업도합니다.
이런작업은웹팩(webpack)이라는도구를사용합니다.
웹펙에서별도의설정을하지않으면프로젝트에서사용중인모든자바스크립트파일이하나의
파일로합쳐지고,모든CSS파일도하나의파일로합처집니다.
2020.ReactJS 2
reactstandardcodesplit
Create-React-app을이용하여프로젝트를생성하면최소두개이상의자바스크립트파일이
생성됩니다.
기본설정에는SplitChunks라는기능이적용되어node_modules에서불러온파일,일정크기이상
의파일,여러파일간의공유돈파일을자동으로따로분리시켜서캐싱의효과를제공합니다.
2020.ReactJS 3
build결과
/build/static/js밑에2.XXXX로시작하는파일이포함되어있습니다.
2로시작하는파일에는React,ReactDOM등node_modules에서불러온라이브러리관련코
드가들어있고,main으로시작하는파일에는직접프로젝트에작성하는App같은컴포넌트에
대한코드가들어있습니다.
소스코드를수정후다시빌드를해도node_modules의변경없이2.XXXX파일명은변하지않습니
다.
이렇게파일을분리하는작업을코드스프리팅이라고합니다.
2020.ReactJS 4
Reactcodesplit
Create-React-app으로생성된프로젝트에는단순히효율적인캐싱효과만있습니다.
A,B,C로구성되었고A페이지에서는B페이지와C페이지에서사용하는컴포넌트는필요하
지않습니다.
하지만리액트프로젝트에서별도로설정하지않으면A,B,C컴포넌트에대한코드가모두한파일
(main)에저장됩니다.
애플리케이션의규모가커지면지금당장필요하지않는컴포넌트정보도모두불러서파일크기가매
우커집니다.
이런문제를해결해줄수있는방법이바로 코드 비동기 로딩 입니다.
코드비동기로딩을통해자바스크립트함수,객체혹은컴포넌트를처음에는불러오지않고필요한시
점에불러와서사용할수있습니다.
2020.ReactJS 5
자바스크립트함수비동기로딩
일반자바스크립트함수를스플리팅해본니다.
hi.js
export default () = {
alert("hi");
}
일반호출
import React from 'react';
import SayHi from './hi';
export default () = {
const onClick = () => sayHi();
return <div onClick={onClick}>HI</div>;
}
2020.ReactJS 6
비동기로딩
import React from 'react';
export default () => {
const onClick = () => {
import('./hi').then(result => result.default());
};
return <div onClick={onClick}>HI</div>;
}
이렇게import를함수로사용하는문법은아직표준자바스크립트가아니지만dynamicimport라는
문법입니다.현재웹팩에서지원하고있음으로별도의설정없이프로젝트에바로사용할수있습니다.
이렇게불러온모듈에서default로내보낸것은result.default로참조해야사용할수있습니다.
2020.ReactJS 7
React.lazy와Suspense를이용한컴포넌트코드스플리팅
React.lazy와Suspense기능은리액트v16.6에도입되었습니다.
import React, { Suspense } from 'react';
const SayHi = React.lazy(() => import('./hi'));
export default () => {
const [visible, setVisible] = React.useState(false);
const onClick = () => setVisible(true);
return (
<div>
<p onClick={onClick}>HI</p>
<Suspense fallback={<div>loading...</div>}>
{visible && <SayHi />}
</Suspense>
</div>
);
}
2020.ReactJS 8
LoadableComponents를통한코드스플리팅
LoadableComponents는코드스플리팅을편하게하도록도와주는서드파티라이브러리입
니다.
이라이브러리의장점은서버사이느랜더링(SRR)을지원한다는것입니다.
또한랜더링하기전에필요한스프리팅된파일을미리불러올수있는기능도제공합니다.
서버사이드랜더링이란웹서비스의초기로딩속도개선,캐시및검색엔진최적화를가능하게해주는기술입니
다.서버사이드랜더링을사용하면웹서비스의초기랜더링을사용자의브라우정가아닌서버쪽에서처리합니
다.
2020.ReactJS 9
설치&사용예
$ yarn add @loadable/component
or
$ npm install @loadable/component --save
import React from 'react';
import loadable from '@loadable/component';
const SayHi = loadable(() => import('./hi'));
export default () => {
const [visible, setVisible] = React.useState(false);
const onClick = () => setVisible(true);
return (
<div>
<p onClick={onClick}>HI</p>
{visible && <SayHi />}
</div>
);
}
2020.ReactJS 10
로딩중다른UI를보여주고싶다면loadable를사용하는부분을다음과같이
수정합니다.
const SayHi = loadable(() => import('./hi'), {
fallback: <div>loading...</div>
});
2020.ReactJS 11
컴포넌트미리불러오기
마우스커서를올리기만해도로딩이시작됩니다.
import React from 'react';
import loadable from '@loadable/component';
const SayHi = loadable(() => import('./hi'));
export default () => {
const [visible, setVisible] = React.useState(false);
const onClick = () => setVisible(true);
const onMouseOver = () => SayHi.preload();
return (
<div>
<p onClick={onClick} onMouseOver={onMouseOver}>HI</p>
{visible && <SayHi />}
</div>
);
}
2020.ReactJS 12
마치며
React.lazy / Suspese 와 Loadable Components 의가장큰차이는서버사이드랜더링
(SRR)입니다.
서버사이드랜더링을구현할예정이면LoadableComponents를사용하도록래엑트공식문서에도
권장하고있습니다.
2020.ReactJS 13

More Related Content

Similar to 13.code split

Spring Boot + React + Gradle in VSCode
Spring Boot + React + Gradle in VSCodeSpring Boot + React + Gradle in VSCode
Spring Boot + React + Gradle in VSCodedpTablo
 
[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...
[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...
[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...JinKwon Lee
 
Backend Master | 3.1.1 Build - JS build tools
Backend Master | 3.1.1 Build - JS build toolsBackend Master | 3.1.1 Build - JS build tools
Backend Master | 3.1.1 Build - JS build toolsKyunghun Jeon
 
How to build Design System?
How to build Design System?How to build Design System?
How to build Design System?John Kim
 
최근 Javascript framework 조사
최근 Javascript framework 조사최근 Javascript framework 조사
최근 Javascript framework 조사Kichul Jung
 
Single-page Application
Single-page ApplicationSingle-page Application
Single-page ApplicationSangmin Yoon
 
모듈시스템과 webpack
모듈시스템과 webpack모듈시스템과 webpack
모듈시스템과 webpackDataUs
 
Big Data platform을 위한 Sencha Ext JS 사례.
Big Data platform을 위한 Sencha Ext JS 사례.Big Data platform을 위한 Sencha Ext JS 사례.
Big Data platform을 위한 Sencha Ext JS 사례.효근 박
 
Front end dev 2016 & beyond
Front end dev 2016 & beyondFront end dev 2016 & beyond
Front end dev 2016 & beyondJae Sung Park
 
프론트엔드 개발 첫걸음
프론트엔드 개발 첫걸음프론트엔드 개발 첫걸음
프론트엔드 개발 첫걸음DataUs
 
Javascript everywhere - Node.js | Devon 2012
Javascript everywhere - Node.js | Devon 2012Javascript everywhere - Node.js | Devon 2012
Javascript everywhere - Node.js | Devon 2012Daum DNA
 
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트Dae Kim
 
[2022]Flutter_IO_Extended_Korea_멀티모듈을활용한플러터클린아키텍처_...
[2022]Flutter_IO_Extended_Korea_멀티모듈을활용한플러터클린아키텍처_...[2022]Flutter_IO_Extended_Korea_멀티모듈을활용한플러터클린아키텍처_...
[2022]Flutter_IO_Extended_Korea_멀티모듈을활용한플러터클린아키텍처_...Taekyu Lim
 
프론트엔드 개발자의 자바스크립트
프론트엔드 개발자의 자바스크립트 프론트엔드 개발자의 자바스크립트
프론트엔드 개발자의 자바스크립트 jeong seok yang
 
Lablupconf session8 "Paving the road to AI-powered world"
Lablupconf session8 "Paving the road to AI-powered world"Lablupconf session8 "Paving the road to AI-powered world"
Lablupconf session8 "Paving the road to AI-powered world"Lablup Inc.
 
오픈소스 프레임워크 기반 웹 서비스 설계 (Example)
오픈소스 프레임워크 기반 웹 서비스 설계 (Example)오픈소스 프레임워크 기반 웹 서비스 설계 (Example)
오픈소스 프레임워크 기반 웹 서비스 설계 (Example)중선 곽
 
Customizing Gis Programs
Customizing Gis ProgramsCustomizing Gis Programs
Customizing Gis ProgramsMinPa Lee
 
Gradle Kotlin 컨벤션 플러그인으로 효율적으로 멀티 모듈 관리하기
Gradle Kotlin 컨벤션 플러그인으로 효율적으로 멀티 모듈 관리하기Gradle Kotlin 컨벤션 플러그인으로 효율적으로 멀티 모듈 관리하기
Gradle Kotlin 컨벤션 플러그인으로 효율적으로 멀티 모듈 관리하기YoungjikYoon
 
생산성을 높여주는 iOS 개발 방법들.pdf
생산성을 높여주는 iOS 개발 방법들.pdf생산성을 높여주는 iOS 개발 방법들.pdf
생산성을 높여주는 iOS 개발 방법들.pdfssuserb942d2
 

Similar to 13.code split (20)

Spring Boot + React + Gradle in VSCode
Spring Boot + React + Gradle in VSCodeSpring Boot + React + Gradle in VSCode
Spring Boot + React + Gradle in VSCode
 
[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...
[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...
[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...
 
Backend Master | 3.1.1 Build - JS build tools
Backend Master | 3.1.1 Build - JS build toolsBackend Master | 3.1.1 Build - JS build tools
Backend Master | 3.1.1 Build - JS build tools
 
How to build Design System?
How to build Design System?How to build Design System?
How to build Design System?
 
최근 Javascript framework 조사
최근 Javascript framework 조사최근 Javascript framework 조사
최근 Javascript framework 조사
 
Single-page Application
Single-page ApplicationSingle-page Application
Single-page Application
 
모듈시스템과 webpack
모듈시스템과 webpack모듈시스템과 webpack
모듈시스템과 webpack
 
Big Data platform을 위한 Sencha Ext JS 사례.
Big Data platform을 위한 Sencha Ext JS 사례.Big Data platform을 위한 Sencha Ext JS 사례.
Big Data platform을 위한 Sencha Ext JS 사례.
 
Front end dev 2016 & beyond
Front end dev 2016 & beyondFront end dev 2016 & beyond
Front end dev 2016 & beyond
 
프론트엔드 개발 첫걸음
프론트엔드 개발 첫걸음프론트엔드 개발 첫걸음
프론트엔드 개발 첫걸음
 
Javascript everywhere - Node.js | Devon 2012
Javascript everywhere - Node.js | Devon 2012Javascript everywhere - Node.js | Devon 2012
Javascript everywhere - Node.js | Devon 2012
 
Sencha ExtJS를 활용한 Big Data Platform 개발 사례
Sencha ExtJS를 활용한 Big Data Platform 개발 사례 Sencha ExtJS를 활용한 Big Data Platform 개발 사례
Sencha ExtJS를 활용한 Big Data Platform 개발 사례
 
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
 
[2022]Flutter_IO_Extended_Korea_멀티모듈을활용한플러터클린아키텍처_...
[2022]Flutter_IO_Extended_Korea_멀티모듈을활용한플러터클린아키텍처_...[2022]Flutter_IO_Extended_Korea_멀티모듈을활용한플러터클린아키텍처_...
[2022]Flutter_IO_Extended_Korea_멀티모듈을활용한플러터클린아키텍처_...
 
프론트엔드 개발자의 자바스크립트
프론트엔드 개발자의 자바스크립트 프론트엔드 개발자의 자바스크립트
프론트엔드 개발자의 자바스크립트
 
Lablupconf session8 "Paving the road to AI-powered world"
Lablupconf session8 "Paving the road to AI-powered world"Lablupconf session8 "Paving the road to AI-powered world"
Lablupconf session8 "Paving the road to AI-powered world"
 
오픈소스 프레임워크 기반 웹 서비스 설계 (Example)
오픈소스 프레임워크 기반 웹 서비스 설계 (Example)오픈소스 프레임워크 기반 웹 서비스 설계 (Example)
오픈소스 프레임워크 기반 웹 서비스 설계 (Example)
 
Customizing Gis Programs
Customizing Gis ProgramsCustomizing Gis Programs
Customizing Gis Programs
 
Gradle Kotlin 컨벤션 플러그인으로 효율적으로 멀티 모듈 관리하기
Gradle Kotlin 컨벤션 플러그인으로 효율적으로 멀티 모듈 관리하기Gradle Kotlin 컨벤션 플러그인으로 효율적으로 멀티 모듈 관리하기
Gradle Kotlin 컨벤션 플러그인으로 효율적으로 멀티 모듈 관리하기
 
생산성을 높여주는 iOS 개발 방법들.pdf
생산성을 높여주는 iOS 개발 방법들.pdf생산성을 높여주는 iOS 개발 방법들.pdf
생산성을 높여주는 iOS 개발 방법들.pdf
 

More from Daniel Lim

내가 생각하는 개발자란?
내가 생각하는 개발자란?내가 생각하는 개발자란?
내가 생각하는 개발자란?Daniel Lim
 
개발자를 넘어 기술 리더로 가는 길을 읽고
개발자를 넘어 기술 리더로 가는 길을 읽고개발자를 넘어 기술 리더로 가는 길을 읽고
개발자를 넘어 기술 리더로 가는 길을 읽고Daniel Lim
 
스크럼 101
스크럼 101스크럼 101
스크럼 101Daniel Lim
 
nodejs_101.pdf
nodejs_101.pdfnodejs_101.pdf
nodejs_101.pdfDaniel Lim
 
피드백 시스템
피드백 시스템피드백 시스템
피드백 시스템Daniel Lim
 
12.context api
12.context api12.context api
12.context apiDaniel Lim
 
11.react router dom
11.react router dom11.react router dom
11.react router domDaniel Lim
 
9.component style
9.component style9.component style
9.component styleDaniel Lim
 
7.component life cycle
7.component life cycle7.component life cycle
7.component life cycleDaniel Lim
 
6.component repeat
6.component repeat6.component repeat
6.component repeatDaniel Lim
 
4.event handling
4.event handling4.event handling
4.event handlingDaniel Lim
 
3.component 101
3.component 1013.component 101
3.component 101Daniel Lim
 
Swagger? OAS? with NodeJS
Swagger? OAS? with NodeJSSwagger? OAS? with NodeJS
Swagger? OAS? with NodeJSDaniel Lim
 

More from Daniel Lim (20)

내가 생각하는 개발자란?
내가 생각하는 개발자란?내가 생각하는 개발자란?
내가 생각하는 개발자란?
 
개발자를 넘어 기술 리더로 가는 길을 읽고
개발자를 넘어 기술 리더로 가는 길을 읽고개발자를 넘어 기술 리더로 가는 길을 읽고
개발자를 넘어 기술 리더로 가는 길을 읽고
 
스크럼 101
스크럼 101스크럼 101
스크럼 101
 
nodejs_101.pdf
nodejs_101.pdfnodejs_101.pdf
nodejs_101.pdf
 
For You
For YouFor You
For You
 
Nest js 101
Nest js 101Nest js 101
Nest js 101
 
피드백 시스템
피드백 시스템피드백 시스템
피드백 시스템
 
12.context api
12.context api12.context api
12.context api
 
11.react router dom
11.react router dom11.react router dom
11.react router dom
 
9.component style
9.component style9.component style
9.component style
 
7.component life cycle
7.component life cycle7.component life cycle
7.component life cycle
 
8.hooks
8.hooks8.hooks
8.hooks
 
6.component repeat
6.component repeat6.component repeat
6.component repeat
 
4.event handling
4.event handling4.event handling
4.event handling
 
5.ref 101
5.ref 1015.ref 101
5.ref 101
 
3.component 101
3.component 1013.component 101
3.component 101
 
2.jsx 101
2.jsx 1012.jsx 101
2.jsx 101
 
1.react 101
1.react 1011.react 101
1.react 101
 
Swagger? OAS? with NodeJS
Swagger? OAS? with NodeJSSwagger? OAS? with NodeJS
Swagger? OAS? with NodeJS
 
CuKu V1.3
CuKu V1.3CuKu V1.3
CuKu V1.3
 

13.code split