流–使用node制作压缩包
- 流
-
水流
-
分析
- 两个杯子,一个出,一个入
- 水 持续倒入的
-
总结:
- 杯子
- 入: 可写的流
- 出: 可读的流
- 水
- data Node.js中数据是分片【 chunk 】传输的
- 杯子
-
为了提高性能,减少能耗【 cpu 】
- 管道流 【 连接 I/O 之间的一个管道】,这个管道我们称之为: pipe
-
gulp就是一来了Node.js流的概念,它才能在grunt竞争中胜出
Node.js中数据传输是分片的流
// const in = fs.createReadStream(文件路径)
// 通过fs文件系统将1.txt中的内容读出来 - 班长水杯中的水倒出来
// 通过fs文件系统将 data 中的内容写进去
//const out = fs.createWriteStream('1.txt.gz') 创建可写的流
const zlib = require('zlib') //压缩包模块
const fs = require('fs') //文件系统
const inp = fs.createReadStream('./dist/1.txt')
const out = fs.createWriteStream('./dist/1.txt.gz')
const gzlib = zlib.createGzlip() //创建一个空压缩包
inp.pipe(gzlib).pipe(out) //管道流操作创建压缩文件
- http
- 搭建路由:nodejs官网http模块下搜索http.get
- 把例子粘贴下来
- 状态码含义:
- 200(“OK”)一切正常。实体主体中的文档(若存在的话)是某资源的表示。
- 500(“Bad Request”)
客户端方面的问题。实体主题中的文档(若存在的话)是一个错误消息。希望客户端能够理解此错误消息,并改正问题。 - 500(“Internal Server Error”)
服务期方面的问题。实体主体中的文档(如果存在的话)是一个错误消息。该错误消息通常无济于事,因为客户端无法修复服务器方面的问题。 - 301(“Moved Permanently”)
当客户端触发的动作引起了资源URI的变化时发送此响应代码。另外,当客户端向一个资源的旧URI发送请求时,也发送此响应代码。 - 404(“Not Found”) 和410(“Gone”)
当客户端所请求的URI不对应于任何资源时,发送此响应代码。404用于服务器端不知道客户端要请求哪个资源的情况;410用于服务器端知道客户端所请求的资源曾经存在,但现在已经不存在了的情况。 - 409(“Conflict”)
当客户端试图执行一个”会导致一个或多个资源处于不一致状态“的操作时,发送此响应代码。
http.get('http://nodejs.org/dist/index.json', (res) => {
const { statusCode } = res; // 获取状态码 1xx - 5xx
const contentType = res.headers['content-type']; // 文件类型 text/json/html/xml
let error;
// 错误报出,状态码不是200,报错,不是json类型报错
if (statusCode !== 200) {
error = new Error('Request Failed.\n' +
`Status Code: ${statusCode}`);
} else if (!/^application\/json/.test(contentType)) {
error = new Error('Invalid content-type.\n' +
`Expected application/json but received ${contentType}`);
}
if (error) {
console.error(error.message);
// consume response data to free up memory
res.resume(); // 继续请求
return;
}
res.setEncoding('utf8'); // 字符编码
// 核心 -- start
let rawData = '';
res.on('data', (chunk) => { rawData += chunk; }); // 数据拼接
res.on('end', () => { // 数据获取结束
try {
const parsedData = JSON.parse(rawData);
console.log(parsedData);
} catch (e) {
console.error(e.message);
}
});
// 核心 -- end
}).on('error', (e) => {
console.error(`Got error: ${e.message}`);
});
- 爬虫
- 通过后端语言爬取网站中的数据,然后通过特定模块进行数据清洗,最后将数据输出给前端
- 不是所有网站都能爬取的
- 案例:
- http.get
- 数据清洗: 第三方插件【 模块 】 cheerio【 不要写es6 】
1. 先打开要爬取的网页,查看network,先看Doc数据
- 如https://www.lagou.com/
2. 创建options,设置get的第一个参数
const options = {
hostname: 'www.google.com',
port: 80,
path: '/upload',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(postData)
}
};
3. 把判断json格式的那段代码拿掉(因为是text格式的文件)headers与herder那里容易出错
4. 使用cheerio进行数据清洗,需要先npm安装再引入。能够清洗html结构的字符串。
5. 在try里面清洗数据
6. 使用nodejs实现静态服务器(必会)
/*
后端中服务器类型有两种
1. web服务器【 静态服务器 】
- 举例: wamp里面www目录
- 目的是为了展示页面内容
- 前端: nginx
2. 应用级服务器[ api服务器 ]
- 后端接口
- tomcat
做什么?
- 使用Node.js原生代码实现静态服务器 【 必会 】
*/
const http = require( 'http' )
const port = 3000
const hostname = 'localhost' // 127.0.0.1
http.createServer((request,response) => {
response.writeHead( 200, {
'Content-Type': 'text/html;charset=utf8'
})
response.write('hello Node.js - 千锋教育')
response.end()
}).listen(port,hostname,() => {
// 参数: 端口 域名 监听回调
console.log(`The Server is running at: http://${ hostname }:${ port }`)
})
- Node.js中的模块化 【 必会的 】
- 模块化
- 为什么前端要使用模块化?
- 分析: html中引入多个js文件,使用script标签对
- Node.js都是js文件,思考: js文件如何引入其他类型文件
- 答案: 模块化
- 好处:
- 复用性高,一次定义,多次使用
- 前端模块化
- AMD
- AMD的实现需要使用 require.js
- CMD
- CMD的实现需要使用 sea.js 【 不更新 】
- Common.js
- Node.js使用了Common.js规范
- 内置模块引用
- 自定义模块引用
- 第三方模块引用
- Node.js使用了Common.js规范
- AMD
- 模块化
/*
request第三方模块
作用: 数据请求
使用:
1. 安装
npm/cnpm i/install request --dev-save/-D 开发环境安装
npm/cnpm i/install request --save/-S 生产环境安装
2. 导入
let/var/const 变量名 = require( 模块名称 )
3. 使用
思考: 我在Node.js文件中进行数据请求,存在跨域吗?
分析:
跨域 -》 同源策略 -》 浏览器
结果: 不存在
*/
const request = require( 'request' )
request('https://m.lagou.com/listmore.json',( error,response,body ) => {
// 参数说明: error 错误信息 response 响应结果 body 获取的数据
console.log( body )
})
-
EcmaScript 模块化
-
es5
- module.export / exports
-
es6
- export default / export
-
总结:
-
- AMD 和 CMD 都是通过关键字 define 来定义模块的,通过require来引入模块
-
- es6模块化 【 前端里程碑 】
- export default 默认导出一个 , import xx from xxx
- export 批量导出,导出多个, import { xxx } from xxx
-
面试题
-
Common.js属于Node.js Y/N ? N
-
npm 【 了解 】
- npm包上传npmjs.com这个网站
- 第三方模块都是别人上传的,那么我们想:我们是否也可以上传?
- 当然可以
- 步骤
-
- 创建一个自定义模块 【 文件夹名称一定记住是唯一的,去npmjs.com查是否有 】
-
- 创建package.json文件
-
- 将npm源切换到npmjs上 【 nrm切换 】
- nrm安装: cnpm i nrm -g
- nrm ls 列出当前所有源
- nrm use 源名称 切换到某一个源
-
- 注册npmjs.com账号 【 qq邮箱 】
-
- 激活npmjs.com账号 【 重要/ 犯错高发点 】【 小弹框只出一次 】
-
- 在当前目录下登录npm账号
$ npm adduser
-
- 填写用户名、密码、激活邮箱
-
- 发布
$ npm publish
-
- 自定义模块
打造一个name的模块
打造步骤:- 创建模块 Function / Object / String
- 导出模块
- module.exports = 模块名称 导出一个
- module.exports = {} // 导出多个
- 导入模块
-
var/let/const 变量名 = require( 相对【 网络 】路径 )
-
var/let/const { 变量名 } = require( 相对路径 ) // 引入多个
-
-
前端环境
- 开发环境
- 生产环境
- 二阶段项目
- 测试环境
- 测试代码运行情况
- 测试代码质量
- 测试代码风格
- 测试代码运行情况
- 预上线环境
- beta版本 【 内测 】
- 上线环境
- 放在云服务器/服务器主机中的项目,可以供任何用户使用
-
npm脚本