您的位置:首页 > Web前端 > Node.js

学习Node.js

2019-08-13 17:25 363 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/king201811/article/details/99453061

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
  • 总结:
        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性能好,因为只有用户需要的时候才执行的原因

  • 内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: