본문 바로가기
프로그래밍/nodejs

[220127] require, export 명령문

by 한코코 2022. 2. 2.

목록

1.    require 메서드

2.   exports를 통해 추가하기

 


 

NODEJS의 require 메서드

require은 표준 문법이 아니다 : 표준에 없는데 왜 nodejs에 이게 필요할까?

  • 자바스크립트는 여러 파일에서 사용할 경우, 불편했다. 왜?
    • A 파일에 있는 변수가 왜 B 파일에서 실행될때 같이 실행되지? (브라우저의 예시)
    • 다른 사람들과 협업할때 불편함.
    • (예시) 내가 a변수를 만들었는데, 다른사람도 a변수를 선언하거나 사용 --> 에러발생
  • 이를 방지하기 위해 모듈(파일을 가져와서 사용할 수 있게끔 만들어 주는 시스템)이 나옴.
    • 모듈은 ES7부터 있었음. -> import문이 생겨있음
    • 근데!! import가 나오기 전에 NODEJS가 먼저 만들어 놓은 require가 존재.
    • import(리액트때 씀), require -> 둘 다 사용해도 상관은 없음. 대신 require에 좋은 라이브러리가 많음.
    • 사용방법 (내가 서로 다른 파일을 관여하고 싶지 않다)

 


 

 

node.js의 특징

 

a.js와 b.js에 각각 다음과 같이 저장한 후, 각각 a 파일을 호출한다.

let a = 'ingoo'
console.log(a)

 

호출한 결과 : 변수명을 같게 선언해도 에러가 없다. 서로 개별적인 node.js

실행한 파일만 결과물을 만들어주는 node.js

 

  • NODEJS는 실행한 파일만 결과물을 만들어준다. 같은 변수에 같은 값이 있지만 각각 파일을 실행한 값이다.
  • 브라우저는 모든 자바스크립트를 해석해서 한 공간에서 사용한다.
  • NODEJS와 브라우저가 실행되는 공간은 서로 다르다.

 

  • 나눠서 작성해도 하나로 그러모아 실행하는 브라우저와 다르게 각각 돌아가는 NODEJS.
  • 모든 파일에 같은 값을 적어줘야하는 불편을 덜어주기 위해서 나온 것이 module.
  • 다른 파일에 있는 정보도 가져올 수 있도록 하는 것이 require.

 

 


 

 

export로 값을 보내면, require은 그 값을 가져온다

  1. a.js를 실행할때 b.js에 있는 변수를 가져와서 사용하고 싶은 상황.
  2. b에 있는 내용을 가져오는 것 :  require('가져올 파일경로, 파일명')
  3. b에 있는 내용을 내보내는 것 : moduel.export = 객체명 / exports.key값=value값
  4. 단일 객체를 내보낼때는 module.export를, 2개 이상 객체를 내보낼때는 export를 사용해서 내보낸다.

 

a 파일 

a파일을 실행할때 b파일에 있는 변수를 가져와서 사용하고싶다!  --> require

//require('현재 폴더의 상위 폴더로 이동 / 그 안에 있는 b.js 파일')
console.log(require('./b.js'))

 

b 파일 

여기서 변수를 가져가고싶다!  --> module.export

// 관리해야할 데이터 -> 그냥 변수들
// object라는 변수 안에 user라는 속성값이 있고
// 그 속성값은 배열타입으로 저장함.
// 그 배열의 한 요소마다 객체로 담음.
let obj={
    user:[
        { name : 'ingoo'},
        { name : 'ingoo'},
        { name : 'ingoo'},
    ]
}

//보내는 구문. require은 obj를 가져가게 된다.
//module 객체 안에 있는 export 속성을 가져오는 형태
module.exports = obj

 

a 파일을 실행한 결과

 

 


 

 

NODEJS가 가진 내장객체 ( 기본적으로 갖고있는 데이터 )

//NODEJS가 가진 내장객체
console.log(global)
console.log(module)

내장객체 global과 module, 그 안에 있는 속성들.

 

 

module을 보면 exports가 비어있는것을 확인할 수 있다.

빈 exports에 값을 추가해보자.

 

 

 

직접 값을 추가하기

console.log(require('./b.js'))

module.exports = "a" //값 추가
console.log(module)

추가된 export

 

 

 

 

exports에 함수 추가하기

//server.js
module.exports.add = (a,b) => {a+b}
module.exports.substract = (a,b) => {a-b}


//a.js
const req = require('./server.js')
console.log(req)

a를 실행한 결과

export 안에 add 함수와 substract 함수가 있는걸 볼 수 있다.

 

 

 

 

 

 

class로 만든 객체 추가하기

//a.js
	class C{
        add(a,b){
            return a+b;
        }

        sub(a,b){
            return a-b;
        }
    }

    module.exports = C;

    console.log(module)
    
    
//server.js
const cal = require('./a.js')
console.log(new cal().add(2,5))

const testCal = new cal();
console.log(testCal.sub(3,2))

 

 

 

exports로 값을 추가하기

module.exports 말고, exports로 값을 추가해보자

//b.js
    const multiply = function (a,b){return a*b}
    const divide = function (a,b){return a/b}

    exports.mul = multiply;
    exports.div = divide;



//server.js
    const cal = require('./a.js')
    console.log(new cal().add(2,5))

    const testCal = new cal();
    console.log(testCal.sub(3,2))
    
    const FullCall = require('./b.js')
    console.log(FullCall.mul(3,2))
    console.log(FullCall.div(6,2))
    
    
    
//a.js
    class C{
        add(a,b){
            return a+b;
        }

        sub(a,b){
            return a-b;
        }
    }

    module.exports = C;

사용할때 new 명령어를 사용해서 새 객체를 생성한 후 속성을 사용할 수 있었던 moduel.exports와 다르게,

exports로 불러온 파일속성을 저장한 변수명을 객체처렴 사용할 수 있게한다.

 

 


 

NODEJS에서 module 없이 export만 사용해도 가능하긴한데 잘 사용은 안 함.

exports.aa = function(){
	return 'aa'
}

 

 


 

 

 

익명함수와 기능이 같은 함수를 생성해서 연결한다면 어떻게 될까?

익명함수가 아니기때문에 오류가 생긴다. vc가 오류가 생긴 이유를 보여준 것을 옆에 각각 적었다.

vsc에서 각각 속성에 따라 색이 바뀌는 것을 인지하며 코드를 보면 조금더 인식하기가 쉽다.

  • 객체는 초록색
  • 변수는 파란색
  • 함수는 노란색

그런데 이상하지 않은가? add는 함수명이 맞다. add(1,2)를 해도 훌륭하게 결과값 3을 내뱉는 함수다.

그런데 왜 함수가 아니라고 출력해줄까? module.export는 객체를 출력한다고했어도 함수는 객체란 집한 안에 있어서 객첸데?

이건 좀 더 알아보고 업데이트할때 작성하겠다. 교수님 헲미 썸바디헲미 도와줘요 구글

 

교수님 답변

module.export를 출력하면 this와 같이 빈객체로 나온다. --> { } 이렇게.

빈 객체 안에서 add나 다른 함수를 꺼내려고하니까 당연하게 값이 없지.

댓글