node环境与CommonJS规范

1. 环境

首先,咱们来了解一下nodejs执行起来主要须要什么node

  • CommonJS

commonjs是nodejs所用的模块规范chrome

  • global对象

咱们知道在浏览器中运行的JavaScript包含BOM、DOM,其中window就是一个全局对象,可是nodejs并无BOM、DOM这些东西,全部也没有window这个全局对象,取而代之的是global,一样里面也有一些属性和方法供咱们使用。json

  • process

表明当前执行的进程,挂在global下面浏览器

1.1 CommonJS

  • 每一个文件是一个模块,有本身的做用域
  • 在模块内部module变量表明模块自己
  • module.exports 属性表明模块对外的接口

为了理解以上内容,咱们写这样一段代码缓存

而后在命令行里运行一下,输入下面这行代码进入调试模式(--inspect进入调试模式,-brk在开始的时候停下)bash

接着咱们打开chrome进入 chrome://inspect,回车后能够看到下面的界面

点击inspect就能够进入调试界面了

从图中咱们能够看到,咱们实际执行的代码在nodejs中运行的时候,被一个括号和一个分号包裹住,里面是一个function,这些都是nodejs内部帮咱们作的(模块本身的做用域),这个function传入了5个变量,分别是

  • exports

exports是一个对象,表明模块的输出,对外提供看模块接口,指向module.exports。

注意,不能直接将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输出。命令行

  • require

require是一个function,表示调用别的模块时须要调用的function

  • module

module是一个对象,里面有一个exports属性。表明模块自己

  • __filename

文件路径

  • __dirname

文件所在文件夹路径

2. require

2.1 require规则

  • /表示绝对路径,./表示相对于当前文件的
  • 支持js、json、node扩展名,不写依次尝试
  • 不写路径则认为是build-in模块或者各级node_modules内的第三方模块

2.2 require特性

  • module 被加载的时候执行,加载后缓存

举个栗子,咱们先写一个模块

这个模块导出一个变量num,并在开始的时候打印一个'hello'

接着,咱们在另外一个文件里引入这个模块

运行这个文件

能够看到,咱们加载了两次demo模块,而hello只打印了一次

因此,module只有在第一次被加载的时候会执行

  • 一旦出现某个模块被循环加载,就只输出已经执行的部分,还未执行的部分不会输出

这个定义有点难懂,不过不要紧,咱们仍是经过例子来理解

咱们先写三个js文件

而后咱们执行main.js文件,执行步骤以下

  1. 首先引入了a.js文件,咱们去加载a.js文件

  2. 在a.js中第一行将x赋值 'a1',接着引入了b.js,咱们又去加载b.js文件

  3. 在b.js中第一行将x赋值 'b1',接着又去引入a.js文件,此时构成循环引用,所以只能引用a.js的部份内容,也就是exports.x='a1',又将x赋值为'a1',所以首先打印出b.js a1

  4. 接着,a.js打印出来a.js b2,由于b.js的已经执行完毕了,因此引用到的x为b2

  5. main.js文件中,因为a.js和b.js都已经执行完毕,因此打印出main.js a2,main.js b2

控制点最终打印

相关文章
相关标签/搜索