Node.js初学
服务端层我们更多把 Node 定位为 BFF 层实现,BFF 是 Backend For Frontend 的缩写,翻译成用户体验适配层。
什么是Node.js
官网描述:
Node.js是一个基于Chrome V8引擎的javaScript运行环境Node.js使用了一个事件驱动、非阻塞I/O的模型,使其轻量又高效
在
Node.js里运行javaScript跟在Chrome里运行javaScript有什么不同
Chrome浏览器用的是同样的javaScript引擎和模型- 区别
Node.js没有浏览器API,即documnet、window等- 加了许多
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上应用并推广- 后续也影响到了浏览器端
jsrequire('') 为引入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.js的lib文件夹里面EventEmitter
- 观察者模式
addEventListenerremoveEventListener- 观察者模式 缺点(******)
- 关键在于“不知道被通知者存在”
- 以及“没有人听还能继续下去”
Node.js的异步:非阻塞I/O
I/O即Input / Output,一个系统的输入和输出- 阻塞
I/O和非阻塞I/O的区别就在于系统接受输入再到输出期间,能不能接受其他输入- 理解非阻塞
I/O的要点在于
- 确定一个进行
Input / Output的系统- 思考在
I/O过程中,能不能进行其他I/O
Node.js的异步编程:callback
- 回调函数格式规范
error-first callbackNode-style callback- 第一个参数是
error,后面的参数才是结果
Promise
当前事件循环得不到的结果,但未来的事件循环会给到你结果
是一个状态机
pendingfulfilled / resolvedrejected
.then 和 .catch
resolved状态得Promise会回调后面得第一个.thenrejected状态的Promise会回调后面的第一个.catch- 任何一个
rejected状态且后面没有.catch的Promise,都会造成浏览器 /Node环境的全局错误执行
then和catch会返回一个新的Promise,该Promise最终状态根据then和catch的回调函数的执行结果决定
- 如果回调函数最终是
throw,该Promise是rejected状态- 如果是回调函数最终是
return,该Promise是resolved状态- 但如果回调函数最终
return了一个Promise,该Promise会和回调函数return的Promise状态保持一致
async / await
async function是Promise的语法糖封装- 异步编程的终极方案 - 以同步的方式写异步
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
查看评论