企业级教程学习笔记
概述
课程内容
-
静态资源服务器
-
代码本地构建
-
单元测试
-
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 由 ECMAScript、BOM、DOM 组成,同样 Node.js 也由提供基本操作的语言 ECMAScript 和 提供上下文环境操作的全局对象 global 构成。下面将简述 CommonJS 语法。
CommonJS
每个文件是一个模块,均有自己的作用域。
在模块内部,`module` 代表模块本身。
`module.exports` 属性代表模块对外接口。
-
require 规则
/表示绝对路径,./表示相对于当前文件的支持
JS、JSON、Node扩展名,不写依次尝试不写路径则认为是
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
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(测试驱动型开发)