~ 核心模块(global 对象)

因为 Node.js 是运行在服务器端端 JS 环境,服务器程序和浏览器程序相比,最大的特点就是没有浏览器的安全限制了,而且服务器程序必须能够接收网络请求、读写文件和处理二进制内容

所以,Node.js 内置的常用模块就是为了实现基本的服务器功能,这些模块在浏览器环境中是无法被执行的,因为它们的底层代码是用 C/C++ 在 Node.js 运行环境中实现的。


JS 中有一个特殊的对象,称为全局对象(Global Object),它及其所有属性都可以在程序的任何地方访问,即全局变量。

  • 在 浏览器 JS 中,通常 window 是全局对象;
  • Node 中的全局对象是 global,所有全局变量(除了 global 外),都是 global 对象的属性。

全局变量

global 最根本的作用是作为全局变量的宿主。在 Node 中,我们可以直接访问到 global 的属性,而不需要在应用中包含它。按照 ECMAScript 的定义,满足以下条件的变量是全局变量:

  • 在最外层定义的变量;
  • 全局对象的属性;
  • 隐式定义的变量(未定义直接赋值的变量)。

当定义一个全局变量时,这个变量同时也会成为全局对象的属性,反之亦然。


[ Nodejs 参考文档 - 全局变量 ]  Buffer 类、console、global、process、URL ...

console.log(process.argv);  返回一个数组。
// 其中,第一个元素是nodejs安装环境的全路径;第二个元素是正在执行的js文件的全路径
   [
     '/Users/admin/.nvm/versions/node/v12.16.1/bin/node',
     '/Users/admin/webpiece/node/hello.js'
   ]

console.log(process.arch);  // 打印当前系统的架构(x64/x86)

模块作用域

在 Node 中你不可能在最外层定义变量,因为所有用户代码都属于当前模块, 而模块本身不是最外层上下文。

以下变量虽然看起来是全局的,但其实并不是。 它们仅存在于模块范围内(模块系统文档?!


#  __dirname               // 当前模块的目录名。与 __filenamepath.dirname() 相同

// 示例,从 /Users/mjr 运行 node example.js:
console.log(__dirname);
// 打印: /Users/mjr
console.log(path.dirname(__filename));
// 打印: /Users/mjr

#  __filename          // 当前模块的文件名。这是当前的模块文件的绝对路径(符号链接会被解析)

// 示例,从 /Users/mjr 运行 node example.js:
console.log(__filename);
// 打印: /Users/mjr/example.js
console.log(__dirname);
// 打印: /Users/mjr

#  exports              // 这是一个对于 module.exports 的更简短的引用形式


#  module             // 对当前模块的引用

module.exports 用于指定一个模块所导出的内容,即可以通过 require() 访问的内容。

#  require(id)       //  用于引入模块、 JSON、或本地文件

其中,id<string> 为模块的名称或路径;返回 <any> 导入的模块内容。


可以从 node_modules 引入模块。 可使用相对路径(如 ././foo./bar/baz../foo)引入本地模块或 JSON 文件,路径会根据 __dirname 定义的目录名或当前工作目录处理。

// 引入本地模块:
const myLocalModule = require('./path/myLocalModule');

// 引入 JSON 文件:
const jsonData = require('./path/filename.json');

// 引入 node_modules 模块或 Node.js 内置模块:
const crypto = require('crypto');

注意:最好不要使用 var 定义变量以避免引入全局变量,因为全局变量会污染命名空间,提高代码的耦合风险。