Hello, Android!
exports와 require 본문
exports
모듈을 만들때 module.export를 사용했지만
exports 객체를 사용하여 모듈을 만들수도 있다
module.exports와의 차이점은
기존의 module.exports에서는 한번에 여러 값들을 넣었지만
그냥 exports를 사용하는 경우에는 각각의 변수를 exports객체에 하나씩 넣는다
그리고 exports는 exports.ryan = "Ryan"과 같이 항상 속성명과 속성값을 넣어줘야 한다
하지만 module.exports와 exports는 서로 같은 객체를 참조하기 때문에
한 모듈에서 module.exports와 exports를 동시에 사용하는건 좋지 않다
만약 한 모듈에서 module.exports와 exports를 동시에 사용하면 어떻게 되는지 테스트를 해보았다
우선 처음에는 exports에 변수 두개와 함수 하나를 넣은 뒤
module.exports에는 변수 하나를 넣은뒤
다른 파일에서 모듈의 데이터를 로그 출력을 하였다
exports에 넣은 데이터는 전부 undefined가 나오고
module.exports의 데이터만 정상적으로 출력되어
둘이 서로 같은 객체를 보고있기 때문에 module.exports가 덮어쓴 것이라 생각했다
만약 module.exports를 한 뒤에 다시 exports로 데이터를 넣으면
가장 마지막에 넣은 exports의 데이터가 덮어쓰는지 궁금하여 테스를 한 결과
가장 마지막에 exports에 넣은 con만이 유일하게 출력될 것이라 생각했지만
module.exports의 데이터만 정상적으로 출력되었다
내 생각에는 module.exports와 exports가 같은 객체를 참조하지만
쓰기 작업에서는 module.export에게 더 높은 우선권이 있는것으로 추측된다
require
이번에는 위의 두 파일을 require하는 파일을 하나 만들어 require에 대하여 확인해 보았다
우선 위에서 사용한 intro.js파일은 fridns.js를 require하여 로그를 출력하는 파일이다
이번에는 로그는 전부 주석으로 처리하고 필요한 부분인 friends.js를 require하는 부분만 남겼다
friends.js파일은 기존과 동일하지만
마지막 라인에 이번 require관련하여 확인하고자 하는 로그를 추가하였다
require.js에서는 friends.js intro.js를 둘 다 require하였다
이번에 확인하고자 하는것은 require의 cache와 main에 대한것이기 때문에
로그들을 출력하고있다
실행 결과를 먼저 보면 [Object: null prototype] 부분이 require.js에서 로그로 출력한
require.cache의 로그이다
현재 캐시에 저장되어있는 모듈의 파일명, 경로, exports하는 데이터, 자식의 여부, 로드 여부 등등을 확인할수 있다
특정 모듈에 대하여 require 하게되면 할때마다 불러오는것이 아닌 require.cache에 저장을 하여
캐시에 있는 정보를 읽어오게 되며 require.cache로그 출력하여 상태를 보게 만든것이다
그렇기 때문에 require.js와 intro.js에서 각각 한번씩 friends.js를 require하지만 캐시를 출력한 결과
friends.js가 캐시에 하나만 존재하며 두 파일은 캐시에 있는 정보를 참조하는 것이다
캐시정보의 앞 뒤로 require.main === module 이라는 로그를 출력하고 있다
require.main은 노드 실행시 최초로 실행되는 모듈을 의미한다
이번에는 require.js에서 실행하였기 때문에 해당 파일이 require.main이 된다
현재 실행되는 모듈이 require.main인지 확인하기 위해서
require.js파일의 마지막 부분에 로그를 출력한 결과가 true가 출력되었다
하지만 require.cache앞의 로그는 friends.js 에서 출력한 로그다
friends.js는 이번에 최초로 실행된 파일이 아니기 때문에 false가 출력되었다