Node.js 企业级开发

300 阅读4分钟

企业级教程学习笔记

概述

课程内容

  • 静态资源服务器

  • 代码本地构建

  • 单元测试

  • UI 测试

  • headless 爬虫

课程安排

  • Node.js 核心 API

  • 静态资源服务器

  • 项目代码构建

  • 单元测试 & UI 测试

  • headless 爬虫

  • 回顾总结

学习前提

  • 了解 JavaScript、ES6 语法

  • 可以简单的使用命令行工具(cd, ls)

  • 了解最基本的 HTTP 协议

WEB 开发所需要了解的 Node.js

Node.js在 09 年带着很大的争议出现,虽然早期一些公司就进行了相关实践,但直到14年前端社区才普遍开始接受 Node.js,很多流行的 Node.js 工具 应运而生。随着前端工作职责从切页面间接像服务层演进,Node.js 所起到的作用也越来越大, Node.js 从前端工程师的加分项 已变成高级前端开发者的必备技能。

课程大纲

  • Node.js 介绍

  • 调试 & 项目初始化

  • 基础 API

  • 简单的 Web Server

  • 单元测试 & 发布

  • Node.js 爬虫示例

详细内容

Node.js 是什么?

Node.js is a JavaScript runtime built on Chrome's V8

Node.js uses an event-dirven, non-blocking I/O model

  • event-driven(事件驱动)

    • I/O 等异步操作结束后的通知
  • blocking(阻塞 与 非阻塞)

阻塞:I/O 时进程休眠等待 I/O 完成后进行下一步。

非阻塞:I/O 时函数立即返回,进程不等待 I/O 完成。

CPU 密集 VS I/O 密集

  • CPU 密集:压缩、解压、加密、解密

  • I/O 密集:文件操作、网络操作、数据库操作

说明:一般图形操作放在 GPU 中,也称 GPU 密集

为什么前端偏爱 Node.js

  • Node.js 使用的是 JavaScript 语言:前端职责范围变大,统一开发体验。

  • 在处理高并发、I/O 密集场景性能优势明显

WEB 常见场景

  • 静态资源读取

  • 数据库操作

  • 渲染页面

几个概念

  • 进程

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

  • 多进程

    启动多个进程,多个进程可以一块执行多个任务。

  • 线程

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

  • 多线程

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

  • Node.js 的单线程

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

    单线程并不是单进程

高并发应对之道

  • 增加机器数

    流量 -> 负载均衡 -> 不同机器处理

  • 增加每台 CPU 数(多核)

Node.js 常用场景

  • WEB Server

  • 本地代码构建

  • 实用工具开发

环境 & 测试

环境

Node.js 模块化采用 CommonJS 规范,与之前 AMD、CMD 规范不太一样。在浏览器中 JavaScript 由 ECMAScriptBOMDOM 组成,同样 Node.js 也由提供基本操作的语言 ECMAScript 和 提供上下文环境操作的全局对象 global 构成。下面将简述 CommonJS 语法。

CommonJS
每个文件是一个模块,均有自己的作用域。

在模块内部,`module` 代表模块本身。

`module.exports` 属性代表模块对外接口。
  • require 规则

    / 表示绝对路径, ./ 表示相对于当前文件的

    支持 JSJSONNode 扩展名,不写依次尝试

    不写路径则认为是 build-in 模块或者各级 node_modules 内的第三方模块

  • require 特性

    module 被加载的时候执行,加载后缓存(重复 require 仅加载一次)

    一旦出现某个模块被循环加载,就只输出已经执行的部分,还未执行的部分不会输出

    示例:

    // main.js
    const moduleA = require('./moduleA')
    const moduleB = require('./moduleB')
    
    console.log(moduleA.test);
    console.log(moduleB.test);
    
    //moduleA.js
    module.exports.test = 'A'
    const moduleB = require('./moduleB')
    console.log('module A :', moduleB.test);
    module.exports.test = 'AA'
    
    module.exports.test = 'B'
    const moduleA = require('./moduleA')
    console.log('module B :', moduleA.test);
    module.exports.test = 'BB'
    
    // 输出结果
    node main.js
    

image.png

fs 模块的使用

const fs = require('fs')


调试

单元测试 & UI 测试

起步

我们这里新建一个名称为 demo.js 的文件,其中包含加法和乘法函数的文件,同时编写名称为 simple.js 的测试文件

// demo.js
const {add, mul} = require('./demo01')

// # 传统做法

// if(add(2, 3) === 5) {
//     console.log('add(2, 3) === 5 OK')
// } else {
//     console.log('add(2, 3) !== 5 ERROR')
// }

// # 测试方法一
// const assert = require('assert')
// assert.equal(add(2, 3), 3);

// # 测试方法二
// const { should, expect, assert } = require('chai')
// should()
// add(2, 3).should.equal(6)

// # 测试方法三
// const { should, expect, assert } = require('chai')
// expect(add(2, 3)).to.be(5)
// assert.equal(add(2, 3), 5)

chaijs 使用

npm install chai -S

BDD(行为驱动型开发)

TDD(测试驱动型开发)