Node.js压缩包操作、爬虫案例、模块化、Common.js规范、npm脚本、.开发环境、测试环境、生产环境(day2)

模块操作(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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值