飞道的博客

Node.js基础

344人阅读  评论(0)

Node.js初学

服务端层我们更多把 Node 定位为 BFF 层实现,BFF 是 Backend For Frontend 的缩写,翻译成用户体验适配层。

https://mp.weixin.qq.com/s/IYddaaw2ps1wR2VT1dZWPg 玉伯

什么是Node.js

官网描述:

  • Node.js是一个基于Chrome V8引擎的javaScript运行环境
  • Node.js使用了一个事件驱动、非阻塞I/O的模型,使其轻量又高效

Node.js 里运行javaScript跟在Chrome里运行javaScript有什么不同

  • Chrome浏览器用的是同样的javaScript引擎和模型
  • 区别
    • Node.js没有浏览器API,即documnetwindow
    • 加了许多Node.js API
  • Chrome里写javaScript控制浏览器
  • Node.js让你用类似的方式,控制整个计算机

Node.js 可以用来做什么

  • 搜索引擎优化 + 首屏速度优化 = 服务端渲染
  • 服务端渲染 + 前后端同构 = Node.js
可扩展性
  • 大型应用需要给使用者自定义模块的能力
  • 使用Node.js做复杂本地应用
    • 可以利用 JS的灵活性提供外部扩展
    • js庞大的开发者基数让他们的灵活性得到利用
  • 在已有网站的情况下需要新开发客户端应用
  • Node.js客户端技术(electron)实现,最大限度复用现有工程

BFF

  • 对用户侧提供HTTP服务
  • 使用后端RPC服务

Node特有Api

console.log(__filename); //当前路径文件名字
console.log(__dirname);  //当前路径文件夹名字
/*process是node的全局变量,不用require直接能访问。*/
console.log(process);	 //进程对象
console.log(process.argv));	 //返回当前进程的所有命令行参数,是个数组,前2个元素是node命令路径和被执行的文件路径
//所以经常用到  process.argv.slice(2),或者命令行参数

<script/>

  • 脚本变多时,需要手动管理加载顺序
  • 不同脚本之间逻辑调用,需要通过全局变量的方式
  • 没有html怎么办?node中就没有 html,所以Node.js需要一个模块管理的机制,CommonJS模块规范

CommonJs模块规范

  • js社区发起,在Node.js上应用并推广
  • 后续也影响到了浏览器端js
  • require('') 为引入 export.test = 'test1' 为导出,导出和引入是同一个引用,在引入的文件中,也是可以将 export中的内容进行修改

实践

我们有个area.js文件看看node的commonjs规范流程

  • 暴露文件给node并会给下面js包装
 var math = require('math');
 exports.area = function (radius) {
 return Math.PI * radius * radius;
 }; 

变为

(function (exports, require, module, __filename, __dirname) { 
 var math = require('math');
 exports.area = function (radius) {
 return Math.PI * radius * radius;
 };
}); 

这样每个模块文件之间都进行了作用域隔离。包装后的代码会通过vm原生模块的runInThisContext方法执行(类似eval,只是有明确的上下文,不污染全局),返回一个具体function对象。
最后将当前模块对象的exports属性、require方法、module(模块自身)以及在文件定位中得到的完整文件路径和文件目录作为参数传递给这个function执行,执行后模块的exports属性返回给了调用方,其他变量方法无法被调用。

npm

  • Node.js的包管理工具
  • 包即大佬写的Node.js模块
  • npm init 生成 package.json

Node.js内置模块

  • 内置模块都在 Node.jslib文件夹里面
  • EventEmitter
    • 观察者模式
      • addEventListener
      • removeEventListener
    • 观察者模式 缺点(******)
      • 关键在于“不知道被通知者存在”
      • 以及“没有人听还能继续下去”

Node.js的异步:非阻塞I/O

  • I/OInput / Output,一个系统的输入和输出
  • 阻塞 I/O和非阻塞I/O的区别就在于系统接受输入再到输出期间,能不能接受其他输入
  • 理解非阻塞I/O的要点在于
    • 确定一个进行Input / Output的系统
    • 思考在I/O过程中,能不能进行其他I/O

Node.js的异步编程:callback

  • 回调函数格式规范
    • error-first callback
    • Node-style callback
  • 第一个参数是error,后面的参数才是结果

Promise

  • 当前事件循环得不到的结果,但未来的事件循环会给到你结果

  • 是一个状态机

    • pending
    • fulfilled / resolved
    • rejected
  • .then 和 .catch

    • resolved状态得Promise会回调后面得第一个.then
    • rejected状态的 Promise会回调后面的第一个.catch
    • 任何一个rejected状态且后面没有.catchPromise,都会造成浏览器 / Node环境的全局错误
  • 执行thencatch会返回一个新的Promise,该Promise最终状态根据thencatch的回调函数的执行结果决定

    • 如果回调函数最终是throw,该Promiserejected状态
    • 如果是回调函数最终是return,该Promiseresolved状态
    • 但如果回调函数最终return了一个Promise,该Promise会和回调函数returnPromise状态保持一致
  • async / await

    • async functionPromise的语法糖封装
    • 异步编程的终极方案 - 以同步的方式写异步
    • await关键字可以“暂停”async function的执行
    • await关键字可以以同步的写法获取Promise的执行结果
    • try-catch可以获取await所得到的错误

HTTP

  • 应用层协议

  • 五层网络协议

    • 1.物理层
    • 2.数据链路曾
    • 3.网络层
    • 4.运输层
    • 5.应用层
  • 一个网页请求,包含俩次HTTP包交换

    • 浏览器向HTTP服务器发送请求HTTP
    • HTTP服务器向浏览器返回HTTP
  • HTTP服务要做什么事情

    • 解析进来的HTTP请求报文
    • 返回对应的HTTP返回报文

windows cmd命令行下创建删除文件和文件夹

  • 创建文件夹 md <folderName> 或 mkdir <folderName>
  • 删除文件夹 rd 或 rmdir命令,rd /s /q [盘符:\][路径\]新目录名
    • 因为rd只能删除空的文件夹,而如果其中有子文件或子文件夹的时候就会停下来,这时我们加上/s就可以直接删除,但是删除过程中会提示你是否确定删除,对于懒癌患者我们有添加了/q,即quiet,安静模式;
  • 创建文件:type nul>*.*;,创建非空文件夹echo [fileContent]>*.*
  • 删除文件 del *.*,如del myfile.txt

转载:https://blog.csdn.net/weixin_43550660/article/details/106821118
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场