ES6 module 형태로 코드를 변경합니다.

모듈화.

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <link rel="stylesheet" href="src/style.css" />
    <title>Cat Search</title>
  </head>
  <body>
    <main id="App"></main>
    **<script type="module" src="src/main.js"></script>**
  </body>
</html>
class App {
  //...생략
}

**export default App;**
**import App from './App.js';**

new App(document.querySelector("#App"));
import Loading from "./Loading.js";
import DarkmodeToggle from "./DarkmodeToggle.js";
import SearchInput from "./SearchInput.js";
import SearchResult from "./SearchResult.js";
import ImageInfo from "./ImageInfo.js";

config.js, msg.js 로 분리.

const config = {
   API_ENDPOINT : "<http://localhost:4001>",
}

export default config;
const msg = {
    REQUEST_ERROR : {
        '500' : { msg : '요청실패' },
    }
}

export default msg;
**import config from './config.js';
import msg from './msg.js';

const { API_ENDPOINT } = config;
const { REQUEST_ERROR } = msg;**

const request = async(url) => {

  try{
    const result = await fetch(url);
    // console.dir(result.status);  
    if(result.status === 200){
      return result.json();
    }else{
      throw REQUEST_ERROR[result.status]; 
    }
  }catch(err){
    console.log(err);
    alert(err.msg);
    return {
      data : null,
    }
  }
}

const api = {
  fetchCats: keyword => {
    return request(`${API_ENDPOINT}/api/cats/search?q=${keyword}`);
  },
  fetchCatsPage: (keyword, page) => {
    return request(`${API_ENDPOINT}/api/cats/search?q=${keyword}&page=${page}`);
  },
  fetchRandomCats : () => {
    return request(`${API_ENDPOINT}/api/cats/random50`);
  },
  fetchCatDetail: id => {
    return request(`${API_ENDPOINT}/api/cats/${id}`);
  },
};

export default api;

KeywordHistory 키워드 중복제거 추가.