FE

Node환경과 브라우저의 차이점 (몇몇 노드 모듈이 브라우저에서 실행할 수 없는 이유)

mandelina 2023. 12. 11. 23:07

개발을 하던중 실행환경에 따라 기본적으로 사용할 수 있는 모듈이 있고 제약이 있는 모듈이 있다는것을 인지하게 되었다..

사실 생각해보면 당연한건데 이제서야 인지한 나를 반성하며 (?) 정리해보자!!

 

내 상황

- webpack config 파일을 수정하던중 target을 electron-renderer로 잡으면 fs,os 모듈 실행이 가능한데 , target을 ['web',' electron-renderer'] 로 함께 잡으면 module not found 라는 오류가 떳다!

 

- 그 이유는 'fs'나 'os' 같은 Node.js에서만 사용 가능한 모듈은 브라우저(web)에서 직접 사용할 수 없기 때문이다.

따라서 해결방안은 2가지였다.

 

1. webpack.web.config  / webpack.electron-renderer.config.js 파일을 분리해서 각각 다른 설정을 적용하기

2. web을 사용안하기 ^^!!

 

다행히 web을 사용 안해도 되는 환경이여서 2번으로 해결 했다. (물론 바로 해결된 것은 아니고 다른 문제를 직면하긴했다 .. ^^ global is not defined....  Electron 환경과 Node환경에서의 isolation을 설정해줘서 해결했다..  😂)

 

 

🍔  여기서 궁금한점 .. 왜 Node.js의 몇몇 모듈은 브라우저에서 직접 사용할 수 없을까 ?

 

1. 브라우저의 보안

브라우저 환경에서 JavaScript가 사용자의 로컬 파일 시스템이나 운영체제같은 시스템 레벨 자원에 직접 접근하는것은 사용자의 시스템에 보안 및 개인 정보 보호 측면에서 중요한 제한사항이다. (생각해보면 당연한것 ..)

 

2. 웹 생태계 제한사항

브라우저에서 실행되는 JavaScript는 웹 생태계에서 동작하도록 설계되었다. 따라서 브라우저 환경에서는 사용자에게 표시되는 웹 페이지와 관련된 작업에 중점을 두고 있고, 파일 시스템이나 운영 체제와 같은 저수준의 시스템 레벨 작업은 일반적으로 브라우저에서는 허용되지 않는다.

 

브라우저에서는 주로  DOM과 관련된 API가 사용되고 , Node.js에서는 파일시스템,네트워크 관련 API가 주로 사용된다.

 

🍟 그럼 사용 가능한 Node모듈은 무엇이 있을까 ?

 

  1. util: Node.js의 유틸리티 함수들을 제공하는 모듈
  2. events: 이 모듈은 이벤트 기반 프로그래밍을 지원
  3. url: URL 관련 유틸리티 함수들을 제공
  4. querystring: 쿼리 문자열 파싱 및 생성을 제공하는 모듈
  5. buffer: 이진 데이터를 다루는데 사용되는 모듈
  6. http, https, fs (브라우저 버전): 브라우저에서도 사용 가능한 버전이 존재하며, 예를 들어, 브라우저에서는 fetch API를 사용하여 HTTP 요청을 수행 가능 

 

또한 브라우저에서와 Node환경에서 API도 차이가 있는것을 알 수있다.

 

https://developer.mozilla.org/ko/docs/Web/API

(주로 클라이언트 사이드  WebAPI를 지원)

 

Web API | MDN

웹 코드를 작성한다면 많은 API를 사용할 수 있습니다. 아래 목록은 웹 앱이나 웹 사이트를 만들 때 사용할 수 있는 모든 인터페이스(객체의 유형)입니다.

developer.mozilla.org

https://nodejs.org/docs/latest/api/

(주로 ECMAScript와 Node 고유의 API 지원)

 

Index | Node.js v21.4.0 Documentation

 

nodejs.org

 

결론적으로 이렇게 차이가 나는 이유는 애초에 브라우저와 Node.js는 존재 목적부터 다르기 때문이다!

 


 

추가적으로 위에서 언급했던  global is not defined 오류에 대해서도 간략히 정리해보자면 ,

내가 사용하는 환경은 Electron인데, Electron은 Chromium 브라우저와 Node.js를 결합한 환경이기 때문에, 이러한 차이 때문에 오류가 발생했다. 메인 프로세스와 렌더러 프로세스가 각각 isolation을 유지시키는 것이 좋지만 어쩔수 없는 노드모듈을 사용해야하는 상황이므로 conntextIsolation: false로 설정해두고 window.electron = electronAPI 를 사용해서 전역 객체에 속성을 추가하여서 해결하였다. 이렇게 false로 설정하면 메인 프로세스와 렌더러 프로레스가 동일한 컨텍스트를 공유하게 된다. ( 메인 프로세스는 Node.js 환경이고, 렌더러 프로세스는 Chromium 브라우저 환경을 가짐. )

 

 

 

 

 

오늘의 트러블 슈팅을 통해

브라우저와  Node 환경에 대해서 확립할 수 있었고...  electron 환경은 더 공부해야할 것 같다.

 

 

 

고문서

https://www.geeksforgeeks.org/nodejs-vs-browser/

https://poiemaweb.com/js-hello-world

https://ko.javascript.info/modules-intro