学习Node.js | 青训营笔记

117 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第10天

今天跟着字节的课程学习了Node.js的基础内容

一、本堂课重点内容:

1.Node.js的应用场景

image-20230131104213486

前端工程化

  • Bundle: webpack, vite, esbuild,parcel
  • Uglify: uglifyjs
  • Transpile: bablejs, typescript
  • 其他语言加入竞争:6esbuild, parcel, prisma
  • 现状:难以替代

Web服务端应用

  • 学习曲线平缓,开发效率较高
  • 运行效率接近常见的编译语言
  • 社区生态丰富及工具链成熟 (npm,V8 inspector)
  • 与前端结合的场景会有优势(SSR)
  • 现状: 竞争激烈,Node.is 有自己独特的优势

Electron跨端桌面应用

  • 商业应用: vscode,slack,discord,zoom
  • 大型公司内的效率工具
  • 现状:大部分场景在选型时,!都值得考虑

2.Node.js运行时结构

image-20230131105433282

V8,libuv

  • V8: JavaScript Runtime,诊断调试工具(inspector)
  • libuv: eventloop (事件循环),syscall (系统调用

特点

异步、单线程、跨平台

JS 单线程

  • 实际: JS 线程 + uv 线程池 + V8 任务线程池 + V8 Inspector 线程
  • 优点: 不用考虑多线程状态同步问题也就不需要锁;同时还能比较高效地利用系统资源;
  • 缺点:阻塞会产生更多负面影响解决办法:多进程或多线程 这

3.编写Http Server

1.安装 Node.js

image-20230131113101387

2.编写 Http Server +Client,收发GET,POST 请求

image-20230131113748991

 //http_server.js
 const http = require('http')
 ​
 const port = 3000
 ​
 const server = http.createServer((req, res) => {
     res.end( ' hello')
 }
                                  
 server.listen(port,() => {
     console.log('server listens on: ${port}')
 })
 //http_server_json.js
 const http = require( 'http')
 ​
 const server = http,createServer((req, res) => {
     const bufs = []
     req.on('data',(buf) => {
         bufs.push(buf)
     })
     req.on('end',() => {
         // bufs
         const buf = Buffer.concat(bufs).toString( 'utf8' )
         try {
             const ret = JSON.parse(buf)
             const msg = ret,msg || 'Hello'
             const responseJson = {
                 msg: `receive: ${msg}`
             }
             res.setHeader{' content-Type', 'application/ison'}
             res.end(JSON.stringify(responseJson))
     }catch (err){
         res.end('invalid json')
     }
     })
 })
 ​
 const port = 3000 
 ​
 server.listen(port, () => {
     console.log('listening on:',port)
 })

4.拓展

1.什么是Node.js

node.js是一个基于Chrome v8引擎的javascript 运行环境。Node.js使用了一个事件驱动、非阻塞式 I/O的模型,使其轻量又高效。(由c++语言编写的)Node.js的包管理器npm,成为世界上最大的开放源代码的生态系统。 简单说:编写高性能网络服务器的javascipt工具包(用于js开发服务端程序) 单线程、异步、事件驱动。

node.js是一个Javascript运行环境(runtime)

Node.js 是一个让 JavaScript 运行在服务端的开发平台,它让 JavaScript 成为与PHP、Python、Perl、Ruby 等服务端语言平起平坐的脚本语言。发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装。

Node.js对一些特殊用例进行优化,提供替代的API,使得V8在非浏览器环境下运行得更好。V8引擎执行Javascript的速度非常快,性能非常好。 。

NPM:全称是Node Package Manager,是随同NodeJS一起安装的包管理和分发工具,它很方便让JavaScript开发者下载、安装、上传以及管理已经安装的包。 它已经成为了非官方的发布Node模块(包)的标准。

nodejs自身提供了基本的模块,但是开发实际应用过程中仅仅依靠这些基本模块则还需要较多的工作。幸运的是,Nodejs库和框架为我们提供了帮助,让我们减少工作量。但是成百上千的库或者框架管理起来又很麻烦,有了NPM,可以很快的找到特定服务要使用的包,进行下载、安装以及管理已经安装的包。

使用NPM,必须安装NodeJS。

安装nodejs ,去官网下载nodejs.org/en/,LTS为长期稳定版,下载这个即可。安装直接双击nodejs.exe,疯狂下一步即可!

2.nodejs的特点

快、耗内存多——-网上一个百万级并发测试,未优化的情况下1M的链接消耗了16G内存

3.nodejs可以做什么

node.js可以解析js代码(没有浏览器安全级别的限制),提供很多系统级别的api,如:文件的读写、进程的管理、网络通信…

4.node环境下js文件的执行

  1. 创建index01.js文件
  2. console.log(“hello nodejs”);
  3. 终端中进入index01.js所在目录,在终端中执行
  4. node index01.js

5.nodejs模块化开发规范(commonjs)

 定义模块
 ajax.js文件
 varobj={
 get:function(){
 },
 post:function(){
 }
 }
 module.exports=obj
 ​
 加载自定义模块
 //自定义文件模块 ‘./a.js’
 varobj=require(‘./ajax’)
 npm安装模块

6.npm常用命令

 npm -v//查看npm安装的版本。
 npm init//会引导你创建一个package.json文件,包括名称、版本、作者等信息。
 npm list//查看当前目录下已安装的node包。
 npm ls//查看当前目录下已安装的node包。
 npm install moduleNames//安装Node模块到本地目录node_modules下。
 npm install -g//将包安装到全局环境中。
 npm install --save(npm i -S)
 //安装的同时,将信息写入package.json中,项目路径中如果有package.json文件时,直接使用npm install方法就可以根据dependencies配置安装所有的依赖包,这样代码提交到git时,就不用提交node_modules这个文件夹了。
 npm install --save-dev(npm i -D)
 //安装的同时,将信息写入package.json中项目路径中如果有package.json文件时,直接使用npm install方法就可以根据devDependencies配置安装所有的依赖包,这样代码提交到git时,就不用提交node_modules这个文件夹了。
 npm uninstall moudleName//卸载node模块。