3. path
模块
用于处理文件路径,包括解析、拼接、规范化路径等操作。
const path = require('path');
path
模块是 Node.js 中的核心模块之一,用于处理文件路径和目录路径。通过 path
模块,我们可以方便地操作和转换不同平台上的文件路径。
路径操作方法
以下是 path
模块中常用的路径操作方法:
path.join([...paths])
:将多个路径片段连接起来,并返回新的路径字符串。例如:path.join('/foo', 'bar', 'baz/asdf', 'quux', '..')
输出为/foo/bar/baz/asdf
。path.resolve([...paths])
:将一个或多个路径解析为绝对路径,并返回新的路径字符串。相当于执行多次cd
命令后再执行pwd
命令得到的路径。例如:path.resolve('/foo/bar', './baz')
输出为/foo/bar/baz
。path.dirname(path)
:返回路径的目录名。例如:path.dirname('/foo/bar/baz/asdf/quux.txt')
输出为/foo/bar/baz/asdf
。path.basename(path[, ext])
:返回路径的文件名。如果指定了第二个参数ext
,则移除文件名的扩展名。例如:path.basename('/foo/bar/baz/asdf/quux.txt')
输出为quux.txt
。path.extname(path)
:返回路径的扩展名。例如:path.extname('index.html')
输出为.html
。
路径格式化方法
以下是 path
模块中常用的路径格式化方法:
path.normalize(path)
:规范化路径,解析..
和.
等符号,并返回新的路径字符串。例如:path.normalize('/foo/bar//baz/asdf/quux/..')
输出为/foo/bar/baz/asdf
。path.isAbsolute(path)
:判断路径是否为绝对路径,返回布尔值。例如:path.isAbsolute('/foo/bar')
输出为true
。path.relative(from, to)
:根据当前工作目录,将路径from
转换为相对于路径to
的相对路径,并返回新的路径字符串。例如:path.relative('/data/orandea/test/aaa', '/data/orandea/impl/bbb')
输出为../../impl/bbb
。
路径拆分方法
以下是 path
模块中常用的路径拆分方法:
path.parse(path)
:由文件路径返回一个对象,包含路径的各个组成部分,如dir
(路径)、base
(文件名+扩展名)、name
(文件名)和ext
(扩展名)。例如:path.parse('/foo/bar/baz/asdf/quux.txt')
返回{ root: '/', dir: '/foo/bar/baz/asdf', base: 'quux.txt', ext: '.txt', name: 'quux' }
。path.format(pathObject)
:根据一个路径对象返回路径字符串。例如:path.format({ dir: '/foo/bar/baz/asdf', base: 'quux.txt' })
输出为/foo/bar/baz/asdf/quux.txt
。
总结:path
模块是 Node.js 中用于处理文件路径和目录路径的核心模块。通过 path
模块,我们可以进行路径的拼接、解析、格式化等操作。在跨平台开发时,使用 path
模块可以确保路径的正确性和一致性。
4. events
模块
提供了事件触发器和事件监听器的功能,可用于实现事件驱动的编程模式。
const EventEmitter = require('events');
events
模块是 Node.js 中的核心模块之一,用于实现事件驱动的编程。通过 events
模块,我们可以创建、触发和处理事件,从而实现模块间的解耦和异步编程。
EventEmitter 类
events
模块提供了 EventEmitter
类,它是一个基于观察者模式的事件处理器。通过继承 EventEmitter
类,我们可以创建自定义的事件对象,并在对象中注册处理事件的回调函数。
创建事件对象
可以通过以下方式创建事件对象:
const EventEmitter = require('events'); class MyEmitter extends EventEmitter {} const myEmitter = new MyEmitter();
在上述代码中,我们首先引入 events
模块并获取 EventEmitter
类。然后,我们定义了一个自定义类 MyEmitter
,该类继承自 EventEmitter
。最后,我们创建了一个 myEmitter
对象,该对象就是我们自定义的事件对象。
注册事件处理函数
可以使用 on
方法为事件注册处理函数,如下所示:
myEmitter.on('event', () => { console.log('Event occurred'); });
在上述代码中,我们使用 on
方法为 event
事件注册了一个处理函数。当事件被触发时,该处理函数将会被执行。
触发事件
可以使用 emit
方法触发事件,并传递参数给事件处理函数,如下所示:
myEmitter.emit('event');
在上述代码中,我们使用 emit
方法触发了 event
事件。当事件被触发时,与之相关联的处理函数将会被执行。如果有参数需要传递给事件处理函数,可以在 emit
方法中指定。
一次性事件处理函数
除了 on
方法外,events
模块还提供了 once
方法,用于注册一次性的事件处理函数。例如:
myEmitter.once('event', () => { console.log('Event occurred only once'); });
在上述代码中,我们使用 once
方法为 event
事件注册了一个一次性的处理函数。该处理函数只会被触发一次,之后就会自动解绑。
异步事件处理函数
当事件处理函数需要进行异步操作时,可以利用回调函数或 Promises
实现异步处理。例如:
myEmitter.on('event', (arg, callback) => { setTimeout(() => { console.log(arg); callback(); }, 1000); }); myEmitter.emit('event', 'Hello, World!', () => { console.log('Event handling completed'); });
在上述代码中,我们的事件处理函数通过使用 setTimeout
函数模拟了一个异步操作。在异步操作完成后,调用了回调函数 callback
。在触发事件时,我们还可以传递额外的参数给事件处理函数。
移除事件处理函数
可以使用 off
或 removeListener
方法移除事件处理函数。例如:
const callback = () => { console.log('Event occurred'); }; myEmitter.on('event', callback); myEmitter.off('event', callback);
在上述代码中,我们使用 on
方法注册了一个事件处理函数,然后使用 off
方法将其移除。removeListener
方法与 off
方法作用相同,可以选择使用其中之一。
继承 EventEmitter 类
除了直接使用 EventEmitter
类创建事件对象外,还可以通过继承该类来创建自定义的事件对象。这种方式允许我们在自定义事件对象中添加额外的属性和方法。
const EventEmitter = require('events'); class MyCustomEmitter extends EventEmitter { constructor() { super(); this.customProperty = 'Hello, World!'; } customMethod() { console.log('Custom method invoked'); } } const myCustomEmitter = new MyCustomEmitter(); myCustomEmitter.on('event', () => { console.log(myCustomEmitter.customProperty); myCustomEmitter.customMethod(); }); myCustomEmitter.emit('event');
在上述代码中,我们定义了一个自定义事件对象 MyCustomEmitter
,并通过继承 EventEmitter
类来实现。在构造函数中,我们初始化了一个自定义属性 customProperty
和一个自定义方法 customMethod
。然后,我们创建了一个 myCustomEmitter
对象,注册了一个事件处理函数,并触发了 event
事件。在事件处理函数中,我们可以访问自定义属性和调用自定义方法。
总结:events
模块是 Node.js 中用于实现事件驱动编程的核心模块。通过 EventEmitter
类,我们可以创建事件对象,并在对象中注册处理事件的回调函数。使用 on
方法注册事件处理函数,使用 emit
方法触发事件。此外,还可以使用 once
方法注册一次性事件处理函数,使用 off
或 removeListener
方法移除事件处理函数。我们还可以继承 EventEmitter
类来创建自定义的事件对象,并在其中添加自定义的属性和方法。