EtoC

초기설정(1) npm i 본문

BackEnd/NodeJs

초기설정(1) npm i

게리드 2023. 8. 4. 23:43

index.js까지 만들었다면 이제 express를 설치해보자.

1.npm i /npm i express

입력코드: npm i(또는 install) express

57개의 패키지를 받았으며, package-lock.json파일과 node_modules폴더가 자동적으로 만들어졌다.
(.gitignore는 내가 DS_Store를 git에 자주 올려서 미리 만들어둔것이다.)

node_modules 란?

npm으로 설치한 모든 패키지들이 저장되는 장소(폴더) 로 용량이 굉장히 크기도하고 package.json파일만 있어도 모듈들을 설치할 수 있어 gitignore해야하는 파일이다. github에 푸쉬하지 않도록 조심하자.

package-lock 이란?

package-lock은 나의 패키지 파일들을 안전하게 관리해주는 파일이다. 수정된버전을 해시값으로 안전하게 보관해준다. 다른사람이 npm i를 입력하면 내가 사용한 버전을 그대로 복사해주어 똑같이 동작하도록 해준다.

express를 받으면 역시나 json파일이 있으며 여기에 기여자나 스크립트들이 들어있다.


또한 dependencies라고 많은 이름과 버전들이 express를 다운받으면 같이 설치되는데 package.json가 중요한이유를 여기서 알 수 있다.

package.json이 중요한 이유

npm i만치면 package.json파일에 의존하는 모든 패키지를 알아서 다운로드해준다. 이게 얼마나 유용하냐면 팀원이 어떤 모듈을 받아서 사용했을때 우리는 깃에서 pull한뒤 npm i만 적어주면 그파일이 자동으로 설치가된다.
즉, node_modules를 주고받을 필요가 없다는것이다.

주의사항

json {}를 꼭 닫아주자. npm은 자동적으로 package.json을 수정하는데 내가 package.json이 수정한 후 닫지않고 npm i를 입력하면 npm이 dependencies의 목록과 버전을 설치하는데 버전 충돌이 나게된다.

이 중요한 depencency에는 두가지 종류가 있다.


두 종류 모두 node_modules에 저장되는데 뭐가 다른걸까?

dependencies?

dependencies(의존성)은 프로그램이 작동되기 위해 필요한 패키지들을 말한다.
dependencies에 존재하는 목록들은 모두 node_modules에 폴더명으로 존재하며 이들도 모두 index.js와 package.json을 가지고 있다.
여기의 package.json에 dependencies의 목록들 또한 폴더로 존재하며 index.js와 package.json을 가지고있다.
이렇게 서로 서로에게 기대는 패키지를 의존하는 패키지라고 한다.

dev-dependencies?

이름 그대로 개발자들을 위한 패키지이다. dependencies에있는 패키지가 엔진이고 연료라면, dev-dependencies의 패키지들은 기름칠 정도랄까?

express를 사용하기위해서는 저 많은 dependencies목록들을 설치해야하는데
npm을 사용하면 dependencies를 해석하여 자동으로 폴더들을 다운받아준다.


이제 package목록에보면 dependencies에 express가 추가된거을 볼 수 있다.

이제 내가 만들 패키지는 express가 없이는 작동할 수 없게되었다.

2. gitignore

위에서 말했듯이 node_module은 용량이 굉장히 크다.
때문에 git에 올라가서는 안되는데 학원에서 강의를 들을때 gitigonre에대한 글을 보지못해 그대로 올리고 말았다.
gitignore하는 방법은 간단하다.

입력코드: touch .gitignore

를 입력한뒤 .gitignore파일안에 /폴더명또는 .파일명을 입력하면된다.

3. express 사용하기

const express = require("express")
import express from("express")

위 코드를써주면 npm과 nodejs가 node_modules에서 알아서 불러와 주기때문에 node_modules/express라고 쓸 필요가 없다.
import만 한다고하여 express를 사용할 수 있는 것은 아니다. import는 사용할 것을 단순히 불러온 것일 뿐이다.

const app = express();

app=express()로 선언하여야 express application을 app으로 사용할 수 있다.


오류: cannot use import statement outside a module

혼자서 다시 초기 세팅을 해보는데 오류가 났다.
자주 보던 에러여서 경로설정을 잘못했나보다하고 봤으나 제대로 되어있었고 불과 3분전에는 npm이 잘 작동되었었다.


아무리봐도 나는 틀리게 쓴게 없는데 문법오류가 있어서 모듈을 꺼내올수가 없다고한다.
그런데 인덱스에 단 저 3문장을 썼을뿐인데 안된다니..(import가 왜 ...?)

오류해결

package.json에 type을 module로 지정하여 문제를 해결하였다.
이유는 package.json의 type 필드에 별도의 값이 없거나 commonjs로 설정되어 있으면 기본 모듈 처리 방식이 require()를 사용하는 commonjs 방식으로 설정되기 때문에 import 부분에서 에러가 발생했던 것이였다.
type 필드 값을 module로 설정하면 모듈 처리 방식이 import를 사용하는 es6 방식으로 변경된다.

쉽게말해 아무 설정도 안한다면 require()를, type을 module로 설정하면 import를 사용하는 것이다.

근데 이게 3달전 처음 nodejs로 서버를 만들어봤을때는 import로 불러오는것이 적용이 안되어서 최신문법이라 안되는구나하고 다 require()로 불러왔었는데 이렇게 다시 보니 참..

여기서 궁금한게 BABEL을 쓰면 저 "type":"module"을 안써도 될지 내일 해봐야겠다.