-> Heroku를 통해 배포.
-> 배포 하려면 어떤 Node.js 환경에서도 실행될 수 있도록 설정을 바꿔야함.
-> DB도 바꿔야함. DB가 지금은 localhost에서만 작동함.
-> 그리고 파일들을 우리 서버가 아니라 아마존에 올려야함.
-> webpack.config: 우리 코드를 production 방법으로 빌드해야 되고, 코드를 압축해야함.
이번 섹션에서는 실제 서버에서 백엔드를 실행하는 모든 단계를 해볼 것임.
npm install --save-dev @babel/core @babel/cli
{
"name": "my-project",
"version": "1.0.0",
+ "scripts": {
+ "build": "babel src -d lib"
+ },
"devDependencies": {
"@babel/cli": "^7.0.0"
}
}
(전)
"scripts": {
"build:server": "babel src/init.js -d build", // src가 아니라 우리는 src/init.js의 코드를 변환하고자 해서 이렇게 적음. -d로 directory지정(빌드한 코드를 어디에 저장할 건지).
"dev:server": "nodemon",
"dev:assets": "webpack"
},
-> npm run build:server 를 하면 init.js의 변환된 코드가 들어간 bulid폴더 생성됨.
-> babel-CLI는 예를 들면 babel-node처럼 실행하지 않아. nodemon은 파일을 실행하고 그 파일이 모든 걸 실행함. babel의 경우, 한 파일만 실행하는 것이 아니라, 모든 폴더를 빌드해서 실행해야함.
즉, babel-node는 init만 변환해서 실행하면 init이 관련된 모든 파일을 전부 실행시켰지만, babel-CLI는 init만 변환해서 실행함. 따라서 babel build를 src/init이 아니라 src전체로 해줘야함.
(후)
"scripts": {
"build:server": "babel src -d build", // src 전체 코드를 변환해줘야함. -d로 directory지정(빌드한 코드를 어디에 저장할 건지).
"dev:server": "nodemon",
"dev:assets": "webpack"
},
-> npm run build:server 를 하면 build 폴더에 변환된 src폴더의 파일들이 생성될 것임. & 이 build는 크기가 커서 .gitignore에 등록해야함
/build
-> 나중에 고칠 거임.
"scripts": {
"start": "node build/init.js", // 이거 추가 -> 변환된 코드라 굳이 babel-node로 해주지 않아도 됨. babel을 사용하지 않아도 됨.
"build:server": "babel src -d build",
"dev:server": "nodemon",
"dev:assets": "webpack"
},
-> npm start
즉, 우리 코드가 async와 await을 사용할 때 regenerator가 필요한데 없음.
이 문제는 우리 코드가 async와 await을 사용할 수 있도록 알려줘야함
=>
await, async를 사용할 수 없을 때, 나타나는 에러임. 예전에도 이런 오류가 났었음. clent/js에서 났었음. 이에 따라 우리는 client/js/main.js에
import "regenerator-runtime/runtime.js" ;
를 해줬음.
이번에는 client폴더가 아닌 src폴더 전체에(정확히는 src를 옛코드로 변환해준 build폴더) await, async가 먹히질 않아서 그럼(최신 코드에서는 뭔가를 import하지 않아도 사용가능하지만 옛 코드로 바꾸면서 뭔가를 import해줘야 함.) 따라서 우리는 init.js에
import "regenerator-runtime/runtime.js" ;
를 import해주면 오류 해결 !
이후, 다시 npm run build:server로 새로 추가된 코드가 포함된 뒤, 옛코드로 변환된 src폴더를 만들고, npm run start하면 됨.
이제 babel이 우리 서버에서 실행되지 않고. node.js가 우리 서버에서 실행되고 있게됨. 이제 babel의 도움 필요 없이, node.js가 이 코드를 모두 이해하고 있음.
=>
답은 server.js에 있음. server.js에서 views의 directory경로를 보면
app.set("views",process.cwd() + "/src/views");//process.cwd: 현재 작업중인 파일 위치.
이렇게 되어있음. views폴더는 현재 working directory(=cwd)에서 인데, 그건 node를 실행한 위치를 말함. package.json을 가진 폴더의 위치를 의미하고 root폴더를 말함. build와 src의 바깥 폴더를 말함. 그 뒤에 "/src/views" 이렇게 되어있는데, build의 views는 src/views를 가져와서 사용하고 있음. 따라서 우리는 src/views폴더를 잘 보존하면 됨. 따로 build폴더에 안 넣어줘도 됨.
!) 만약 build폴더에 넣고 싶다면 src/views폴더를 복사하고 build폴더에 넣고,
app.set("views",process.cwd() + "/build/views");
로 수정하면 됨.
----------------------------backend build 완료 ---------------------------
----------------------------client코드(assets) build 해야함 -----------------------
다음 영상에서는 클라이언트 코드를 빌드하고 좀 더 프로답게 만들 것임. production을 위해 만들 것임. 왜냐하면 assets/js의 파일들의 코드가 압축되지 않았기 떄문임. production용으로 만들고, 코드도 압축해야ㅕ함. 또한 우리의 빌드 서버는 환경 변수에 접근할 수 있음.(.env에 접근 가능하다는 소리임)