# 1. NodeJS的优势

  • JS适合资源密集型操作,单线程,支持高并发,如果是CPU密集型会一直占用这个线程
  • NodeJS可以充分单核CPU的性能,高并发是相对的。

# 2. NodeJS 全局变量和全局对象

# 2.1. 全局对象

所有模块都可以调用 1)global:表示Node所在的全局环境,类似于浏览器中的window对象。 2)process:指向Node内置的process模块,允许开发者与当前进程互动。 例如你在DOS或终端窗口直接输入node,就会进入NODE的命令行方式(REPL环境)。退出要退出的话,可以输入 process.exit(); 3)console:指向Node内置的console模块,提供命令行环境中的标准输入、标准输出功能。 通常是写console.log(),无须多言

# 2.2. 全局函数:

1)定时器函数:共有4个,分别是setTimeout(), clearTimeout(), setInterval(), clearInterval()。 2)require:用于加载模块。

# 2.3. 全局变量:

1)_filename:指向当前运行的脚本文件名。 2)_dirname:指向当前运行的脚本所在的目录。

# 2.4. 准全局变量

模块内部的局部变量,指向的对象根据模块不同而不同,但是所有模块都适用,可以看作是伪全局变量,主要为module,module.exports, exports等。

module变量指代当前模块。module.exports变量表示当前模块对外输出的接口,其他文件加载该模块,实际上就是读取module.exports变量

  • module.id 模块的识别符,通常是模块的文件名。
  • module.filename 模块的文件名。
  • module.loaded 返回一个布尔值,表示模块是否已经完成加载。
  • module.parent 返回使用该模块的模块。
  • module.children 返回一个数组,表示该模块要用到的其他模块

# 3. http-server 启动本地服务器

npm install -g http-server

http-server 目录,启动一个本地服务器

  • -p 端口号 (默认 8080)
  • -a IP 地址 (默认 0.0.0.0)
  • -o 在开始服务后打开浏览器

# 4. nodeJS 获取IP和Mac地址

var os=require("os");

var networkInterfaces=os.networkInterfaces();

console.info(networkInterfaces);

# 5. fs 的常用API

# 5.1. fs

fs.unlink(path)   // 删除文件

fs.rename(path, newPath)   // 重命名文件

fs.readFile(path, {encoding: 'utf8'})   // 读取文件

fs.writeFile(path, content, {encoding: 'utf8'})   // 写入文件

# 5.2. fs 的 Promise

node10以后,fs增加了Promise,直接返回结果,如:

const readFile = (path) => {
  return fs2.readFile(path, {encoding: 'utf-8'})
 }

const testPath = path.join(__dirname, 'helper.js')

readFile(testPath).then(res => {
  console.log(res)
})

# 6. 流

流的类型:

  • 可读流
  • 可写流
  • 双向流
  • 转换流

注意,流是基于事件的。

pipe做的事情:

readable.on('data', (chunk)=>{
  writable.write(chunk)
})

readable.on('end', ()=>{
  writable.end()
})

转换流:将一个流转到另一个流,比如读取一个文件,压缩后再写入到另一个文件。gulp的很多模块就是用转换流实现的。

例子:

src.pipe(zlib.createGzip()).pipe(writeDesc)

# 6.1. NodeJS 流基本用法:

// 创建一个可读流
var readerStream = fs.createReadStream('input.txt');

// 创建一个可写流
var writerStream = fs.createWriteStream('output.txt');

// 管道读写操作
// 读取 input.txt 文件内容,并将内容写入到 output.txt 文件中
readerStream.pipe(writerStream);

# 7. 扫描所有视频文件

const path = require('path')
const fs = require('fs')

// 要遍历的根目录
// const firstPath = path.join(__dirname, '.')
const firstPath = 'D:'
const saveFileLocation = path.join(__dirname, 'video_list.txt')
readDir(firstPath)

let count = 1
// 遍历目录
function readDir(rootPath) {
  fs.readdir(rootPath, {encoding: 'utf8'}, (err, files) => {
    if(!files || !files.length) return
    
    files.forEach(file => {
      const filePath = `${rootPath}/${file}`
      
      fs.stat(filePath, (err, info) => {
        if (info && info.isDirectory()) {
          readDir(filePath)
        } else {
          const extName = path.extname(filePath)
          if (['.mp4', '.avi', '.mkv', '.rmvb'].includes(extName)){
            writeToFile(saveFileLocation, `${count}. ${filePath}\n`)
            count += 1
          }
        }
      })
    }) 
  })
}

function writeToFile(file, data) {
  fs.writeFile(file, data, {flag: 'a'}, (err,a,b) =>{
  })
}