nodejs API

65 阅读3分钟

Path

const path = require('node:path')
// 1.basename 返回给定路径的最后一部分
console.log(path.basename('/foo/bar/baz/asdf/quux.html')); // quux.html
// 2.dirname 返回给定路径的目录名
console.log(path.dirname('/foo/bar/baz/asdf/quux.html')); // /foo/bar/baz/asdf
// 3.extname 返回给定路径的扩展名 如果没有. 返回空字符串
console.log(path.extname('/foo/bar/baz/asdf/quux.html')); // .html
// 4.path.join() 拼接路径
console.log(path.join('/foo', 'bar', 'baz/asdf', 'quux', '..'));
// \foo\bar\baz\asdf
// 5.path.resolve() 返回绝对路径
console.log(path.resolve('/foo/bar', './baz')); // E:\foo\bar\baz
console.log(path.resolve('./baz')) // E:\learn_node\demo1\baz
console.log(path.resolve(__dirname, './index.js')); 
// E:\learn_node\demo1\index.js
// 6.parse() 返回一个对象 format() 逆向操作
console.log(path.parse('/foo/bar/baz/asdf/quux.html'));
// {
//     root: '/',
//     dir: '/foo/bar/baz/asdf',
//     base: 'quux.html',
//     ext: '.html',
//     name: 'quux'
// }
console.log(path.format(path.parse('/foo/bar/baz/asdf/quux.html')));
// /foo/bar/baz/asdf\quux.html
// 7.sep 返回平台特定的路径片段分隔符
console.log(path.sep); // \

os

const os = require('os');
// 1.paltform() 返回操作系统平台
console.log(os.platform()); // win32
// 2.release() 返回操作系统版本
console.log(os.release()); // 10.0.19041
console.log(os.type()); // Windows_NT
console.log(os.version()); // Windows 10 Home China
// 示例 判断不同操作系统 分别调用对应的shell命令
const paltform = os.platform();
const { exec } = require('child_process'); // 可以执行shell命令
const open = (url) => { 
    if (paltform === 'win32') {
        exec(`start ${url}`);
    } else if (paltform === 'darwin') {
        exec(`open ${url}`);
    } else if (paltform === 'linux') {
        exec(`xdg-open ${url}`);
    }
}
open('https://www.baidu.com');

process

// process
// arch: 返回处理器架构
console.log(process.arch); // x64
console.log(process.platform); // win32

// argv: 返回命令行参数
console.log(process.argv); 
// node index03.js --version
[ 'E:\\software\\nodejs\\node.exe', 'E:\\learn_node\\demo1\\index03.js', 
'--version' ]

// cwd: 返回当前工作目录
console.log(process.cwd()); // E:\learn_node\demo1

// memoryUsage: 返回内存使用情况
// console.log(process.memoryUsage());
// {
//     rss: 32210944, 物理内存存量
//     heapTotal: 5550080,
//     heapUsed: 4819432,
//     external: 355964,
//     arrayBuffers: 11218
// }

// exit: 退出进程 process.exit()
process.on('exit', () => { 
    console.log('退出进程');
});

// kill: 杀死进程 
// process.kill(process.pid);

// env: 获取环境变量 可以修改 修改只在当前进程有效 不会改变系统环境变量
// dev: cross-env NODE_ENV=dev node index03.js
// console.log(process.env.NODE_ENV); // dev

child_process

const path = require('node:path')

const { exec, execSync, spawn, spawnSync, execFile, execFileSync, fork } = require('child_process')

// 1.exec 异步的方法 回调函数 可以执行shell命令
exec('node -v', (err, stdout, stderr) => {
    console.log(stdout); // v14.15.4
});
// 2.execSync 同步的方法 返回值是一个buffer 执行较小的shell命令
console.log(execSync('node -v').toString()); // v14.15.4
// execSync('mkdir test')
// execSync('start chrome https://www.baidu.com')

// 3.spawn 返回流,实时返回
// const { stdout } = spawn('netstat')

// stdout.on('data', (data) => { 
//     console.log(data.toString());
// })

