~ 核心模块(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 // 当前模块的目录名。与
__filename的path.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 定义变量以避免引入全局变量,因为全局变量会污染命名空间,提高代码的耦合风险。