首先,咱们来了解一下nodejs执行起来主要须要什么node
commonjs是nodejs所用的模块规范chrome
咱们知道在浏览器中运行的JavaScript包含BOM、DOM,其中window就是一个全局对象,可是nodejs并无BOM、DOM这些东西,全部也没有window这个全局对象,取而代之的是global,一样里面也有一些属性和方法供咱们使用。json
表明当前执行的进程,挂在global下面浏览器
为了理解以上内容,咱们写这样一段代码缓存
而后在命令行里运行一下,输入下面这行代码进入调试模式(--inspect进入调试模式,-brk在开始的时候停下)bash
chrome://inspect
,回车后能够看到下面的界面
注意,不能直接将exports变量指向一个值,由于这样等于切断了exports与module.exports的联系。函数
下面的写法是无效的,由于exports再也不指向module.exports了。ui
exports = function(x) {console.log(x)};
复制代码
下面的写法hello函数是没法对外输出的,由于module.exports被从新赋值了。spa
exports.hello = function() {
return 'hello';
};
module.exports = 'Hello world';`
复制代码
这意味着,若是一个模块的对外接口,就是一个单一的值,不能使用exports输出,只能使用module.exports输出。命令行
举个栗子,咱们先写一个模块
接着,咱们在另外一个文件里引入这个模块
因此,module只有在第一次被加载的时候会执行
这个定义有点难懂,不过不要紧,咱们仍是经过例子来理解
咱们先写三个js文件
而后咱们执行main.js文件,执行步骤以下
首先引入了a.js文件,咱们去加载a.js文件
在a.js中第一行将x赋值 'a1',接着引入了b.js,咱们又去加载b.js文件
在b.js中第一行将x赋值 'b1',接着又去引入a.js文件,此时构成循环引用,所以只能引用a.js的部份内容,也就是exports.x='a1'
,又将x赋值为'a1',所以首先打印出b.js a1
接着,a.js打印出来a.js b2
,由于b.js的已经执行完毕了,因此引用到的x为b2
main.js文件中,因为a.js和b.js都已经执行完毕,因此打印出main.js a2
,main.js b2
控制点最终打印