第二章里面讲模块分析,讲到C/C++模块编译的时候直接就晕了😖,一大片C/C++代码
来自酷炫的 CNodeMD
@q86002618 那书貌似是下架了......
理解模块加载,其实完全不需要知道 native plugin 是怎么生产出来的,顺着 module.js 看下去就好。这是我以前的笔记:
当 require() 一个模块时,module.js 里 Module._extentions[ext] 加载器负责处理 模块。
node.js 实现了 3 个加载器: // Native extension for .js Module._extensions[’.js’] = function(module, filename) { var content = fs.readFileSync(filename, ‘utf8’); module._compile(internalModule.stripBOM(content), filename); };
// Native extension for .json Module._extensions[’.json’] = function(module, filename) { var content = fs.readFileSync(filename, ‘utf8’); try { module.exports = JSON.parse(internalModule.stripBOM(content)); } catch (err) { err.message = filename + ': ’ + err.message; throw err; } };
//Native extension for .node Module._extensions[’.node’] = function(module, filename) { return process.dlopen(module, path._makeLong(filename)); };
process.dlopen => DLOpen https://github.com/nodejs/node/blob/master/src/node.cc#L2438 uv_dlopen() —> mp check: mp.nm_version is NODE_MODULE_VERSION mp.nm_flag not contains NM_F_BUILTIN one should exists and be called: nm_context_register_func(exports, module, env->context(), mp.nm_priv) nm_register_func(exports, module, mp.nm_priv)
至于原生模块的编写和编译,https://github.com/workshopper/goingnative 这个node-gyp教程挺不错的,顺着下来上手能写,再去看实现细节就容易了。不过,教程没有解释跟 v8 vm 交互时涉及到的js对象模型,得另找文章看。
@alsotang 都忘了什么时候在 kindle 里收的,现在啥地方都找不到,也是醉了...... 好在英文版还在,感兴趣的可以去 https://leanpub.com/hands-on-nodejs 看