HolyZheng / holyZheng-blog

草稿
36 stars 0 forks source link

nodejs基础学习笔记 #27

Open HolyZheng opened 5 years ago

HolyZheng commented 5 years ago

什么是node

借助v8引擎,利用c++编写了一个程序——node.exe。所以node是一个JavaScript 的 runtime environment。它跟浏览器提供的runtime environment不完全一致,例如没有document 对象,但是又多了很多浏览器没有提供的对象比如fs http 等等。直白点就是node是一个JavaScript 的 runtime environment。

node如何工作

node以一种异步的方式工作,一个单线程可以处理多个请求,当处理某个请求的时候,执行了相应的请求代码后,不需等待其返回结果,直接处理其他请求。正在等待的请求会放到一个事件队列里

模块系统

node自带的模块有 os,fs,events,http等。

// node.js
var me = ''
console.log(global.me)  // undefined
// js
var me = ''
console.log(window.me)  // ''

因为在JavaScript中,全局环境下定义的变量和方法会添加到全局对象window中,而在node文件中定义的变量和方法,只属于该文件作用域而不是属于global。在node中通常一个文件被认为是一个模块。模块内定义的所以变量和方法都是该模块私有的,如果我们想在模块外使用该模块里的变量或方法,需要将该变量和方法 export 出去。一个node应用通常为模块的集合——主模块和功能模块。

// node.js
console.log(module)

Module {
  id: '.',
  exports: {},
  parent: null,
  filename: 'E:\\documents\\Code_learn\\try\\express-learn\\en.js',
  loaded: false,
  children: [],
  paths:
   [ 'E:\\documents\\Code_learn\\try\\express-learn\\node_modules',
     'E:\\documents\\Code_learn\\try\\node_modules',
     'E:\\documents\\Code_learn\\node_modules',
     'E:\\documents\\node_modules',
     'E:\\node_modules' ] }

module.exports 这个对象默认情况下为空对象,任何被添加到该对象中的变量和方法都会从该模块中暴露出去,这些变量和方法变得可在模块外使用。 require 方法用来引入其他模块。

// log.js
let log = () => {
  console.log(1)
}
module.exports.log = log

// en.js
let ob = require('./log')
console.log(ob)

$ node en.js
{ log: [Function: log] }
// log.js
let log = () => {
  console.log(1)
}
module.exports = log

// en.js
let ob = require('./log')
console.log(ob)

$ node en.js
[Function: log]

node是如何实现它的模块化的呢?其实我们的每一个文件node都会把它转变成一个立即执行函数:

(function (exports, require, module, __filename, __dirname) {
  // some code in our file
})

所以我们每一个文件中的exports require module等并不是全局变量,而是通过该函数的参数传递进来的实参。其中exports是一个指向module.exports的指针。也就是说在每一个模块中:

// 我们可以通过以下方式来导出对象或方法
module.exports = fn
module.exports.fn = fn
module.exports = { fn }
exports.fn = fn
// 但是不能,因为这样只是改变了exports指向
exports = fn

我们可以看看filename,dirname两个参数的值:

console.log(__dirname) // 该文件所在的目录
console.log(__filename)  // 该文件目录

E:\documents\Code_learn\try\express-learn
E:\documents\Code_learn\try\express-learn\en.js

常用的 node module

node中有很多比较常用的module,比如Buffer,HTTP,File System,OS,Path,Process,Query String,Stream等。

path module

官网相应文档:path

const path = require('path')
// 将路径转为一个对象
var pathObj = path.parse(__filename)
console.log(pathObj)

$ node en.js
{ root: 'E:\\',
  dir: 'E:\\documents\\Code_learn\\try\\express-learn',
  base: 'en.js',
  ext: '.js',
  name: 'en' }

os mudule

官网相关文档:OS

const os = require('os')
var totalMemory = os.totalmem()
var freeMemory = os.freemem()

console.log(`Total Memory: ${totalMemory}`)
console.log(`Free Memory: ${freeMemory}`)

$ node en.js
Total Memory: 8476856320
Free Memory: 3928731648

File System

官网相关文档:file system

const fs = require('fs')

// 同步
const files = fs.readdirSync('./')
console.log('Sync', files)

// 异步

fs.readdir('./', (err, files) => {
  if (err) console.log(err)
  else console.log('Async', files)
})

$ node en.js
Sync [ 'a', 'en.js', 'log.js', 'package.json' ]
Async [ 'a', 'en.js', 'log.js', 'package.json' ]

Event

官网相关文档: Event

// logger.js
const EventEmitter = require('events')

class Logger extends EventEmitter {
  log () {
    this.emit('messageLogged', {one: 1, two: 2})
  }
}
module.exports = Logger

// app.js
const Logger = require('./logger')
const logger = new Logger();

logger.on('messageLogged', (arg) => {
  console.log('Listener called', arg)
})

logger.log()

$ node app.js
Listener called { one: 1, two: 2 }

HTTP module

官网相关文档:HTTP

const http = require('http')
const server = http.createServer((req, res) => {
  if (req.url === '/') {
    res.write('Hello World')
  }
})
server.listen(3000)
console.log('Listening on port 3000!')