36、模块的断点调试
const vm = require('vm'); //虚拟机模式,可以创建沙箱环境
vm.runInThisContext(`console.log(a)`);
useA.js
let r = require('./a');
console.log(r);
console.log(this); //this:{}
https://nodejs.org/en/docs/inspector
1、掌握node中如何实现代码调试 node --inspect-brk 文件名来解析
(1)可以在浏览器中进行调试(调试某些模块可以使用这种方式)
(2)直接使用webstorm和vscode自带调试方式,直接通过launch.json进行调试(这种方法最常用)
(3)在控制台中调试
const a = 1;
const b = 2;
function sum(x,y){
return x+y;
}
sum(a,b);
浏览器调试:
node --inspect-brk useA.js
在浏览器中输入chrome://inspect
vscode调试:
进入到require源码需要借助vscode,打开一个文件夹,设置断点(在require处),打开launch.json,注掉
<!--
"skipFiles":[
"<node_internals>/**"
],
-->
分析node源码:
1、会默认调用require语法
2、Module.prototype.require模块的原型上有require方法
3、Module._load调用模块的加载方法,最终返回的是module.exports
4、Module._resolveFilename解析文件名 ,将文件名变成绝对路径,默认尝试添加.js/.json/.node
5、Module.__cache默认会判断是否存在缓存
6、new Module创建模块(对象) id, exports
7、把模块缓存起来,方便下次使用
--------------根据文件名(绝对路径)创建一个模块
8、tryModuleLoad 尝试加载模块 module.load
9、module.paths第三方模块查找的路径
10、获取当前模块的扩展名 根据扩展名调用对应的方法 Module.__extensions策略模式
11、获取文件的内容
12、调用Module.__compile方法
13、将用户的内容包裹到一个函数中(function (exports,require,module,__filename,__dirname){})
//最终返回的是module.exports,用户会给这个module.exports进行赋值
a.js
let a = 1;
module.exports = a;
useA.js
let r = require('./a');
console.log(this);
(function(exports,require,module,__filename,__dirname){
let a = 1;
module.exports = a;
return module.exports;
})