《Node.js 硬实战》笔记


这是看《Node.js 硬实战》写的第一个 demo

// stream.js
const Writable = require('stream').Writable;
const util = require('util');

module.exports = class MyStream extends Writable {
    constructor(matchText, options) {
        super();
        this.count = 0;
        this.matcher = new RegExp(matchText, 'ig');
    }

    write(chunk, encoding, cb) {
        let matches = chunk.toString().match(this.matcher);
        if (matches) {
            this.count += matches.length;
        }
        if (cb) {
            cb();
        }
    }

    end() {
        this.emit('total', this.count);
    }
}

上面的代码写了什么?

  • require 方法导入了 Node.js 的两个核心模块:stream、util。
  • module.exports 导出 MyStream 类。
    • MyStream 类继承了 Writable 类。
    • 覆盖了父类 Writable 的两个方法 _write()end()
//  index.js
const MyStream = require('./stream');
const http = require('http');

let myStream = new MyStream('node.js');

http.get('http://chenzhongtao.cn', function (res) {
    res.pipe(myStream);
})

myStream.on('total', function (count) {
    console.log('test:', count);
})

那这个呢,写了什么?

  • 同样的用 require 方法导入模块,其中 MyStream 是我自己写的模块。

  • 然后我创建了 MyStream 类的实例,并传入字符串 node.js 初始化了该实例。

  • 调用 httpget() 方法,发送一个 GET 请求,返回结果丢给 myStream

  • 最后给 myStream 注册一个是事件 total,触发该事件会调用 on 方法的第二个参数,这个参数是个回调函数。

  • 代码


11.23


人呐,总是好安逸。

突然想到去年这个时候,我跟阿强,阿兴他们一起做一个项目,我负责移动端,他们负责后端,中间阿强建议用 GitHub 作为协助工具。阿强给了 Git 教程,让我们去看,可我觉得能用 GitHub 客户端,为什么要用命令行去打。我和阿兴都是拒绝的,这样带来的坏处其实是挺多的,虽然同样可以完成想要的效果,但是用 GUI 操作明显慢了很多。

前段时间,我开始学 Git ,突然发现打命令行好爽,从一开始的拒绝,到主动去学,中间隔了一年。我觉得现在最开心的事就是:学新东西,然后用写出来。

这种类似的事有很多很多,就好像我一开始用腾讯云的服务器一样,我用的是 Windows ,因为如果用 Linux ,我不想跟阿强一样要搭两星期,我用 Windows 直接图形界面操作,安一个集成软件不好吗?

所以说,达到同一个需求有很多种方式,可很多人都是倾向于自己熟悉并已知可行的,这就是所谓的喜欢待在舒适区吧。

今年,5 月份不是有什么病毒嘛,然后我就把服务器的系统换了,换成 Ubuntu 。然后一开始肯定不适应,前前后后花了好多时间,不断地踩坑,填坑。

还有就是因为搭博客的原因,接触了 Markdown ,然后现在喜欢上写 md 文件了。

为什么会突然写这个事呢,因为昨天我拿了阿恒的书,看了几篇,里面他写了他的同事拒绝学习怎么给 Google 搜索的时候加通配符,然后怎么怎么的,说他们拒绝新的事物,这样就会少了了解新事物带来的好处。

其实学了新东西后很可能是会改变你的生活,真的是这样的。

但是学新东西,如果没有输出,简单说就是没有运用,那可能所起到的作用就很低,其实我去年就有看过一些 ES6 的语法了,可是我没有去运用它,可能那时候写 jQuery 写多了,不怎么写原生的,也就没运用到。等到最近,又重新拿出来学发现:知识是第二生产力啊!

比如说,把 ES6 的模板字面量用到页面渲染上,代码简洁了不少等等。

最近最自由的事就是,自己搞新玩意玩,完了写个 demo ,再写个 md 文件,往码云上一放。嗯,我又绿了,真好。

越发觉得我就像个没见过世面的孩子,又没什么文化,第一次接触到 Webpack 时,我只会哇哇直叫。但愿今后我会常常发出感叹,卧槽,原来还可以这么玩!或许这就是生活的乐趣吧。

以上。


Node.js 笔记


Node.js 简介

Nodejs 是什么?

Node.js 不是一种独立的语言,也不是一个 JavaScript 框架,更不是浏览器的库。Node.js 是一个让 JavaScript 运行在服务端的开发平台,它让 JavaScript 跟 PHP 、Python 等脚本语言一样可以作为后端语言。

Node.js 能干嘛

Node.js 适合那种高并发的应用场景,比如 即时聊天程序。因为 Node.js 内置了 HTTP 服务器的支持。也就是说不用像 PHP 等其他后端语言一样,还要通过 Apache 服务器等,直接几行代码,在V8引擎上一跑,一个简单的服务器就搭建好了。

异步式 I/O 与事件驱动

这是 Node.js 最大的特性了。传统架构应对高并发的方案是多线程并行。而 Node.js 使用的是单线程模型,它在执行过程中有一个事件队列,当程序执行到耗时长的 I/O 请求时,不会说一直等待,而是执行其他操作,等该 I/O 请求完成后,利用事件循环再次调出来执行。

举个例子

let fs = require('fs')
fs.readFile('./Git.md', 'utf-8', (err, data) => {
        if (err) {
            throw err
        }
        console.log(data)
    }
)
console.log('hhhh')

执行结果是,先看到打印的 hhhh ,然后才是读取文件 Git.md 的内容。这是因为 fs.readFile() 它是异步执行的。

参考资料

  • Node.js 开发指南

File System 笔记


File System

File System 是文件的读写操作。这个模块是由 标准的POSIX 封装形成的。怎么使用,直接导入该模块: require('fs')

大部分方法都有两种,异步执行和同步执行。

读取文件

  • fs.readFile('file'[,'options'],'callback');
  • fs.readFileSync('file'[,'options']);
const fs = require('fs');
fs.readFile('./readme.md', 'utf-8', (err, data) => {
    if (err) {
        throw err;
    }
    console.log(data);
})

console.log(fs.readFileSync('./readme.md', 'utf8'));

上面那段代码是都是读取文件的方法,只是执行方式不一样,前者为异步执行所以有回调函数(callback),后者则为同步执行。


Notification 桌面通知


前几天,我们做了个小项目,然后去答辩。老师说能不能在Web端加一个通知信息的东西,比方说,我上传了新的文件上去,你们就能及时收到通知,知道班里有人上传新的文件了。我就想起facebook的桌面通知,所以就尝试着写起了demo

Notification 是什么?

简单的说就是浏览器上的桌面通知。如下图:

Notification就长这样!