(리액트) Uncaught SyntaxError: Unexpected token '<' (at ...)

2023. 4. 6. 09:59Node js/React

index.html 소스 :

<!-- index.html -->
<html>
  <body>
    <div id="app"></div>

    <script src="https://unpkg.com/react@17/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>

    <script type="text/javascript">
      const app = document.getElementById('app');
      ReactDOM.render(<h1>Develop. Preview. Ship. 🚀</h1>, app);
    </script>
  </body>
</html>

이것을 브라우저에서 열면 Uncaught SyntaxError: Unexpected token '<' (at ...) 가 발생한다.

문제의 원인은

ReactDOM.render(<h1>Develop. Preview. Ship. 🚀</h1>, app);

 

정확히 짚어 보면,

<h1>Develop. Preview. Ship. 🚀</h1>

때문이다. 이렇게 생긴 코드를 JSX 라고 하며, 유효한 javascript 가 아니기 때문에 웹 브라우저가 인식하지 못하는 것이다.

 

이것을 해결하려면

<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>

를 index.html 에 삽입하고 JSX 가 들어 있는 줄을

<script type="text/jsx">

로 감싸면 된다.

 

바벨 적용 후 index.html 소스 :

<body>
<div id="root"></div>

<script src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>

<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script> <-- 여기
<script type="text/jsx">                                                 <-- 여기
  const root = document.getElementById('root');
  ReactDOM.render(<h1>Develop. Preview. Ship. 🚀</h1>, root);
</script>
</body>

결과
바벨(Babel) 은 develop level 에서만 쓰며 production level 에 배포할 때는 스크립트를 컴파일해야 함