Node.js 中的很多核心模块,都是基于事件来实现的。一些对象通过触发一些事件,使得相应的监听器函数能够被调用执行。所有能够触发事件的对象都是 EventEmitter 类的实例。这些对象可以通过 eventEmitter.on() 方法,将多个函数附加到由这个对象触发的对应命名事件中。当 EventEmitter 对象触发一个事件时,所有附着在那个事件上的函数都会被同步调用。

下面的例子展示了一个简单的 EventEmitter 实例,其中包含一个单独的监听器。eventEmitter.on() 方法用来注册监听器, eventEmitter.emit() 方法用来触发相应的事件。

一般不会直接使用 EventEmitter 作为构造实例的对象,而是会通过继承来自定义一个 EventEmitter,使用方式如下:

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
  console.log('an event occurred!');
});
myEmitter.emit('event');

// 允许对同一事件添加多个监听器函数,
// 也允许通过事件来传递多个参数:
myEmitter.on('event', (a, b, c) => {
    // Something
})
myEmitter.emit('event', 'a', 'b', 'c');

在 TypedArray (ES6) 之前,JavaScript 语言还不能直接从二进制数据流中读取数据。Buffer 模块就被用来作为 Node 的核心 API,负责一些如 TCP 流和文件操作的功能。

在 ES6 的 TypedArray 出现后,Buffer 模块也继承了 Uint8Array,并且让它更适用于 Node.js 的场景。

Buffer 模块是 Node.js 中的全局对象,所以不需要像其它模块那样通过 require('buffer').Buffer 这样来导入 Buffer 模块,直接就能作为已存在的全局对象够使用。

Buffer 的实例与整数数组很相似,但是却有着固定的长度,一旦被创建就不能够改变大小。Buffer 在内存分配的位置上也有所不同,它并不是被 V8 分配在堆上,所以不存在受到 V8 内存限制的问题。它是由 Node 的 C++ 层面上来实现对内存的申请的,然后通过 JavaScript 来对内存进行分配。

在浏览器中,顶级作用域就是全局作用域。也就是说在全局作用域中通过 var something 会定义一个全局可访问的变量,这个变量会附加到全局对象 window 成为它的一个属性。

Node.js 采用 CommonJS 模块加载机制,一个文件对应一个模块。顶级作用域并不是全局作用域,而是模块作用域。在一个模块被加载前,会被 Node.js 使用一个匿名函数包裹:

(function (exports, require, module, __filename, __dirname) {
    // 模块文件的代码
})

因为有了这一个匿名函数的存在,而函数内部具有单独的作用域,因而有了模块作用域一说,这也是 Node.js 不同于浏览器的一点。

在 JavaScript 的开发中,经常会遇到在对象间进行属性复制的情况,比如说下面这个在服务器中对表单进行过滤的例子。

function createUserInfo(req, res, next) {
  const body = req.body;
  const data = {
    name: body.name,
    age: body.age,
    major: body.major,
    email: body.email
  }
  User.save(new User(data)).then(user => {
    res.send('创建用户成功');
  }
}

为了确保用户表单的数据不会对其它字段造成意料之外的影响,比如说恶意修改权限之外的字段之类的情况,一般都会需要对表单进行过滤操作。如果只是少数属性需要这样过滤的话还好,如果有十几个甚至几十个属性需要过滤的话,那么多重复的代码也会把人搞迷糊。那么,有什么好的方法能够减轻这样的负担呢?

本博客实际上已经是我自己开发的第三套博客网站了,在深入学习前端及 JavaScript 技术之后,我就开始了本博客的开发。从博客的设计阶段到基本功能完成上线,共用了四个多月的时间,也算是坎坎坷坷。下面我就来介绍一下本站所用到的一些技术的说明。

概要

本博客采用前后端完全分离的架构,由 Node.js 提供后端 API,供 Web 端及 App 端(尚未开发)进行调用获取数据。前端采用 SPA 的形式,极大提升页面响应及加载速度,使用户得到好的用户体验。

Copyright © 2017 dremy.cn
皖ICP备16015002号