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); // 홀수 입니다.