4. require
require.js
require('./var'); // 다른 파일을 실행만 하고 싶을 경우
console.log(require);
// [Function: require] {
// resolve: [Function: resolve] { paths: [Function: paths] },
// main: Module {
// id: '.',
// path: '/Users/xxxxxx/total/server/node/202305ing_node_study/section_3/3_3_require',
// exports: {},
// filename: '/Users/xxxxxx/total/server/node/202305ing_node_study/section_3/3_3_require/require.js',
// loaded: false,
// children: [ [Module] ],
// paths: [
// '/Users/xxxxxx/total/server/node/202305ing_node_study/section_3/3_3_require/node_modules',
// '/Users/xxxxxx/total/server/node/202305ing_node_study/section_3/node_modules',
// '/Users/xxxxxx/total/server/node/202305ing_node_study/node_modules',
// '/Users/xxxxxx/total/server/node/node_modules',
// '/Users/xxxxxx/total/server/node_modules',
// '/Users/xxxxxx/total/node_modules',
// '/Users/xxxxxx/node_modules',
// '/Users/node_modules',
// '/node_modules'
// ]
// },
// extensions: [Object: null prototype] {
// '.js': [Function (anonymous)],
// '.json': [Function (anonymous)],
// '.node': [Function (anonymous)]
// },
// cache: [Object: null prototype] {
// '/Users/xxxxxx/total/server/node/202305ing_node_study/section_3/3_3_require/require.js': Module {
// id: '.',
// path: '/Users/xxxxxx/total/server/node/202305ing_node_study/section_3/3_3_require',
// exports: {},
// filename: '/Users/xxxxxx/total/server/node/202305ing_node_study/section_3/3_3_require/require.js',
// loaded: false,
// children: [Array],
// paths: [Array]
// },
// '/Users/xxxxxx/total/server/node/202305ing_node_study/section_3/3_3_require/var.js': Module {
// id: '/Users/xxxxxx/total/server/node/202305ing_node_study/section_3/3_3_require/var.js',
// path: '/Users/xxxxxx/total/server/node/202305ing_node_study/section_3/3_3_require',
// exports: [Object],
// filename: '/Users/xxxxxx/total/server/node/202305ing_node_study/section_3/3_3_require/var.js',
// loaded: true,
// children: [],
// paths: [Array]
// }
// }
// }
// ---------------------------------------------------------------------------------------------------------
// main 프로퍼티는 뭘까?
// 이 파일 자체도 모듈이다.
// 각 파일마다 기본적으로 module.exports = {} 이게 기본값으로 설정되어있기 때문이다.
// node 명령어로 현재 파일을 실행(node require.js)한다면, 실행한 파일이 main이 된다.
console.log(require.main); // 이 값으로 어떤 파일을 실행한건지 알아낼 수 있다.
// Module {
// id: '.',
// path: '/Users/xxxxxx/total/server/node/202305ing_node_study/section_3/3_3_require',
// exports: {},
// filename: '/Users/xxxxxx/total/server/node/202305ing_node_study/section_3/3_3_require/require.js',
// loaded: false,
// children: [
// Module {
// id: '/Users/xxxxxx/total/server/node/202305ing_node_study/section_3/3_3_require/var.js',
// path: '/Users/xxxxxx/total/server/node/202305ing_node_study/section_3/3_3_require',
// exports: [Object],
// filename: '/Users/xxxxxx/total/server/node/202305ing_node_study/section_3/3_3_require/var.js',
// loaded: true,
// children: [],
// paths: [Array]
// }
// ],
// paths: [
// '/Users/xxxxxx/total/server/node/202305ing_node_study/section_3/3_3_require/node_modules',
// '/Users/xxxxxx/total/server/node/202305ing_node_study/section_3/node_modules',
// '/Users/xxxxxx/total/server/node/202305ing_node_study/node_modules',
// '/Users/xxxxxx/total/server/node/node_modules',
// '/Users/xxxxxx/total/server/node_modules',
// '/Users/xxxxxx/total/node_modules',
// '/Users/xxxxxx/node_modules',
// '/Users/node_modules',
// '/node_modules'
// ]
// }
// ---------------------------------------------------------------------------------------------------------
// cache 프로퍼티는 뭘까?
// 이는 효율을 위해 넣어둔 것이다.
// 한번 require한건 cache에 저장한다.
// 그리고 다른 파일에서 같은 파일을 require하면, cache에서 불러온다.
// 파일을 읽는 작업은 오래 걸린다.
// 하지만 메모리에 저장하고 불러오는건 빠르다. (하드디스크에서 불러오는건 느리고, 메모리에서 불러오는건 빠르다.)
// 하드디스크에 있는 정보를 메모리로 옮기는 것을 보통 '캐싱'이라고 한다.
// 이 cache를 초기화하면, 어떤 파일을 require할 때, cache에 없으므로 다시 하드디스크에서 불러온다.
// 이렇게 require.cache를 조작하는 방법도 있다. (그런데 좀 위험하다. 내장되어있는 객체에 손대는 것은 위험)
// 노드는 코드를 수정하면 서버를 종료했다 다시 실행해야되는데
// require.cache를 적절하게 사용하면, 서버를 종료했다 다시 실행할 필요가 없다.
// ---------------------------------------------------------------------------------------------------------
// require는 맨 위에 오지 않아도된다.
module.exports = '테스트';
require('./var');
// ES 최신 문법 import/export에서 import는 항상 가장 위에 있어야된다.
// require는 맨 위에 없어도되지만, import는 항상 맨위에 있어야된다.
console.log(require.main === module); // true
console.log(require.main.filename); // /Users/.../total/server/node/202305ing_node_study/section_3/3_3_require/require.js
console.log(require.cache['/Users/xxxxxx/total/server/node/202305ing_node_study/section_3/3_3_require/var.js'].exports.odd); // 홀수 입니다.
var.js
const odd = '홀수 입니다.';
const even = '짝수 입니다.';
console.log('var.js 파일입니다.')
// module.exports는 파일에서 단 한번만 써야된다.
module.exports = {
odd,
even,
}