NodeJS
文章目录
NodeJS 核心
概述:Node.js 是一个基于 Chrome v8 引擎的 js 运行环境。
Node 全局对象(global)
提供类似部分 webApi 的方法和其他属性:
-
setTimeout
-
setInterval
-
setImmediate
-
console
-
__dirname 当前模块的目录名(看似是全局变量,实质是模块变量(module))
-
__filename 当前模块文件名(同上) ———— 当前的模块文件的绝对路径
-
Buffer 处理二进制数据的
类
Buffer 类是 JavaScript 语言内置的
Uint8Array
类的子类 → 中文文档 -
process 进程
-
process.arch 操作系统的 CPU 架构 (一般我们使用的电脑是 x32 / x64)
-
process.argv 获取命令中的所有参数
// 如仅在 index.js 输出下面的属性 console.log(process.argv); /** [ 'D:\\软件\\Node.js_setup\\node.exe', 'e:\\FontEnd_File\\JavaScript\\NodeJS\\pro_demo\\index.js' ] */
-
process.env 返回环境变量对象
-
process.cwd() 返回 Node.js 进程的当前工作目录(绝对路径)
-
process.exit([code]) 退出状态 code 指示 Node.js 同步地终止进程(code 默认值为 0)
-
process.kill(pid[, signal]) 根据 pid 杀死进程 (pid 为进程 ID;signal 将发送的信号,默认值:‘SIGTERM’)
-
process.platform 获取当前的操作系统
-
Node模块化细节
模块的查找
- 根据绝对路径直接加载模块
- 根据相对路径(相对于当前模块)加载模块(以
./
或../
开头),内部也会转换为绝对路径来加载模块 - 相对路径(没以 ./ 或 …/ 开头的模块)查找加载规则:
① 检查是否是内置模块,如fs
/path
等
② 检查当前目录中的 node_modules 目录下有没有
③ 检查上级目录中的 node_modules 目录
④ 找到则转换为绝对路径(否则报错,找不到这个模块)
⑤ 加载模块 - 若不写后缀名,node 会自动补全(补全顺序为:
js → json → node → mjs
) - 若只提供目录而没有提供文件名,则自动在该目录下寻找
index.js
(默认);若修改过 package.json 中的 main 字段,则根据此字段指定的文件加载
require函数
// 某模块 (a.js) 内代码为:
exports.c = 3;
module.exports = {
a: 1,
b: 2
}
this.m = 4;
↓
// 由另一模块 (b.js) 导入结果是什么?
const result = require('./a.js');
console.log(result); // ???
// 结果:
result = {
a: 1,
b: 2
}
上题结果来源需理解导入函数 require
内部实现, 如下所示:
// require函数大致处理流程(非其内部真正代码)
function require(modulePath){
// 1. 将modulePath转换为绝对路径 './src' -> 'D:\code_file\NodeJS\Node_Modules\index.js'
// 2. 判断该模块是否已有缓存(生成的绝对路径会作为缓存对象内部的键,值为模块代码)
/**
if(require.cache['D:\\code_file\\NodeJS\\Node_Modules\\index.js']){
return require.cache['D:\\code_file\\NodeJS\\Node_Modules\\index.js'].result;
}
*/
// 3. 读取文件内容(没有缓存执行此步,否则直接拿缓存结果)
// 4. 将读取的文件内容包裹到一个函数中
/** 大致效果(伪代码)
function __temp(module, exprots, require, __dirname, __filename){
// 读取的文件内容(即拿到的代码)
}
*/
// 5. 创建module对象
/**
module.exports = {};
const exports = module.exports;
__temp.call(module.exports, module, exports, require, module.path, module.filename);
// 这里绑定了 this === module.exports
*/
return module.exports;
}
因而上题的理解过程为:
- 内部导出的 module.exports === exports;
- 新增 c 属性为 3, 即 module.exports = exports = this = { c: 3 };
- 对 module.exports 重新赋值为一个新对象 { a: 1, b: 2 }
- this 与 exports 均指向原来的对象
- require 函数返回的对象是: module.exports 即新对象
- 所以,b.js 导入 a.js 打印的结果就是
{ a: 1, b: 2 }
Node中的ES模块化
目前,Node中的 ES 模块化仍然处于实践阶段
模块要么是 CommonJS,要么是 ES(一个文件中不能混用):
- 默认情况下,均是
CommonJS
; - ES 模块处理办法:
- 单个文件使用 ES module,更改其文件名后缀为
.mjs
- 全部使用 ES 模块化,在
package.json
文件中加入"type": "module"
- 单个文件使用 ES module,更改其文件名后缀为
当使用 ES 模块化运行时,命令行必须加上 --experimental-modules
语句,如:
node --experimental-modules index.mjs
基本内置模块
OS
const os = require(‘os’);
- os.EOL 一行结束的分隔(换行)符(不同的操作系统,换行符不同,所以可以使用此常量)
- os.arch() 获取 cpu 的架构名(主要是 x64 / x32)
- os.cpus() 获取 cpu 核的信息(几核芯片)
- os.freemem() 获取当前空闲内存量(单位是字节)
- os.homedir() 获取当前用户的主目录的字符串路径
- os.hostname() 获取当前操作系统主机名
- os.tmpdir() 获取操作系统的默认临时文件目录
path
const path = require(‘path’);
-
path.basename(path[, ext]) 法返回 path 的最后一部分,参数 path 中之前的路径内容将会被忽略
path <string>
文件路径
ext
可选文件扩展名
如果 path 不是字符串、或给定了 ext 但不是字符串,则抛出 TypeError -
path.delimiter 提供平台特定的路径定界符
-
path.dirname 返回 path 的目录名
const path = require('path'); console.log(path.dirname('asdas/sfdasf/fasf/a.js')); // 返回 "asdas/sfdasf/fasf"
-
path.extname() 返回文件名后缀名
-
path.join(fullpath) 拼接多个字符串为一个路径
const path = require('path'); const fullpath = path.join('a', 'b', '../', 'c.js'); console.log(fullpath); // 输出: a\c.js (windows系统下)
-
path.normalize() 规范化给定的 path,解析 ‘…’ 和 ‘.’ 片段
path.normalize('C:\\temp\\\\foo\\bar\\..\\'); // 返回: 'C:\\temp\\foo\\'
-
path.relative(from, to) 根据当前工作目录返回 from 到 to 的相对路径
-
path.resolve([…paths]) 将路径或路径片段的序列解析为绝对路径
给定的路径序列从右到左进行处理,每个后续的 path 前置,直到构造出一个绝对路径// 当前工作目录是:E:\FontEnd_File\JavaScript\NodeJS\pro_demo console.log(path.resolve('wwwjooo', 'dashia/mnjj', './index')); // 返回: E:\FontEnd_File\JavaScript\NodeJS\pro_demo\wwwjooo\dashia\mnjj\index console.log(path.resolve('/foo/bar', './bax')); // 返回: e:\foo\bar\bax
-
path.sep 提供平台特定的路径片段分隔符 (windows 系统返回
\
)
url
-
由 url 生成对象
const URL = require('url'); const url = new URL.URL('http://user:[email protected]:8080/p/a/t/h?query=name#hash'); // 或者调用 URL.parse() 方法