Node.js

作者: greenteaObject | 来源:发表于2018-02-09 23:45 被阅读0次
nodejs.png

前置概念

CPU密集

进行的一些压缩,解压,加密,解密等计算都属于CPU密集

I/O密集

文件的读取,网络操作,数据库等操作时,为I/O密集

高并发

单位时间内的访问量

进程

是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位

NodeJS工作模型

image.png
此时,NodeJS可以处理很多用户发来的一些请求,而这写请求不会因为调用I/O操作而空闲,也就是非阻塞I/O,CPU可以不停的进行接收请求,并进行I/O操作,而I/O操作则是多线程的,当I/O操作完成后,CPU再讲数据返回给客户端.NodeJS解决了CPU上的空闲和处理高并发的能力

线程

进程内一个相对独立的,可调度的执行单元,与同属一个进程的线程共享进程的资源

多线程

启动一个进程,在一个进程内启动多个线程,这样,多个线程也可以一块执行多个任务

NodeJS单线程

单线程只是针对主进程,I/O操作系统底层多线程调度. 单线程并不是单进程

环境

CommonJS

每个文件是一个模块,有自己的作用域
在模块内部module变量代表模块本身
module.exports属性代表模块对外接口

require 规则
  • / 表示绝对路径,./表示相对于当前文件的路径
  • 支持js,json,node扩展名,不写一次尝试
  • 不写路径则认为是build-in模块或者各级node_modules内的第三方模块
require 特性
  • module被加载的时候执行,加载后缓存
  • 一旦出现某个模块被循环加载,就只输出已经执行的部分,还未执行的部分不会输出
module.exports与exports的区别
const exports = module.exports // exports就是module.exports的简写

(
    function(exports, require, module, __filename, __dirname) {
        // code
    }
)
exports.test = 100
exports = {
    a: 1,
    b: 2
}

如果写成exports,那么exports的指向就会被改变,它不再指向module.exports,也就什么都没有输出
因此:

module.exports = {
    a: 1,
    b: 2
}

此时,module.exports将指向了这个对象,即输出了这个对象

模块对外的输出永远是module.exports,你可以添加它的属性,但是你不能修改它的指向,如果exports的指向被修改,那么它将不会对外输出

global

  • CommonJS
  • Buffer,process,console
  • timer
// mod1
global.test = 100
// mod2
console.log(test)  // 100

process

const {argv, argv0, execArgv, execPath} = process
// argv 启动这个process的时候的所有参数
// argv0 保存了argv这个数组的引用
// execArgv 调用node所调用的特殊参数
// execPath argv的第一个参数
argv.forEach(item => {
    console.log(item)
})
const {env} = process
console.log(env)   // 执行环境
console.log(process.cwd())  // 当前命令所执行的路径
setImmediate(() => {
    console.log('setImmediate')
})

setTimeout(() => {
    console.log('setTimeout')
}, 0);

process.nextTick(() => {
    console.log('nextTick')
})

nextTick是将其放在了当前队列的队尾,而setImmediate是放在了下一个队列的队尾,setTimeout是放在两者之间

基础API

normalaize

处理路径

const {normalize} = require('path')
console.log(normalize('/usr//local/bin'))

join

拼接路径

const {join} = require('path')
console.log(join('/usr', 'local', 'bin/'))

resolve

相对路径解析为绝对路径

const {resolve} = require('path')
console.log(resolve('./'))

basename dirname extname

const {basename, dirname, extname} = require('path')
const filePath = '/usr/local/bin/no.txt'
console.log(basename(filePath)) // 文件名
console.log(dirname(filePath)) // 路径
console.log(extname(filePath)) // 扩展名

parse format

分析路径

const {parse, format} = require('path')
const filePath = '/usr/local/include'
const ret = parse(filePath)
console.log(ret)
console.log(format(ret))    // 将拆分的路径执行回来

输出

{ root: '/',
  dir: '/usr/local',
  base: 'include',
  ext: '',
  name: 'include' }

sep delimiter win32 posix

和操作系统相关的一些东西

const {sep, delimiter, win32, posix} = require('path')
console.log('sep:', sep)    // 路径分隔符 /
console.log('win sep', win32.sep) // \
console.log('PATH:', process.env.PATH)  
// PATH: /Library/Frameworks/Python.framework/Versions/3.6/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin 
console.log('delimiter:', delimiter) // :
console.log('win delimiter:', delimiter) // :
总结

__dirname,__filename 总是返回文件的绝对路径
process.cwd()总是返回执行node命令所在文件夹

Buffer

处理二进制数据流 实例类似整数数组,大小固定

