투케이2K

514. (javaScript) [간단 소스] 자바스크립트 string 문자열 형식 동적 자바 스크립트 코드 작성 및 import 모듈 로딩 , 소스 코드 실행 본문

JavaScript

514. (javaScript) [간단 소스] 자바스크립트 string 문자열 형식 동적 자바 스크립트 코드 작성 및 import 모듈 로딩 , 소스 코드 실행

투케이2K 2026. 3. 19. 19:59
728x90
반응형

[개발 환경 설정]

개발 툴 : Edit++ / Vscode

개발 언어 : JavaScript

 

[소스 코드]

-----------------------------------------------------------------------------------------
[사전 설명 및 설정 사항]
-----------------------------------------------------------------------------------------

- 개발 환경 : Web


- 개발 기술 : JavaScript (자바스크립트) / export function / import module


- 사전) 👉 new Blob 간략 설명 : 

  >> new Blob() 은 브라우저에서 바이너리·텍스트 데이터를 메모리에 담는 불변(immutable) 데이터 객체를 만드는 표준 API 입니다.

    - 문자열·ArrayBuffer·TypedArray·File 같은 바이트 덩어리들을 하나로 묶어 “가상의 파일” 처럼 다루게 해주는 컨테이너 개념

  >> Blob 은 파일 시스템에 저장하지 않아도 메모리 상에서 파일처럼 읽고 전송(업로드/다운로드/미디어 소스 등)할 수 있습니다.

-----------------------------------------------------------------------------------------





-----------------------------------------------------------------------------------------
[소스 코드]
-----------------------------------------------------------------------------------------

<!DOCTYPE HTML>
<html lang="ko">
<head>
    <title>javaScriptTest</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">


    <!-- 반응형 구조 만들기 -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no">


    <!-- 내부 CSS 스타일 지정 -->
    <style>

        html, body {
            width: 100%;
            height: 100%;
            margin : 0 auto;
            padding : 0;
            border : none;
            background-color: #666;
        }

    </style>





    <!-- [CDN 주소 설정] -->
    <script src="https://code.jquery.com/jquery-latest.min.js"></script>






    <!-- [자바스크립트 코드 지정] -->
    <script type="module">
        
      window.onload = async function() {
        console.log("[window onload] : [html 최초 로드 및 이벤트 상시 대기 실시] : [start]");

        try {

          /**
           ----------------------------------------------
            [실행 흐름 요약 (텍스트 다이어그램)]
            ----------------------------------------------
            [문자열 소스]
              │
              ▼
            Blob(text/javascript) 생성
              │
              ▼
            URL.createObjectURL → blob:… URL
              │
              ▼
            await import(blob:…)
              │             └─ 모듈 파싱/실행, exports 구성
              ▼
            mod 네임스페이스 확보
              │
              ├─ mod.run() 실행 → 콘솔 출력
              │
              ▼
            URL.revokeObjectURL(blob:…)
            ----------------------------------------------          
          */



          // --------------------------------------------
          // ✅ [전체 로그 출력 예시]
          // --------------------------------------------
          // [window onload] : [html 최초 로드 및 이벤트 상시 대기 실시] : [start]
          //blob:null/d7aaf36d-a269-4a84-9d96-914b9d2be722:3 twok : dynamic module start
          //globalThis.appState.defaultCnt :  1
          //blob:null/d7aaf36d-a269-4a84-9d96-914b9d2be722:11 dynamic module timer


          // --------------------------------------------
          // ✅ [자바스크립트 소스 코드 문자열을 정의 : ES 모듈 문법(export)을 사용하고 있어 모듈로 로딩할 의도 정의]
          // --------------------------------------------
          const data = "twok";

          globalThis.appState = { defaultCnt: 0 }; // ✅ (공유) 상태 준비

          const source = `
            export function run() {
              console.log('${data} : ' + 'dynamic module start');

              try {

                globalThis.appState.defaultCnt++; // ✅ 전역 공유 상태 수정

                setTimeout(() => { // 타이머

                  console.log('dynamic module timer');

                  alert('defaultCnt : ' + globalThis.appState.defaultCnt);

                }, 3000 );

              }
              catch(exception){
                console.error('dynamic module exception : ', exception);
              }

            }
          `;


          // --------------------------------------------
          // [문자열을 Blob 으로 감싸 브라우저가 읽을 수 있는 바이너리 객체로 변환]
          // --------------------------------------------                      
          const blob = new Blob([source], { type: 'text/javascript' });
          const url = URL.createObjectURL(blob); // Blob을 참조하는 Object URL 생성


          // --------------------------------------------
          // [동적 import()로 모듈 로딩]
          // --------------------------------------------            
          const mod = await import(url);
          mod.run(); // ✅ export function run() 으로 내보낸 함수를 호출


          // --------------------------------------------
          // [리소스 정리: Object URL 해제]
          // --------------------------------------------
          URL.revokeObjectURL(url);

          console.log('globalThis.appState.defaultCnt : ', globalThis.appState.defaultCnt);

        }
        catch (exception) {
          console.error("[window onload] : [Exception] : 예외 상황 발생 : ", exception);

        }

      };

    </script>


</head>


<body>

</body>

</html>

-----------------------------------------------------------------------------------------





-----------------------------------------------------------------------------------------
[참고 사이트]
-----------------------------------------------------------------------------------------

[간단 소스] 자바스크립트 window.open 사용해 새창 팝업창 열기 후 window.opener.postMessage 메시지 전달 수행

https://kkh0977.tistory.com/8668

https://blog.naver.com/kkh0977/224202970329


[자바스크립트 동적 html 코드 및 style 코드 작성 후 window open 동작 테스트]

https://kkh0977.tistory.com/8663

https://blog.naver.com/kkh0977/224200045885?trackingCode=blog_bloghome_searchlist


[동적으로 div 레이아웃 생성 및 스타일 속성 지정 실시]

https://kkh0977.tistory.com/833

https://blog.naver.com/kkh0977/222390679369?trackingCode=blog_bloghome_searchlist


[부트스트랩 (bootstrap) 사용해 게시판 table 동적 목록 생성, pagination 페이징 처리]

https://kkh0977.tistory.com/1011

https://blog.naver.com/kkh0977/222438317762?trackingCode=blog_bloghome_searchlist

-----------------------------------------------------------------------------------------
 
728x90
반응형
Comments