学习Node.js

1.node.js是什么?
Node.js 是一个基于Chrome V8 引擎的JavaScript运行环境
Node.js使用了一个事件驱动、非阻塞式I/O的模型,使其轻量又高效
Node.js的包管理工具npm,是全球最大的开源库生态系统
node版本常识 :偶数版本为稳定版 (0.6.x ,0.8.x ,0.10.x)
奇数版本为非稳定版(0.7.x ,0.9.x ,0.11.x)

2.内置模块
Url:是node中负责处理url字符串的
url是一个对象
方法:1.parse
url.parse(url字符串)
作用:将url字符串转成url对象
2.format
url.format(url对象)
作用:将url对象转成url字符串
3.resolve
作用:做url替换
stream 流
Stream 是一个抽象接口,Node 中有很多对象实现了这个接口。例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出)。

zlib 压缩

const zlib = require( ‘zlib’ ) // zlib是一个压缩包的内置模块
const fs = require( ‘fs’ ) // fs是文件系统
// const in = fs.createReadStream(文件路径)
// 通过fs文件系统将1.txt中的内容读出来 - 班长水杯中的水倒出来
const inp = fs.createReadStream(’./dist/1.txt’) // 创建可读的流
// 通过fs文件系统将 data 中的内容写进去
const out = fs.createWriteStream(‘1.txt.gz’) //创建可写的流
const gzlib = zlib.createGzlip() // 创建一个空的压缩包

http 简易爬虫

  • 通过后端语言爬取网站中的数据,然后通过特定模块进行数据清洗,最后将数据输出给前端
  • 不是那个网站都能爬取的

反爬虫
我们刚才数据清洗时,用的是 text() 这个获取的是a标签的内容

解决: 给a标签的内容中放一张图片 
  • 爬虫案例:
    - http.get
    - 数据清洗: 第三方插件【 模块 】 cheerio【 不要写es6 】

const http = require( ‘http’ )

const cheerio = require( ‘cheerio’ )

// http://jx.1000phone.net/teacher.php/Class/classDetail/param/rqiWlsefmajGmqJhXXWhl3ZiZGZp

const options = {
hostname: ‘jx.1000phone.net’,
port: 80,
path: ‘/teacher.php/Class/classDetail/param/rqiWlsefmajGmqJhXXWhl3ZiZGZp’,
method: ‘GET’,
headers: {
Accept: ‘text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3’,
‘Accept-Encoding’: ‘gzip, deflate’,
‘Accept-Language’: ‘zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7’,
‘Cache-Control’:’ no-cache’,
Cookie: ‘PHPSESSID=ST-22290-Uo8KnobsTgDO-TrQvhjA4TfoJI4-izm5ejd5j1npj2pjc7i3v4z’,
Host: ‘jx.1000phone.net’,
Pragma: ‘no-cache’,
‘Proxy-Connection’: ‘keep-alive’,
Referer: ‘http://jx.1000phone.net/teacher.php/Class/index’,
‘Upgrade-Insecure-Requests’: 1,
‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36’,
‘Content-Type’: ‘application/x-www-form-urlencoded’,
‘Content-Length’: 0
}
};

const req = http.get( options, (res) => {
const { statusCode } = res; // 获取状态码 1xx - 5xx
const contentType = res.headers[‘content-type’]; // 文件类型 text/json/html/xml

res.setEncoding(‘utf8’); // 字符编码

// 核心 – start
let rawData = ‘’;
res.on(‘data’, (chunk) => { rawData += chunk; }); // 数据拼接
res.on(‘end’, () => { // 数据获取结束
try {

  const $ = cheerio.load( rawData )

  $('td.student a').each( function ( item ) {
    console.log( $( this ).text() )
  })

} catch (e) {
  console.error(e.message);
}

});

// 核心 – end
}).on(‘error’, (e) => {
console.error(Got error: ${e.message});
});

req.end()

3.模块化

  • 模块化
    • 为什么前端要使用模块化?
    • 分析: html中引入多个js文件,使用script标签对
    • Node.js都是js文件,思考: js文件如何引入其他类型文件
    • 答案: 模块化
    • 好处:
      • 复用性高,一次定义,多次使用
  • 前端模块化
    • AMD
      • AMD的实现需要使用 require.js
    • CMD
      • CMD的实现需要使用 sea.js 【 不更新 】
    • Common.js
      • Node.js使用了Common.js规范
        • 内置模块引用
        • 自定义模块引用
        • 第三方模块引用
    • EcmaScript 模块化
      • es5
        • module.export / exports
      • es6
        • export default / export
    • 总结:
        1. AMD 和 CMD 都是通过关键字 define 来定义模块的,通过require来引入模块
        1. es6模块化 【 前端里程碑 】
        • export default 默认导出一个 , import xx from xxx
        • export 批量导出,导出多个, import { xxx } from xxx

-AMD 和 CMD的区别:
最明显的区别就是在模块定义时对依赖的处理不同

1、AMD推崇依赖前置,在定义模块的时候就要声明其依赖的模块
2、CMD推崇就近依赖,只有在用到某个模块的时候再去require
这种区别各有优劣,只是语法上的差距,而且requireJS和SeaJS都支持对方的写法

AMD和CMD最大的区别是对依赖模块的执行时机处理不同,注意不是加载的时机或者方式不同。
同样都是异步加载模块,AMD在加载模块完成后就会执行改模块,所有模块都加载执行完后会进入require的回调函数,执行主逻辑,这样的效果就是依赖模块的执行顺序和书写顺序不一定一致,看网络速度,哪个先下载下来,哪个先执行,但是主逻辑一定在所有依赖加载完成后才执行

CMD加载完某个依赖模块后并不执行,只是下载而已,在所有依赖模块加载完成后进入主逻辑,遇到require语句的时候才执行对应的模块,这样模块的执行顺序和书写顺序是完全一致的

这也是很多人说AMD用户体验好,因为没有延迟,依赖模块提前执行了,CMD性能好,因为只有用户需要的时候才执行的原因

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值