zoukankan      html  css  js  c++  java
  • Node学习

    一、Node基础

    1.1 Node的优势?

    • IO优势
      • 对于文件读写,Node采用的是非阻塞IO
      • 传统IO在读写文件的时候CPU来处理,而代码执行也处于等待中,浪费性能
      • 非阻塞IO将读写操作交给CPU,而代码正常执行,减少等待浪费的性能
    • 应用场景
      • 实际应用: webpack/gulp/npm/http-server/json-server
      • 服务器中负责IO读写的中间层服务器(天猫中间层IO服务器)

    1.2 NodeJS特点

    • 其移植了chrome V8 引擎,解析和执行代码机制和浏览器js相同
    • 其沿用了JavaScript语法、另外扩展了自己需要的功能
    • 总结: nodejs 是一个后端语言 , 其具备操作文件的能力, 可以具备服务器的创建和操作能力
      • 其语法是JavaScript语法,代码运行在chrome V8 引擎之上

    1.3 基本使用

    curl --silent --location https://rpm.nodesource.com/setup_8.x | bash - # Node.js v8.x安装命令
    yum -y install npm	#yum一键安装
    node -v #查看node版本,检测是否安装成功
    node ./console.js	#运行程序
    

    二、内置对象介绍

    2.1 分类

    • 全局对象: 何时何处都能访问
    • 核心对象: 向系统索要,引入即可使用
    • 自定义对象: 按路径引入即可

    process(全局对象)

    • 每个系统的环境变量几乎都不一样,可以利用环境变量中的具体某个特定的值来区分不同的机器
    • process.env 是一个对象,我们可以通过其.属性名来获取具体的环境变量值
      • 设置一个特定的环境变量,以达到简单区分不同的机器,从而针对生产/开发环境运行不同的效果
    • process.argv 获取命令行参数

    filename/dirname(全局对象)

    • __filename 获取当前运行文件的目录,绝对路径
    • __dirname 当前运行文件的绝对路径

    2.2 nodejs实现规范

    • CommonJS : 规范JavaScript语言作为后端语言运行的标准
      • 具备什么能力,该怎么做 ,比如: 具备服务器的功能/ 可以操作文件 …
      • 模块应该怎么写: Module :
        • 1:依赖一个模块 require(‘模块名(id)’)
        • 2: 需要被模块依赖 module.exports = 给外部的数据
        • 3:一个文件是一个模块

    2.3 核心对象path

    • 1:const path = require('path');
    • 路径 -> 在处理路径的时候很擅长,但是,其不负责判断路径是否存在文件
    • 拼接并修正路径 path.join(__dirname,'a','b'); 以当前目录/a/b
    • path.resovle('./xxx') 相对转绝对
    • 接收一个合法的路径字符串,转换成一个对象
      • let pathObj = path.parse(mypath);
    • 接收一个路径对象,转换成一个字符串路径
      • let str = path.format(pathObj);
    { root: 'C:\',
      dir: 'C:\Users\dir',
      base: 'documentname.txt',   // 该属性可以用于修改文件名和后缀
      ext: '.txt',
      name: 'documentname' }
    
    
    • 注意:path对象是方便我们操作路径的,对于获取来讲: parse解析成对象,format转换成字符串.join拼接并修正… 对于修改路径对象来讲,可以用base属性更改,不能用name,ext更改

    三、模块

    • 弊端
      • 在js中要涉及到逻辑,还要在html中,为逻辑对象考虑引用顺序
      • 所有对象默认都是全局对象,命名冲突
      • commonjs规范
      • 一个文件就是一个模块
        • 导入用require(’./xxx.js’);
        • 导出用module.exports = xxx;
        • 在每一个模块内声明的变量属于模块内的作用域

    3.1 fs文件模块

    • 文件读写
    • 其他功能
    • 扩展介绍

    3.1.1 fs常用命令

    fs.stat 	#获取文件状态
    fs.readdir 	#读取文件夹数据
    fs.access 	#判断文件或文件夹是否存在
    

    3.2 操作文件对象

    • node中有两种IO的操作

      • 同步IO

        • 一行代码(读文件)不执行完毕…后续代码不能执行
      • 异步IO (建议)

        • 一行代码(读写文件) 不执行完毕(正在读写中) … 后续代码也可以执行
      • 代码体验:

        • 读写文件

        • const fs = require('fs'); //必须这个名称
          //读 fs.readFile(路径,回调函数);
          //写 fs.writeFile(路径,数据,回调函数);
          
        • 总结: 异步的读/写文件 参数1:都是路径,可以相对可以绝对,最后一个参数都是回调函数,回调函数的参数中错误对象优先

    • 同步和异步IO的区别: 同步IO会阻塞后续代码执行,异步IO不会阻塞后续代码执行

    3.3 npm(包管理器)

    • 多个文件,有效的被组织与管理的一个单位
    • 留一个入口

    3.3.1 相关命令:

    npm init # 创建一个包描述文件
    npm install art-template jquery@1.5.1 --save #下载一个包,记录依赖`--save`
    #根据package.json文件中的`dependencies`属性恢复依赖
    npm uninstall jquery@1.5.1 --save #卸载一个包
    npm info jquery #查看包的信息
    npm info jquery versions	#查看包的信息中的某个字段(版本)
    npm docs jquery		#查看包的文档
    npm install -g http-server #安装全局命令行工具
    npm uninstall -g http-server	#卸载全局命令行工具
    npm root -g	#查看全局包的下载路径
    npm config set prefix "./desktop" #修改存储目录
    

    3.3.3 包的区别

    • 凡是我们下载到项目的node_modules中的包,基本都是拿来做require(‘xxx’) 调用其函数和属性
    • 1531575011479
    • 还有一类属于工具性的包(全局命令行工具)
      • 在命令行直接使用的
    • 全局工具 和项目包的区别
      • 全局工具哪个目录都可以通过命令行启动,通过任意目录启动该工具,给相对路径传递任意目录的文件给该工具
      • 项目中的包,部分具备命令行工具的能力,需要命令行环境变量的支持

    3.3.2 nrm是npm的镜像源管理工具

    • 1:全局安装 npm install -g nrm
    • 2:查看当前可选的镜像源 nrm ls
    • 3:切换镜像源 nrm use taobao
    • 选修: 添加自己公司私有源 nrm add name http://www.xxx.xxx/

    3.4 包的加载机制

    • 我们未来可能需要辨识一个包中,入口是否是我们想要的启动程序
    • 逐级向上查找node_module,直到盘符根目录
    • 1:查找node_modules下的包名文件夹中的main属性(常用)
    • 2:不常用:查找node_modules下的包名.js
    • 3:查找node_modules下的包名文件夹中的index.js(常用)
    • 逐级向上,node_modules,要么main属性,要么index.js

    四、http核心模块

    4.1 创建服务器步骤

    • 1:引入http核心对象
    • 2:利用http核心对象的.createServer(callback); 创建服务器对象
    • 3:使用服务器对象.listen(端口,ip地址) 开启服务器
    • 4:callback(req,res) 根据请求处理响应

    4.2 请求报文对象(只读)

    • 请求首行中的url req.url
    • 请求首行中的请求方式 req.method
    • 请求头中的数据req.headers 是一个对象
    • 头信息中,也可以作为与服务器交互的一种途径

    4.3 响应对象

    • 响应首行 res.writeHead(状态码)
    • 写响应头
      • 一次性写回头信息
        • res.writeHead(200,headers)
      • 多次设置头信息
        • res.setHeader(key,value);
    • 写响应体
      • 一次性写回响应体
        • `res.end(‘字符串’||读出文件的二进制数)
      • 多次写回响应体
        • res.write('字符串'||读出文件的二进制数据)

    4.3 获取请求体数据

    • 浏览器: $(’#xx’).on(‘submit’,function(e){ })
    • 服务器: req.on(‘data’,function(d){ d.toString(); })

    4.3.1 querystring核心对象

    • querystring.parse(formStr)
    • username=jack&password=123转换成如下
    • { username: ‘jack’, password: ‘123’ }

    4.4 响应对象

    • 响应首行 res.writeHead(状态码)
    • 写响应头
      • 一次性写回头信息
        • res.writeHead(200,headers)
      • 多次设置头信息
        • res.setHeader(key,value);
    • 写响应体
      • 一次性写回响应体
        • res.end();
      • 多次写回响应体
        • res.write();

    4.5 响应体数据

    • res.write(‘字符串’||读出文件的二进制数据)
    • res.end(‘字符串’||读出文件的二进制数)

    4.6 回写页面

    • art-template http
    • 只能是访问 get请求 url: /hero-list 才返回该数据
    • 其他请求返回ok

    4.8 querystring核心对象

    • querystring.parse(formStr)
    • username=jack&password=123转换成如下
    • { username: ‘jack’, password: ‘123’ }

    4.9 跨域问题

    • 传统开发方式:前端代码及请求数据接口都在同一个服务器上,前端代码测试依赖服务器
    • 前后端分离:
      • 静态服务器: 运行前端代码
      • 后台服务器: 运行数据接口服务器
      • 互不影响,浏览器向其他服务器发送ajax请求,会产生跨域

    4.9.1 jsonp

    • 知识点补充

    • url核心对象

      • const url = require('url');
        url.parse('http://xxx.com?id=1',true); // 第二个参数是将id=1转换成对象
        // output:  { protocal:'http',..省略..query:{id:1}   }
        

    4.9.2 CORS

    • Access-Control-Allow-Origin: 'http://xxx.com'  //允许哪个域在跨域的时候访问,*代表所有
      // 告诉浏览器,跨域时允许有cookie,同时客户端也要设置withCredentials:true + Origin不能是*
      Access-Control-Allow-Credentials: true  
      Access-Control-Allow-Methods: 'GET,POST,PUT,DELETE';   // 默认允许get/post
      Access-Control-Allow-Headers:'xxx';   // 允许你自己加的头来通信
      
    • 浏览器在非简单请求(get/post)||包含自定义头||content-type非键值对的时候,会先请示服务器,来一个OPTIONS请求,如果不满足,拒绝发送ajax请求

    ####4.9.3 代理

    • 下载依赖包便于请求操作 npm i request -S

    nginx代理

    • 操作最好在管理员权限下进行

    • nginx -s [opt] opt:stop, quit, reopen, reload

    • 启动nginx: 命令行进入到解压目录 start nginx

    • 查看nginx启动进程 tasklist /fi "imagename eq nginx.exe"

    • 关闭进程 nginx -s stop

  • 相关阅读:
    servlet(二)
    servlet(一)
    static、final、static final的区别
    java基础知识(一)
    IntelliJ IDEA中Debug的使用技巧
    IDEA从SVN中导入多模块项目
    Java实现MD5加密
    冒泡排序
    ulimit: core file size: cannot modify limit: Operation not permitted
    Linux 禁用摄像头
  • 原文地址:https://www.cnblogs.com/daozhangblog/p/12446392.html
Copyright © 2011-2022 走看看