console.log(Buffer.alloc(10))
console.log(Buffer.alloc(5, 1))
console.log(Buffer.allocUnsafe(5,1))
console.log(Buffer.from([1,2,3]))
console.log(Buffer.from('test'))
<Buffer 00 00 00 00 00 00 00 00 00 00>
<Buffer 01 01 01 01 01>
<Buffer 18 e3 04 04 01>
<Buffer 01 02 03>
<Buffer 74 65 73 74>
console.log(Buffer.byteLength('test'))  // 字节长度
console.log(Buffer.byteLength('测试'))    
console.log(Buffer.isBuffer({}))     // false
console.log(Buffer.isBuffer(Buffer.from([1, 2, 3])))     // true
const buf1 = Buffer.from('h')
const buf2 = Buffer.from('e')
const buf3 = Buffer.from('l')
const buf4 = Buffer.from('l')
const buf5 = Buffer.from('o')

const buf = Buffer.concat([buf1, buf2, buf3, buf4, buf5])
console.log(buf)    // 连接buffer
const buf = Buffer.from('this is a test')
/* buf.length
buf.toString()
buf.fill()    // 填充
buf.equals()    
buf.indexOf()
buf.copy() */

events

const EventEmitter = require('events')

class CustomEvent extends EventEmitter {

}
const ce = new CustomEvent()
ce.on('test', () => {
    console.log('this is a test')
})
setInterval(() => {
    ce.emit('test')
}, 500)
const EventEmitter = require('events')

class CustomEvent extends EventEmitter{}

const ce = new CustomEvent()

ce.on('error', err => {
    console.log(err)
})

ce.emit('error', new Error('oops'))

执行一次

import { setInterval } from 'timers';

const EventEmitter = require('events')

class CustomEvent extends EventEmitter{}

const ce = new CustomEvent()

ce.once('test', () => {
    console.log('test event')
})

setInterval(() => {
    ce.emit('test')
}, 500)

移除

const EventEmitter = require('events')
class CustomEvent extends EventEmitter{}
const ce = new CustomEvent()
function fn1() {
    console.log('fn1')
}

ce.on('test', fn1)
ce.on('test', fn2)

setInterval(() => {
    ce.emit('test')
}, 500)

setTimeout(() => {
    ce.removeListener('test', fn2)
}, 1500);

fs

读文件

const fs = require('fs')

fs.readFile('./module2.js','utf8', (err, data) => {
    if (err) throw err
    console.log(data)
})

同步操作

const data = fs.readFileSync('./module1.js', 'utf8')
console.log(data)

写文件

const fs = require('fs')

fs.writeFile('./text', 'this is a test', {
    encoding: 'utf8'
}, err => {
    if(err) throw err
    console.log('done')
})

查看文件状态

const fs = require('fs')

fs.stat('./fs.js', (err, stats) => {
    if(err) throw err
    console.log(stats.isFile())
    console.log(stats.isDirectory())
    console.log(stats)
})

重命名

const fs = require('fs')

fs.rename('./text', 'text.txt', err => {
    if (err) throw err
})

打印目录的文件名

const fs = require('fs')

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

删除文件夹

const fs = require('fs')

fs.rmdir('./text', err => {
    if(err) throw err
})

监视文件或目录的变化

相关文章

  • nodejs安装

    Node.js安装 目录 Node.js简单介绍 windows安装Node.js Linux安装Node.js ...

  • node.js基础

    什么是node.js Node.js特点 node.js优点和缺点

  • Nodejs.2

    参考内容:Node.js EventEmitter 四、Node.js EventEmitter Node.js所...

  • nodejs第一步

    Node.js 是什么?Node.js与JavaScript的区别是什么? Node.js的优点?Node.js的...

  • node 学习笔记.md

    Node.js第一天 1. 初识Node.js 1.1 Node.js是什么 Node.js® is a Java...

  • Node.js学习

    主线:Node.js是什么 --> Node.js的组成 --> Node.js的特点 --> Helloworl...

  • 使用AngularJS搭建前台框架

    Node.js部署: 下载安装包:从Node.js官网下载Node.js安装包。 安装Node.js:打开node...

  • Node.js模块

    Node.js 模块和 Node.js 包介绍。 一、Node.js模块 每一个Node.js都是一个Node.j...

  • 小鹅通视频下载mac 小鹅通课程下载教程

    前两天,Node.js官方发布了Node.js 15的正式版本,Node.js 15 将替代 Node.js 14...

  • node学习笔记

    node.js 介绍 node.js初识 node.js 平台是基于 Chrome V8 JavaScript 引...

网友评论

      本文标题:Node.js

      本文链接:https://www.haomeiwen.com/subject/nyzqtftx.html