Node.js基础入门
1. 什么是 Node.js
是基于chrome js运行时建立的平台,基于V8引擎。简单来说Node.js是运行在服务端的JavaScript。
与JS的区别:
- 基于异步 I/O 相关接口
- 基于 node_modules 和 require 的模块依赖
- 提供 C++ 插件API 与底层系统交互
Node.js可以做什么?
- Web 服务端:Web Server、爬虫
- CLI 命令行脚本:webpack
- GUI 客户端软件:VSCode、网易云音乐
- loT, 图像处理, 实时通讯,加密货币…
2. Node.js 基础
2.1 模块
- 内置模块:编译进 Node 中,例如 http fs net process path 等
fs = require('fs')
- 文件模块:原生模块之外的模块,和文件(夹)一一对应
require('./circle.js')
2.2 模块加载
// 加载绝对路径文件
require('/foo/bar/a.js');
// 加载相对路径文件
require('../a.js');
// 加载无后缀的文件
require('../a');
// 加载外部模块
require('pkg-name'); //从当前或上级或上上级查找直到查到底层根目录
2.3 模块类型
- .js
- .json 形成js对象
- .node 二进制文件
- .mjs
- …
2.4 模块路径查找
- 绝对路径
- 相对路径
- 和当前路径处理为绝对路径
- 模块/文件夹
- 原生模块,直接读取缓存
- [$NODE_PATH, ~/.node_modules,
./node_modules, …/node_modules, …] - 解析 package.json,查找 main 属性,没有则使用 index.js
- 如果未找到,则报错
2.5 js 模块解析
-
通过 fs.readFileSync 同步拿到文件内容
-
对内容进行包装(闭包)
(function (exports, require, module, __filename, __dirname) { var circle = require('./circle.js'); console.log('The area is ' + circle.area(4)); });
-
通过 vm.runInThisContext 执行
-
获取 module 对象的值作为模块的返回值
2.6 模块缓存
- 模块加载后会将返回值缓存起来
- 下次加载时直接读取缓存结果,避免文件 I/O 和解析时间
- 导出对象缓存在 Module._cache 对象上
3. NPM
3.1 包管理
- 一个package.json文件应该存在于包顶级目录下
- 二进制文件应该包含在bin目录下
- JavaScript代码应该包含在lib目录下
- 文档应该在doc目录下
- 单元测试应该在test目录下
3.2 包依赖
"dependencies": {
"accepts": "^1.2.2",
"content-disposition": "~0.5.0",
"cookies": "~0.7.0",
"debug": "*",
"delegates": "^1.0.0",
"escape-html": "~1.0.1",
"fresh": "^0.5.2",
"only": "0.0.2",
"parseurl": "^1.3.0",
"statuses": "^1.2.0",
"type-is": "^1.5.5",
"vary": "^1.0.0"
},
3.3 NPM问题
- 速度问题
- 安全问题
- 查看源码看 Star
- https://snyk.io/ 外部的检测服务
- npm audit
4. 基于 Node.js 的 Web 开发
-
Koa:中间件的作用,无规范约束,不利于团队开发,中间件繁多,质量参差不齐,选择困难。
-
ThinkJS:规定了项目结构
├─src
│ ├─bootstrap
│ ├─config
│ │ ├─config.js
│ │ └─adapter.js
│ ├─controller //路由
│ │ ├─index.js
│ ├─logic
│ │ ├─index.js
│ └─model //数据库
├─view //模板文件
│ ├─index_index.html
└─www //静态资源
│ └─static
│ ├─css
│ ├─img
│ └─js
├─development.js
├─production.js
├─package.json
TODO List 项目实战
功能列表
- TODO List 的页面
- API(RESTful 接口规范)
- 获取 TOO 列表
- 增加 TODO
- 删除 TODO
-更新 TODO 状态
RESTful 接口规范
- 每个 API 都对应一种资源或资源集合
- 使用 HTTP Method 来表示对资源的动作
- 使用 HTTP Status Code 来表示资源操作结果
数据校验
- 提供了 Logic 机制转门用来支持数据校验
- 文件和 Action 与 Controller 一一对应
模型的好处
- 简化代码、提高效率
- 不用太懂 SQL 语句也能操作数据库
- 避免手写 SQL 语句的安全风险
5. Node.js 的调试
调试
参考:使用 ndb 调试你的 Node.js 项目
- 日志调试
- 断点调试
- node --inspect
- vscode
- ndb
Node 开发角色转换
- 前端
- 跟浏览器打交道,兼容性问题
- 组件化
- 加载速度、JS 执行性能、渲染性能
- 错误监控
- XSS、CSRF 等安全漏洞
- 服务端
- 数据库、Redis 等周边服务
- 性能、内存泄露、CPU、机器管理
- 服务监控、错误监控、流量监控、报警
- SQL注入、目录遍历等安全漏洞