360前端星day3
什么是Node.js
Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine.
与JavaScript的区别
- 基于异步I/O接口,读写文件、网络请求等
- 提供require这种CommonJs的模块化
- 提供了C++的API可以与底层系统交互
可以干什么?
- Web服务端:Web Server、爬虫
- CLI命令行脚本:webpack
- GUI客户端软件:VSCode、网易云音乐
- IoT,图像处理,实时通讯,加密货币...
Node.js基础
运行
node index.js
读写文件
const fs = require('fs');
fs.readFile('test.txt',(err,data)=>{
console.log(data)
});
console.log('read file content');
// 先read file content 后文件内容
模块
- 内置模块,编译进node中,例如http fs net process path等,直接require
- 文件模块,原生模块之外的模块,和文件一一对应,通过文件夹查找形式
// 定义文件模块circle.js
const pi = Math.PI;
exports.area = function(r){
return pi * r * r;
}
// 在app.js中使用文件模块
var circle = require('./circle.js');
console.log('半径为4的圆的面积是:'+ circle.area(4));
模块加载
//绝对路径
require('/foo/bar/a.js');
//相对路径
require('../a.js');
//加载无后缀的文件
require('../a');
//加载外部模块(依次向上查找)
require('pkg-name');
模块类型
- .js
- .json
- .node(c++写完后编译成二进制文件)
- .mjs(基于module的exports导入导出)
- ...
模块路径查找
- 绝对路径
- 相对路径:和当前路径处理为绝对路径
- 模块/文件夹
- 原生模块,直接读取缓存
[$NODE_PATH,~/.node_modules,./node_modules,../node_modules,...]- 解析
package.json,查找main属性,没有则使用index.js - 如果以上都没找到,报错
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对象的值作为模块的返回值
模块缓存
- 模块加载后会将返回值缓存
- 下次加载时直接读取缓存结果,避免文件I/O和解析时间
- 导出对象缓存在
Module._cache对象上
NPM包管理器(node package manager)
包管理的一些规范
- 一个package.json文件存在于包顶级目录下
- 二进制文件在bin目录下
- js代码在lib目录下
- 文档在doc目录下
- 单元测试在test目录下
package.json
main:node查找的入口文件,没有的话使用默认的index.jsnpm scripts:常用的脚本执行的快捷方式dependencies:依赖家族的五个(dependencies、devDependencies、peerDependencies、bundledDependencies、optionalDependencies)^1.2.2允许中版本和小版本的更新,~0.5.0允许小版本的更新,不接受中版本更新,*接受任意版本的更新,0.0.2只安装这个版本,不更新semver version:a.b.c: a大版本(重构)b中版本(特性的增加)c小版本(bug等)bin:命令名称为key,本地文件名称为value的mapregistry:代理
npm的问题
- 在国内的速度问题
- 安全问题(模块删除...)
npm audit检测模块漏洞- 外部的检测服务
基于Node.js的Web开发
基础web
const http = require('http');
const server = http.createServer((req,res) => {
res.end('Hello World'); //拿到用户请求以后修改响应
});
server.listen(3000);
Koa
const Koa = require('koa');
const app = new Koa();
//response
app.use(ctx =>{
ctx.body = 'Hello koa';
})
app.listen(3000);
- 提供了middleware把逻辑进行拆分,use方法:把fn推到中间件里
- 无规范约束,不利于团队开发,中间件繁多,质量参差不齐,选择困难。(比如逻辑分层、路由处理、数据解析校验、权限校验、session和cookie、数据库和redis、安全...
THINKJS
|--- development.js //开发环境下的入口文件
|--- nginx.conf //nginx 配置文件
|--- package.json
|--- pm2.json //pm2 配置文件
|--- production.js //生产环境下的入口文件
|--- README.md
|--- src
| |--- bootstrap //启动自动执行目录
| | |--- master.js //Master 进程下自动执行
| | |--- worker.js //Worker 进程下自动执行
| |--- config //配置文件目录
| | |--- adapter.js // adapter 配置文件
| | |--- config.js // 默认配置文件
| | |--- config.production.js //生产环境下的默认配置文件,和 config.js 合并
| | |--- extend.js //extend 配置文件
| | |--- middleware.js //middleware 配置文件
| | |--- router.js //自定义路由配置文件
| |--- controller //控制器目录
| | |--- base.js
| | |--- index.js
| |--- logic //logic 目录
| | |--- index.js
| |--- model //模型目录
| | |--- index.js
|--- view //模板目录
| |--- index_index.html
- 接口开发
- 数据校验,提供了
logic机制,文件和action与controller一一对应 controller:用户请求的逻辑处理部分,每个操作是一个action- 数据库操作,封装了
Model类,简化代码,提高效率
API: RESTful 接口规范
- 每个API都对应一种资源或者资源集合
- 使用HTTP Method来表示对资源的动作
- 使用HTTP Status Code来表示资源操作结果
使用thinkjs的 thinkjs controller -r 可以快速创建restful API文件(需要配置路由)
Node.js的调试
- 日志调试(代码中console)
- 断点调试
node --inspec,在chrome://inspect中可以看到项目,启动devtool- vscode的断点调试
- chrome的ndb模块,可以接在任意node命令前面,代码可以实时修改
Node开发角色转换
- 前端
- 跟浏览器打交道,兼容性问题
- 组件化
- 加载速度、JS执行性能、渲染性能
- 错误监控
- XSS、CSRF等安全漏洞
- 服务端
- 数据库、Redis等周边服务
- 性能、内存泄漏、CPU、机器管理
- 服务监控、错误监控、流量监控、报警
- SQL注入、目录遍历等安全漏洞