前提・実現したいこと
下記のloadModule関数がどのように動いているのかを理解したいです。
この本で、ソースコードの[5]でモジュールのソースをファイルから読み込んで、オブジェクトmodule.exportsに公開APIをエクスポートしていると書かれていますが、
fs.readFileSync(filename, 'utf8')
でファイルを読み込んでいることは理解できるのですが、オブジェクトmodule.exportsに公開APIをエクスポートしているという部分がわかりません。
function loadModule(filename, module, require) {
const wrappedSrc =
(function(module, exports, require) { ${fs.readFileSync(filename, 'utf8')} })(module, module.exports, require);
;
eval(wrappedSrc);
}
該当のソースコード
javascript
1"use strict"; 2 3const fs = require('fs'); 4//save the original require 5let originalRequire = require; 6 7function loadModule(filename, module, require) { 8 const wrappedSrc = 9 `(function(module, exports, require) { 10 ${fs.readFileSync(filename, 'utf8')} 11 })(module, module.exports, require);`; 12 eval(wrappedSrc); 13} 14 15// We intentionally use var in the next line to avoid "SyntaxError: Identifier 'require' has already been declared" 16const require = (moduleName) => { 17 console.log(`Require invoked for module: ${moduleName}`); 18 const id = require.resolve(moduleName); //[1] 19 if(require.cache[id]) { //[2] 20 return require.cache[id].exports; 21 } 22 23 //module metadata 24 const module = { //[3] 25 exports: {}, 26 id: id 27 }; 28 //Update the cache 29 require.cache[id] = module; //[4] 30 31 //load the module 32 loadModule(id, module, require); //[5] 33 34 //return exported variables 35 return module.exports; //[6] 36}; 37 38require.cache = {}; 39require.resolve = (moduleName) => { 40 //reuse the original resolving algorithm for simplicity 41 return originalRequire.resolve(moduleName); 42}; 43 44//Load the entry point using our homemade 'require' 45require(process.argv[2]); 46
補足情報(FW/ツールのバージョンなど)
Node.jsデザインパターン 第2版 (日本語) 出版社: オライリージャパン
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。