// stdout.on('close', () => { 
//     console.log('close');
// })

// 4.execFile 执行文件
execFile(path.resolve(__dirname, './bat.cmd'), null, (err, stdout) => {
    console.log(stdout);
});

// fork 创建一个新的进程
const testPorcess = fork(path.resolve(__dirname, './test.js'));
testPorcess.send('hello world');

util工具

const eventEmitter = require('events');

// 发布订阅 事件监听只能10个
const bus = new eventEmitter();
bus.setMaxListeners(20); // 设置最大监听数
bus.on('test', (data) => { 
    console.log(data);
})

bus.once('test', (data) => { 
    console.log(data);
})

bus.emit('test', 'hello world');
// bus.off('test', fn)

// util.promisify

const { exec } = require('child_process');
const util = require('node:util');

exec('node -v', (err, stdout, stderr) => { 
    if (err) { 
        return;
    }
    console.log(stdout);
})

const execPromise = util.promisify(exec);
execPromise('node -v').then((res) => {
    console.log(res);
}).catch((err) => { 
    console.log(err);
})

// 剖析promiseify如何实现的
const promiseify = (fn) => { 
    return (...args) => { 
        return new Promise((resolve, reject) => { 
            fn(...args, (err, ...values) => { 
                if (err) { 
                   return reject(err);
                }
                if (values && values.length > 1) {
                    let obj = {}
                    for(let key in values) { 
                        obj[key] = values[key];
                    }
                    resolve(obj);
                } else { 
                    resolve(values[0]);
                }
            })
        })
    }
}

const execPromise1 = promiseify(exec);
execPromise1('node -v').then((res) => {
    console.log(res);
}).catch((err) => { 
    console.log(err);
})

const fn = (type) => { 
    if (type === 1) { 
        return Promise.resolve('success');
    } else { 
        return Promise.reject('error');
    }
}
// 将promise类型的API变成 回调函数
const callback = util.callbackify(fn);
callback(1, (err, res) => { 
    console.log(err, res); // null success
})

fs文件

const fs = require('node:fs')
const fs2 = require('node:fs/promises')

// 不加sync的是异步读取
fs.readFile('./index.txt', {
    encoding: 'utf-8',
    flag: 'r'
}, (err, data) => {
    if (err) {
        console.error(err)
        return
    }
    console.log(data,'1')
})

// 同步方式阻塞下面代码
let data = fs.readFileSync('./index.txt')
console.log(data, '2') //返回二进制流
console.log(data.toString('utf-8')) // 转换成字符串
fs2.readFile('./index.txt').then((data) => { 
    console.log(data.toString('utf-8'), '3')
})

// 读大文件
const readStream = fs.createReadStream('./index.txt')
readStream.on('data', (chunk) => { 
    console.log(chunk.toString('utf-8'), 'chunk')
})
readStream.on('end', () => {
    console.log('读取完成')
})

// 创建文件
fs.mkdirSync('./test')
fs.mkdirSync('./test2/test3', { recursive: true }) // 递归创建文件夹

// 删除文件
fs.rmSync('./test2', { recursive: true }) // 删除文件夹

// 重命名
fs.renameSync('./test', './test1')

fs.watch('./index.txt', (eventType, filename) => { 
    console.log(eventType, filename) // change index.txt
})

// 写文件
fs.writeFileSync('./index.txt', 'hello world') // 会覆盖原来的内容
fs.writeFileSync('./index.txt', '\nhello world1', { flag: 'a' }) // 追加内容
fs.appendFileSync('./index.txt', '\nhello world2') // 追加内容

// 大量数据分批插入
let verse = ['hello world3', 'hello world4', 'hello world5']
let writeStream = fs.createWriteStream('./index.txt')
verse.forEach((item) => {
    writeStream.write(item + '\n')
})
writeStream.end()

writeStream.on('finish', () => {
    console.log('写入完成')
})

// fs.linkSync('./index.txt', './index2.txt') // 创建硬链接 共享备份

fs.symlinkSync('./index.txt', './index3.txt') // 创建软链接 删除源文件软链接失效 类似快捷方式