【青训营】-Node.js基本入门

01.Node.js简介

Node.js是一个基于Chrome V8引擎的JavaScript运行时环境

安装与运行

nodejs.org/zh-cn/downl…

image.png

创建项目

mkdir node
cd node
npm init -y
复制代码

新建 index.js 文件
image.png

该段代码的作用就是输出package.json文件内容。

版本管理

在同一个设备上如何切换Node.js版本
版本管理工具:

  • n:一个npm 全局的开源包,是依赖npm 来全局安装、使用的
  • fnm:快速简单,兼容性支持 .node-version.nvmrc文件
  • nvm:独立的软件包,Node Version Manager

特点

异步I/O,单线程,跨平台

异步I/O

当Node.js执行I/O操作时,会在响应返回并恢复操作,而不是阻塞线程并浪费CPU循环等待。

Node.js执行I/O操作时,会在响应返回并恢复操作,而不是阻塞线程并浪费CPU循环等待

*代码编写顺序与执行顺序无关

const { readFile } = require('fs');

readFile('./package.json', { encoding: 'utf-8' }, (err, data) => {
    if (err) {
        throw err;
    }
    console.log(data);
});
console.log(123456);
复制代码

image.png

单线程

Node.js保持了JavaScript在浏览器中单线程的特点

优点:

  • 不用处处在意状态同步问题,不会发生死锁
  • 没有线程上下文切换带来的性能开销

缺点:

  • 无法利用多核CPU
  • 错误会引起整个应用退出,健壮性不足
  • 大量计算占用导致CPU,无法继续执行

浏览器为例,浏览器是多进程,JS 引擎单线程

Browser 进程:浏览器主进程,只有一个

插件进程:插件使用时才创建

GPU 进程:最多一个用于3D 绘制

渲染进程:页面渲染、JS执行、事件处理

  • GUI 渲染线程+
  • JS 引擎线程+ V8
  • 事件触发线程
  • 定时器触发线程
  • 异步请求

跨平台

兼容Windows和Linux平台,主要得益于在操作系统与Node上层模块系统之间构建了一层平台架构。

image.png

应用场景

Node.js在大部分领域都占用一席之地,尤其是I/O密集型的

  1. Web应用: Express / Koa
  2. 前端构建:Webpack
  3. GUI 客户端软件:VSCode / 网易云音乐
  4. 其他:实时通讯、爬虫、CLI等

02.模块化机制

1.何为模块化?

根据功能或业务将一个大程序拆分成互相依赖的小文件,再用简单的方式拼装起来

2.为什么模块化?无模块化问题

  • 所有script标签必须保证顺序正确,否则会依赖报错
  • 全局变量存在命名冲突,占用内存无法被回收
  • IIFE/namespace会导致代码可读性低等诸多问题

Common.JS规范

Node.js支持CommonJS模块规范,采用同步机制加载模块

image.png

image.png

加载方式

  1. 加载内置模块 require(‘fs’)
  2. 加载 相对|绝对 路径的文件模块
  • require('/User/.../file.js')
    复制代码
  • require('./file.js')
    复制代码
  1. 加载npm 包 require(‘lodash’)

npm 包查找原则:require(‘lodash’)

image.png

  1. 当前目录 node_modules
  2. 如果没有,父级目录的ndoe_modules
  3. 如果没有,沿着路径向上递归,直到根目录下node_modules
  4. 找到之后会加载package.json.main指向的文件,如果没有package.json则依次查找Index.js、index.json、index.node

require.cache中缓存着加载过的模块,缓存的原因:同步加载

  1. 文件模块查找耗时,如果每次require都需要重新遍历查找,性能会比较查;
  2. 在实际开发中,模块可能包含副作用代码

image.png

其他模块化规范

  • AMD是RequireJS在推广过程中规范化产出,异步加载,推崇依赖前置;
  • CMD是SeaJS在推广过程中规范化产出,异步加载,推崇就近依赖;
  • UMD规范兼容AMD和CommonJS模式
  • ES Modules(ESM),语言层面的模块化规范,与环境无关,可借助babel编译

image.png

image.png

ES Modules(ESM)

ESM是在ES6语言层面提出的一种模块化标准;
ESM中主要有import、export两个关键词,不能console.log打印两个关键字。

image.png

CommonJS VS ESM

  • CommonJS模块输出的是一个值的拷贝;ESM模块输出的是值的引用
  • CommonJS模块是运行时加载;ESM模块是编译时输出(提前加载)

可以混用,但是不建议(import commonjs || imprt 中的require)

image.png

2.6 常用模块介绍

image.png

03.包管理

npm介绍

NPM 是Node.js中的包管理,提供了安装、删除等其它命令来管理包

image.png

image.png

image.png

私有npm

  • 镜像公司内部私有npm
  • 镜像公司设置npm config set registry=bnpm.byted.org

其他

  • 并行安装
  • 扁平管理
  • 锁文件(lockfile)
  • 缓存优化

image.png

  • npm | yarn => lock/扁平/缓存
  • pnpm => monorepo/硬、符号链接/安全性高…

04. 异步编程

Callback

image.png

Promise

Promise是具有四个状态的有限状态机,其中三个核心为Pending(挂起),Fulfilled(完成)、Rejected(拒绝),以及还有一个未开始状态。

image.png 使用Promise,实现读取package.json中main字段对应的文件内容。

image.png Promise解决了回调地狱的问题。

Event

发布订阅模式,Node.js内置events模块,比如HTTP server on(‘request’)事件监听

image.png

05. Web应用开发

HTTP模块

搭建一个最简单的HTTP服务?Node.js内置HTTP模块

const http = require('http');
http.createServer((req,res)=>{
    res.end('Hello World\n');
}).listen(3000,()=>{
    console.log('App running at http://127.0.0.1:3000/')
})
复制代码

Koa介绍

Koa —— 基于Node.js平台的下一代Web开发框架
Koa它不仅仅提供了一个轻量优雅的函数库,使得编写Web应用变得得心应手,不在内核方法中绑定任何中间件

const app = new Koa();
app.use(async ctx => {
    ctx.body = 'Hello World';
});
app.listen(3000,() =>{
    console.log('App start at http://localost:3000 ...');
})
复制代码

image.png

Koa中间件

Koa应用程序是一个包含一组中间件函数的对象,它是按照洋葱模型组织和执行的

image.png

image.png

image.png

基于Koa的前端框架

开源:ThinkJS / Egg …
内部:Turbo、Era、Gulu …
它们做了什么?

  • Koa对象 response / request / context / application 等扩展
  • Koa常见中间库
  • 公司内部服务支持
  • 进程管理
  • 脚手架

06. 开发调试

日志调试-断点调试

image.png

image.png

   npm install ndb -g
复制代码

ndb node bootstrap.js

image.png

07. 线上部署

利用多核CPU

image.png

进程守护

Node.js进程管理工具:

  • 多进程
  • 自动重启
  • 负载均衡
  • 日志查看
  • 性能监控

复杂计算

image.png

总结

image.png

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享