模块操作(day2)
压缩包操作
-
流:可以理解为俩个水杯,一个倒水,一个接水,水是持续倒入的;倒入的那个杯子是可写入的流,倒出的那个杯子是可读取的流;水是数据data,Node.js中数据是分片(chunk:何为chunk?)传输的。
-
流是为了提高性能,减少消耗cpu。
- 管道流 (连接 I/O 之间的一个管道):这个管道我们称之为: pipe
- gulp就是一来了Node.js流的概念,它才能在grunt竞争中胜出
- 总结流:Node.js中数据传输是分片的流;
-
压缩包简要操作
const zlib = require( 'zlib' ) // zlib是一个压缩包的内置模块 const fs = require( 'fs' ) // fs是文件系统 const gzlib = zlib.createGzlip() // 创建一个空的压缩包 const inp = fs.createReadStream('./dist/1.txt') // 创建可读的流 const out = fs.createWriteStream('1.txt.gz') //创建可写的流 inp .pipe( gzlib ) .pipe( out )
-
console模块:底层调用的是: process.stdout ;console是全局对象,无需require调用
爬虫案例
-
什么是爬虫:通过后端语言爬取网站中的数据,然后通过特定模块进行数据清洗,最后将数据输出给前端
-
扩展:后端中服务器类型有哪两种?
-
web服务器【 静态服务器 】
- 举例: wamp里面www目录
- 目的是为了展示页面内容
- 前端: nginx
-
应用级服务器[ api服务器 ]
- 后端接口
- tomcat
-
过程:
-
1.首先要引用内置模块 http.get(options[, callback]) 复制介绍的一段
-
2.将http.request(options[, callback])中关于const options={} 拿来使用
-
3.将浏览器终端中的DOC中的request Headers复制整段放在里面,然后都要改成字符串对象格式,如果有横杠(-)要加引号};由于是html格式,所以一开始复制get中的let error检测是否为json类型必定会报错,要删除。
const http = require( 'http' ); const port = 3000; const hostname = 'localhost'; const cheerio = require( 'cheerio' )//数据清洗: 第三方插件【 模块 】 cheerio【 不要写es6 】 const options = { hostname: port: path: method: headers:{将浏览器终端中的DOC中的request Headers复制整段放在里面,然后都要改成字符串对象格式,如果有横杠(-)要加引号} } http.createServer((request,response) => { response.writeHead( 200, { 'Content-Type': 'text/html;charset=utf8' }) const req = http.get(options, (res) => { const { statusCode } = res; const contentType = res.headers['content-type']; res.setEncoding('utf8'); let rawData = ''; res.on('data', (chunk) => { rawData += chunk; }); res.on('end', () => { try {//try...catch 可以测试代码中的错误。try 部分包含需要运行的代码,而 catch 部分包含错误发生时运行的代码。 const $ = cheerio.load( rawData )//定义一个$ $('td.student a').each( function ( item ) {//遍历获取这个元素的值 response.write( `<h3> ${ $( this ).text() } </h3>` ) }) response.end() } catch (e) { console.error(e.message); } }); }).on('error', (e) => { console.error(`Got error: ${e.message}`); }); req.end( );}).listen(port,hostname,() => { // 参数: 端口 域名 监听回调 console.log(`The Server is running at: http://${ hostname }:${ port }`) })
-
4.使用Node.js原生代码实现静态服务器 【 必会 】
const http = require( 'http' ) ;//引入http模块
const port = 3000 ;//定义接口号
const hostname = 'localhost';
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 }`)
})
5.将俩者结合
模块化
为什么前端要使用模块化?比如:当html中引入多个js文件,使用script标签对。Node.js都是js文件,思考: js文件如何引入其他类型文件时,其中一种方法就是模块化。
模块化的好处:复用性高,一次定义,多次使用。
- AMD(异步模块定义:提供异步加载模块机制)
- AMD的实现需要使用 require.js ,推崇依赖前置,提前执行(提前异步进行加载)
- 优点:依赖出现错误可以尽早发现
- 缺点:容易产生资源浪费
- CMD(通用模块:模块按需加载)
- CMD的实现需要使用sea.js,延迟执行,需要时动态加载
- 优点:减少资源的浪费
- 等待时间长,出错时间延后
- Common.js
- 面试题:Common.js属于Node.js Y/N ? N(不属于)
- EcmaScript(es5,es6)
- es5:module.export / exports 模块导出
- es6:export default / export 模块导出
- 总结:
- 1.AMD 和 CMD 都是通过关键字 define 来定义模块的,通过require来引入模块
- 2.es6模块化 是【 前端里程碑 】
- 3.export default 默认导出一个 , import xx from xxx
- 4.批量导出,导出多个, import { xxx } from xxx
Node.js的三种模块(Common.js规范)
1.内置模块
-
格式: var/let/const 变量名 = require(路径) 内置模块路径就是模块名称
-
使用内置模块身上的方法
const fs = require( 'fs' ) fs.readFile('../dist/1.txt','utf8',( error,docs ) => { console.log( docs ) })
2.第三方模块
-
作用: 数据请求
-
使用:1.安装:npm/cnpm i/install request --dev-save/-D(开发环境安装)
npm/cnpm i/install request --save/-S(生产环境安装)
**2.导入:**let/var/const 变量名 = require( 模块名称 )
3.使用
npm i request -D const request = require( 'request' ) request('https://m.lagou.com/listmore.json',( error,response,body ) => { // 参数说明: error 错误信息 response 响应结果 body 获取的数据 console.log( body ) })
思考:我在Node.js文件中进行数据请求,存在跨域吗? 都能请求到数据,那就是不存在。
3.自定义模块
-
创建模块 【 Function / Object / String 可以是函数、对象、字符串
const name = { firstName: 'zhang', lastName: 'san'} const age = { num: 18}
-
导出模块 module.exports = 模块名称 导出一个
module.exports = {} // 导出多个
module.exports = { name,age }
-
导入模块 var/let/const 变量名 = require( 相对【 网络 】路径 )
var/let/const { 变量名 } = require( 相对路径 ) // 引入多个
const { name,age } = require( './age.js' )
4.npm脚本(Node 开发离不开 npm,而脚本功能是 npm 最强大、最常用的功能之一)
-
什么是npm脚本?
npm 允许在package.json(用npm init)文件里面,使用scripts字段定义脚本命令。
优点:1.项目的相关脚本,可以集中在一个地方。
2.外接口。用户不不同项目的脚本命令,只要功能相同,就可以有同样的,对需要知道怎么测试你的项目,只要运行npm run test即可。
3.可以利用 npm 提供的很多辅助功能。
由于 npm 脚本的唯一要求就是可以在 Shell(终端) 执行,因此它不一定是 Node 脚本,任何可执行文件都可以写在里面。npm 脚本的,也遵守 Shell 脚本规则。
"scripts": { "build": "node build.js" }} 运行用 $ npm run build 等同于$ node build.js
-
原理:npm 脚本的原理非常简单。每当执行npm run,就会自动新建一个 Shell(终端),在这个 Shell 里面执行指定的脚本命令。因此,只要是 Shell(一般是 Bash)可以运行的命令,就可以写在 npm 脚本里面。比较特别的是,npm run新建的这个 Shell,会将当前目录的node_modules/.bin子目录加入PATH变量,执行结束后,再将PATH变量恢复原样。这意味着,当前目录的node_modules/.bin子目录里面的所有脚本,都可以直接用脚本名调用,而不必加上路径。比如,当前项目的依赖里面有 Mocha,只要直接写mocha test就可以了。
-
通配符:*表示任意文件名,**表示任意一层子目录。
-
传参:向 npm 脚本传入参数,要使用–标明。
-
执行顺序:如果是并行执行(即同时的平行执行),可以使用&符号。
$ npm run script1.js & npm run script2.js
如果是继发执行(即只有前一个任务成功,才执行下一个任务),可以使用&&符号。
$ npm run script1.js && npm run script2.js
-
默认值:npm run start的默认值是node server.js,前提是项目根目录下有server.js这个脚本;npm run install的默认值是node-gyp rebuild,前提是项目根目录下有对应的文件。
"start": "node server.js", "install": "node-gyp rebuild" 运行时可以直接输入npm start/npm install
-
钩子:npm 脚本有pre和post两个钩子。举例来说,test脚本命令的钩子就是pretest和posttest。
"scripts": { "pretest": "echo pretest", "test": "echo test", "posttest": "echo posttes"}
-
process:进程管理模块;env:所有的进程中的环境变量
process.env.npm_package_name
5.开发环境、测试环境、生产环境
**开发环境:**项目尚在编码阶段语言环境,代码一般在开发环境中不会在生产环境中,生产环境组成:操作系统、Web服务器、PHP、数据库等等
cnpm i 第三方插件 -D(仅在开发环境存在的安装包dev)
**测试环境:**项目完成测试,修改bug阶段
生产环境:项目数据前端后台已经跑通,部署在阿里云之后,有客户使用,访问,就是网站正式运行了。
cnpm i 第三方插件 -S (在生产环境中这个安装包的依赖还在,save)