node.js基础
node.js基础
- 🍓什么是node.js
- 🍓node.js模块
- 🍒🍒 内置模块
- 🍅🍅🍅fs模块
- 🍅🍅🍅path模块
- 🍅🍅🍅http模块
- 🍒🍒自定义模块
- 🍒🍒第三方模块
- 🍅🍅🍅npm
- 🍅🍅🍅包的分类
- 🍅🍅🍅规范包的组成结构
- 🍅🍅🍅发布自己的包
- 🍅🍅🍅express
- 🍓🍅🍅🍅express`创建`web服务器的步骤
- 🍓🍅🍅🍅挂载路由
- 🍓🍅🍅🍅req获取请求参数
- 🍓🍅🍅🍅app.use()函数
- 🍓🍅🍅🍅路由模块化:
- 🍓🍅🍅🍅中间件
- 🍒🍒🍅🍅🍅定义中间件
- 🍒🍒🍅🍅🍅注册中间件
- 🍒🍒🍅🍅🍅中间件的分类
- 🍒🍒🍅🍅🍅中间件解决跨域问题
- 🍓node.js常用命令
🍓什么是node.js
- 定义:
node.js是一个基于Chrome V8引擎的JavaScript运行环境(后端javaScript运行环境)
浏览器属于JavaScript前端运行环境 node.js官网:https://nodejs.org/en
🍓node.js模块
- 📌引入模块的方式
//引入fs模块(内置模块和三方模块需要写上模块名) const fs = require('fs')//引入自定义模块(自定义模块需要写上js路径) const dataFormat = require('./dataFormat.js') - 📌模块分类
- 🍁内置模块:
fs、path、http - 🍁自定义模块:
用户创建的每一个js文件,引用自定义模块,需要通过相对路径使用 - 🍁第三方模块
- 🍁内置模块:
- 📌模块作用域
在模块中定义的全局变量var,作用域只在模块自己内部,可以解决全局变量被污染的问题 - 📌向外暴露模块作用域的成员:
每一个.js自定义模块中都有一个module对象,module对象中的成员exports对象用来对外暴露模块作用域中的成员
🍒🍒 内置模块
🍅🍅🍅fs模块
引入fs内置模块
const fs = require('fs')
- 📌
fs模块用于操作文件 - 📌
fs.readFile(path[, options], callback)读取文件- 🍁
path:必选参数,文件路径-字符串 - 🍁
options:可选参数,编码格式 - 🍁
callback:必选参数,文件读取成功的回调函数
形参:- 🌷
err:失败的结果 - 🌷
dataStr:成功的结果
- 🌷
fs.readFile('C:\\Users\\Desktop\\abc.txt', 'utf8', (err, dataStr) => {if(!err) {console.log(dataStr);} else {console.error(err)} }); - 🍁
- 📌
fs.writeFile(path, data[, options], callback)写文件- 🍁
path:必选参数,文件路径-字符串 - 🍁
data: 必选参数,写入内容 - 🍁
options:可选参数,编码格式 - 🍁
callback:必选参数,文件编写成功的回调函数
形参:- 🌷
err:失败的结果
- 🌷
fs.writeFile('C:\\Users\\Desktop\\1.txt', "你好,nodejs", 'utf8', err => {if(err) {console.log(err)} }) - 🍁
- 📌
fs.mkdir(path[, options], callback )创建目录- 🍁
path:必选参数 - 🍁
options:可选参数(对象)- 🌷
recursive:
true:递归创建
false:不会递归创建
- 🌷
- 🍁
callback:必选参数,文件夹创建成功的回调函数
形参:- 🌷
err:失败的结果 - 🌷
path:文件夹路径,返回创建的第一层级的目录
- 🌷
- 🍁
- 📌
fs.rmdir(path[, options], callback )删除目录- 🍁
path:必选参数 - 🍁
options:可选参数(对象)- 🌷
recursive:
true:递归删除
false:不会递归删除
- 🌷
- 🍁callback:必选参数,文件夹删除成功的回调函数
形参:- 🌷
err:失败的结果 - 🌷
path:文件夹路径,返回创建的第一层级的目录
- 🌷
- 🍁
- 📌
fs.unlink(path, callback)删除文件- 🍁
path:必选参数 - 🍁
callback:必选参数,文件删除成功的回调函数
形参:- 🌷
err:失败的结果
- 🌷
- 🍁
🍅🍅🍅path模块
路径问题:nodejs执行js时,js中的相对路径是参照node命令执行所在的目录,而不是参照js文件所在的目录
- 📌使用绝对路径(不推荐)
缺点:
移植性非常差,不利于维护 - 📌
__dirname:代表当前文件所处的目录(不推荐)
缺点:
1. 🍁路径需要通过拼接的形式生成
2. 🍁只能处理当前目录以下的文件,当前目录之前的文件无法处理 - 📌
path模块(推荐)
引入path内置模块
const path = require('path')const pathStr = path.join('/a','/b/c','../','./d','e')
console.log(pathStr) //\a\b\d\econst fpath = '\a\b\v\index.html';
console.log(path.basename(fpath)) //index.html
console.log(path.basename(fpath, '.html')) //index
console.log(path.extname(fpath)) //.html
- 🍁
join(path0,path1,path2...,pathn):拼接多个路径,一个../消除一个前面的路径 - 🍁
basename(path[, ext]):获取文件名称 - 🍁
extname(path):获取文件的扩展名
🍅🍅🍅http模块
引入http模块
const http = require('http')
-
📌
http模块用于创建web服务 -
📌创建
http服务- 🍁引入
http模块 - 🍁创建
web服务器实例 - 🍁为服务器绑定
request事件,监听客户端的请求 - 🍁启动服务器
//1. 引入http模块 const http = require('http') //2. 创建web服务器实例 const server = http.createServer() //3. 为服务器绑定request事件,监听客户端的请求 server.on('request', function(req, res){const url = req.urlconst method = req.methodconsole.log(`Your request url is ${url}, and request method is ${method}`)res.setHeader('Content-Type', 'text/html;charset=utf-8')res.end('你好,nodejs') }) //4. 启动服务器 server.listen('8080', ()=>{console.log('server is runnging at http://127.0.0.1:8080') }) - 🍁引入
-
📌
request事件回调函数- 🍁
req:- 🌷
req.url:获取请求路径 - 🌷
req.method:获取请求方式
- 🌷
- 🍁
res:- 🌷
res.end(str):结束本次请求,并向客户端发送指定内容 - 🌷
res.setHeader(key, val): 设置响应头
- 🌷
- 🍁
🍒🍒自定义模块
node.js中,自定义模块暴露成员通过挂载在module.exports对象上,其中exports对象默认也是内存地址指向module.exports,只要在挂载的时候没有更改module.exports对象的地址或者更改exports对象的地址就不会有问题。
//挂载属性
module.exports.name = '张三'//挂载方法
module.exports.sayHello = () => {console.log('Hello world!')
}//挂载属性
exports.age = 23//注意:该方式修改了module.exports对象内存地址的指向,导致module.exports和exports指向的不是同一个地址,则exports挂载属性不会生效。
module.exports = {code:'0000',message:'成功!'
}//注意:该方式修改了exports对象内存地址的指向,导致module.exports和exports指向的不是同一个地址,则exports挂载属性不会生效。
exports = {title:'爱好',content:'足球'
}
🍒🍒第三方模块
🍅🍅🍅npm
npm用于下载发布管理三方包,我们可以通过npm命令去下载安装一些三方包供我们项目使用
查询包:https://www.npmjs.com/
下载包:https://registry.npmjs.org/node_modules是用于存放三方依赖的文件夹package.json用于记录项目中使用的包,通过执行命令npm i来初始化项目,安装三方包
🍅🍅🍅包的分类
- 📌项目包
- 🍁定义:那些被安装到项目的
node_modules目录中的包,被称为项目包 - 🍁开发依赖包
npm i {packageName} -D
被记录到package.json文件中节点devDependencies下面的包被称为开发依赖包,只在开发期间会使用到 - 🍁核心依赖包
npm i {packageName}
被记录到package.json文件中节点dependencies下面的包被称为核心依赖包,开发期间和项目上线后都会使用到
- 🍁定义:那些被安装到项目的
- 📌全局包
- 🍁安装全局包:
npm i {packageName} -g - 🍁卸载全局包:
npm uninstall {packageName} -g - 🍁全局依赖包会下载到
C:\Users\用户目录\AppData\Roaming\npm\node_modules - 🍁注意:
只有工具性质的包,才有全局安装的必要性,因为它们提供了好用的终端命令(一般官方文档里面会告诉你)
- 🍁安装全局包:
🍅🍅🍅规范包的组成结构
- 包必须以单独的目录而存在
- 包的顶级目录下必须包含
package.json文件 package.json必须包含name、version、main这三个属性,分别代表包名、包版本、包的入口
🍅🍅🍅发布自己的包
- 📌在
package.json中编写自己的包信息{"name":"{packageName}", //必须与当前npm仓库中的包名不重名"version":"1.0.0", //版本号"main":"index.js", //包程序入口"description":"包的描述信息","keywords":["","",""...] //检索包的关键字信息"license":"ISC" //开源许可协议 } - 📌编写
README.MD文档,写明使用此包的方式 - 📌注册
npm账号
https://www.npmjs.com/ - 📌在终端输入以下命令,登录
npm账号(在此之前,一定要先把下包的镜像地址切换到npm官方服务器)
npm login - 📌在包的根目录下输入以下命令,即可发布包
npm publish
🍅🍅🍅express
express是基于内置模块http的基础上封装的一套可以方便、快速的创建Web网站服务器或API接口服务器
安装
npm i express
🍓🍅🍅🍅express创建web服务器的步骤
-
📌引入
express模块 -
📌创建
web服务器 -
📌启动
web服务,监听端口const express = require('express')//创建web服务器 const app = express()//启动web服务,监听端口 app.listen('80', ()=>{console.log('express server running at http://127.0.0.1') })
🍓🍅🍅🍅挂载路由
app.get(url, function)
app.post(url, function)
🍓🍅🍅🍅req获取请求参数
- 📌获取
url地址传参:(形如:http://127.0.0.1/user?name=张三&age=23)
req.query.{key} - 📌获取动态地址传参:(形如:
http://127.0.0.1/query/1234)
req.params.{key} - 📌获取请求体数据
req.body(需要配置解析请求体数据的中间件)app.get('/user', function(req, res) {console.log('进入GET /user')//req.query 获取url地址传参(http://127.0.0.1/user?name=张三&age=23)const name = req.query.nameconst age = req.query.age//向客户端响应内容res.send({name, age}) })app.get('/query/:id/:name',(req, res) => {//req.params 获取url地址的动态参数(http://127.0.0.1/query/1234/张三)const id = req.params.idconst name = req.params.nameres.send({id, name}) })//express.urlencoded({extended:false}) //express.json() app.post('/add/user', express.json(), (req, res) => {console.log(req.body)res.send(req.body) })
🍓🍅🍅🍅app.use()函数
- 📌挂载静态资源:
app.use(express.static({static_path}))
app.use('{地址前缀}', express.static({static_path})) - 📌路由模块化:
app.use(模块路由)
app.use({地址前缀}, 模块路由) - 📌注册中间件
app.use({中间件名称})
🍓🍅🍅🍅路由模块化:
问题: 通过app去挂载路由,会导致js文件臃肿,难以维护,路由模块化可以解决这个问题
-
📌引入
express模块 -
📌创建路由对象
-
📌挂载路由
-
📌暴露路由对象
-
📌
app.use()注册路由对象//引入express模块 const express = require('express')//创建路由对象 const router = express.Router()router.get('/user/list', (req, res) => {res.send([{name:'张三',age:23},{name:'李四', age:24}]) })//暴露路由(注意:这里不能使用exports = router) module.exports = router//注册路由 const xxx = require('./xxx.js') app.use(xxx)
🍓🍅🍅🍅中间件
🍒🍒🍅🍅🍅定义中间件
//普通中间件
const mw = function(req, res, next){//放行next()
}//错误中间件
const mw = function(err, req, res, next){//放行next()
}
🍒🍒🍅🍅🍅注册中间件
- 📌全局中间件注册:
app.use(mw) - 📌单个局部中间件注册:
app.get(url, 中间件, 函数) - 📌多个局部中间件注册:
app.get(url, [中间件1, 中间件2, ..., 中间件n], 函数)//定义全局中间件 const mw = function(req, res, next){console.log('最简单的中间件函数')//流转给后面的路由next() } //注册全局中间件 app.use(mw)//定义中间件 const mv2 = function(req, res, next){console.log('最简单的中间件函数2')next() }//挂载路由,监听客户端post请求,请求地址是/user //将中间件mv2注册为局部中间件 app.post('/user', mv2, function(req, res){console.log('进入POST /user')throw new Error('服务器内部发生了错误!')res.send({code:'000000', msg:'请求失败!'}) })//定义中间件 const mv3 = function(req, res, next){console.log('最简单的中间件函数3')next() }//挂载路由,监听客户端动态地址传参 //注册多个局部中间件 app.get('/query/:id/:name', [mv2, mv3],(req, res) => {//req.params 获取url地址的动态参数(http://127.0.0.1/query/1234)const id = req.params.idconst name = req.params.nameres.send({id, name}) }) - 📌多个中间件之间,共享同一份
req和res,我们可以在上游的中间件中为req和res挂载某些属性和方法为下游中间件使用
调用顺序:(与中间件注册的顺序有关)
客户端请求 => 中间件1 => 中间件2 => 中间件3 => … => 中间件n => 响应客户端
🍒🍒🍅🍅🍅中间件的分类
- 📌应用级别的中间件
通过app.use()、app.get()、app.post()绑定的 - 📌路由级别的中间件
通过router.use()、router.get()、router.post()绑定的 - 📌错误级别的中间件(注意:错误的中间件一定要放在最后定义)
app.use(function(err, req, res, next))//挂载路由,监听客户端post请求,请求地址是/user //将中间件mv2注册为局部中间件 app.post('/user', mv2, function(req, res){ console.log('进入POST /user') throw new Error('服务器内部发生了错误!') res.send({code:'000000', msg:'请求失败!'}) })//定义全局错误中间件 app.use(function(err, req, res, next){ console.log('发生了错误:' + err.message) res.send(err.message) }) - 📌
Express内置的中间件
配置解析application/json格式请求体数据的内置中间件
app.use(express.json())
配置解析application/x-www-form-urlencoded格式请求体数据的内置中间件
app.use(express.urlencoded({extended:false}))
由于express解析请求体数据中间件在4.16.0之后才支持,在此版本之前使用body-parser中间件解析请求体- 🍁下载
body-parser
npm install body-parser - 🍁引入
body-parser模块 - 🍁调用
app.use()注册中间件
app.use(parser.json())
app.use(parser.urlencoded({extended:false}))
- 🍁下载
🍒🍒🍅🍅🍅中间件解决跨域问题
- 📌安装
cors中间件
npm i cors - 📌注册
cors中间件为全局中间件
app.use(cors()) - 📌
cors相关的响应头- 🍁
Access-Control-Allow-Origin:*|具体的http地址- 🌷
*:允许任何请求访问 - 🌷具体的http地址:如
http://app.cn.nb:81,表示只允许这个ip开头的客户端可以访问
- 🌷
- 🍁
Access-Control-Allow-Headers- 🌷允许客户端发送的请求头
- 🌷默认情况下,
cors仅支持客户端发送如下的请求头:
Accept、Accept-Language、Content-Language、DPR、Downlink、Save-Data、Viewport-Width、Width、Content-Type(值仅限于text/plain、multipart/form-data、application/x-www-form-urlencoded)
- 🍁
Access-Control-Allow-Methods
默认情况下,cors仅支持客户端发起GET、PUT、HEAD请求
- 🍁
🍓node.js常用命令
# 1. node版本查看
node -v# 2. 运行javaScript脚本
node xxx.js# 3. npm版本查看
npm -v# 4. 安装下载包(默认下载最新版本)
npm install {packageName}
npm i {packageName}# 5. 安装下载包(指定下载版本)
npm install {packageName}@{version}
npm i {packageName}@{version}# 6. 初始化项目,根据package.json安装三方包
npm install
npm i# 7. 卸载包
npm uninstall {packageName}# 8. 创建package.json
npm init -y# 9. 安装下载开发环境的包
npm i {packageName} -D
npm i {packageName} --save-dev# 10. 检查当前下包镜像源
npm config get registry# 11. 切换下包镜像源
npm config set registry=https://registry.npm.taobao.org/# 12. 使用nrm快速切换镜像源
## 12.1. 下载安装nrm,将nrm安装成全局可用的工具
npm i nrm -g
## 12.2. 查看所有可用的镜像源
nrm ls
## 12.3. 将下载的镜像源切换为taobao镜像
nrm use taobao# 13. 安装全局包
npm i {packageName} -g# 14. 卸载全局包
npm uninstall {packageName} -g# 15. 登录npm账号
npm login# 16. 发布包(包根目录下执行)
npm publish# 17. md文件转html
## 17.1 下载安装i5ting_toc,将i5ting_toc安装成全局可用的工具
npm i i5ting_toc -g
## 17.2 md文件转html
i5ting_toc -f xxx.md -o
相关文章:
node.js基础
node.js基础 🍓什么是node.js🍓node.js模块🍒🍒 内置模块🍅🍅🍅fs模块🍅🍅🍅path模块🍅🍅🍅http模块 🍒&#…...
fastapi实现websocket在线聊天
最近要实现一个在线聊天功能,基于fastapi的websocket实现了这个功能。下面介绍一下遇到的技术问题 1.问题难点 在线上环境部署时,一般是多进程的方式进行部署启动fastapi服务,而每个启动的进程都有自己的独立存储空间。导致存储的连接对象分…...
LLM推理部署(六):TogetherAI推出世界上LLM最快推理引擎,性能超过vLLM和TGI三倍
LLM能有多快?答案在于LLM推理的最新突破。 TogetherAI声称,他们在CUDA上构建了世界上最快的LLM推理引擎,该引擎运行在NVIDIA Tensor Core GPU上。Together推理引擎可以支持100多个开源大模型,比如Llama-2,并在Llama-2–…...
Unity | 渡鸦避难所-2 | 搭建场景并添加碰撞器
1 规范项目结构 上期中在导入一系列的商店资源包后,Assets 目录已经变的混乱不堪 开发过程中,随着资源不断更新,遵循一定的项目结构和设计规范是非常必要的。这可以增加项目的可读性、维护性、扩展性以及提高团队协作效率 这里先做下简单的…...
展望2024年供应链安全
2023年是开展供应链安全,尤其是开源治理如火如荼的一年,开源治理是供应链安全最重要的一个方面,所以我们从开源治理谈起。我们先回顾一下2023的开源治理情况。我们从信通院《2023年中国企业开源治理全景观察》发布的信息。信通院调研了来自七…...
React 列表页实现
一、介绍 列表页是常用的功能,从后端获取列表数据,刷新到页面上。开发列表页需要考虑以下技术要点:1.如何翻页;2.如何进行内容搜索;3.何时进行页面刷新。 二、使用教程 1.user-service 根据用户id获取用户列表,返回…...
【程序人生】还记得当初自己为什么选择计算机?
✏️ 初识计算机: 还记得人生中第一次接触计算机编程是在高中,第一门编程语言是Python(很可惜由于条件限制的原因,当时没能坚持学下去......现在想来有点后悔,没能坚持,唉......)。但是…...
9-tornado-Template优化方法、个人信息案例、tornado中ORM的使用(peewee的使用、peewee_async)、WTForms的使用
在很多情况下,前端模板中在很多页面有都重复的内容可以使用,比如页头、页尾、甚至中间的内容都有可能重复。这时,为了提高开发效率,我们就可以考虑在共同的部分提取出来, 主要方法有如下: 1. 模板继承 2. U…...
IDEA中.java .class .jar的含义与联系
当使用IntelliJ IDEA这样的集成开发环境进行Java编程时,通常涉及.java源代码文件、.class编译后的字节码文件以及.jar可执行的Java存档文件。 1. .java 文件: 1.这些文件包含了Java源代码,以文本形式编写。它们通常位于项目中的源代码目录中…...
北斗三号短报文森林消防应急通信及天通野外图传综合方案
森林火灾突发性强、破坏性大、危险性高,是全球发生最频繁、处置最困难、危害最严重的自然灾害之一,是生态文明建设成果和森林资源安全的最大威胁,甚至可能引发生态灾难和社会危机。我国总体上是一个缺林少绿、生态脆弱的国家,是一…...
js Array.every()的使用
2023.12.13今天我学习了如何使用Array.every()的使用,这个方法是用于检测数组中所有存在的元素。 比如我们需要判断这个数组里面的全部元素是否都包含张三,可以这样写: let demo [{id: 1, name: 张三}, {id: 2, name: 张三五}, {id: 3, name…...
前端编码中快速填充内容--乱数假文
写前端页面的时候,如果要快速插入图片,可以使用 https://picsum.photos/ 详见笔者这篇博文: 工具网站:随机生成图片的网站-CSDN博客 可是,如果要快速填充文字内容该怎么做呢? 以前,我们都是…...
数据结构二维数组计算题,以行为主?以列为主?
1.假设以行序为主序存储二维数组Aarray[1..100,1..100],设每个数据元素占2个存储单元,基地址为10,则LOC[5,5]( )。 A.808 B.818 C.1010 D&…...
springboot(ssm电影院订票信息管理系统 影院购票系统Java系统
springboot(ssm电影院订票信息管理系统 影院购票系统Java系统 开发语言:Java 框架:ssm/springboot vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.7(或8.0࿰…...
AI 问答-供应链管理-相关概念:SCM、SRM、MDM、DMS、ERP、OBS、CRM、WMS...
一、供应链管理是什么 供应链管理:理解供应链管理_snowli的博客-CSDN博客 二、SCM 供应链管理 SCM全称为“Supply Chain Management”,即供应链管理。 SCM是企业管理范畴中一个非常重要的概念,指的是企业与供应商、生产商、分销商等各方之…...
初学vue3与ts:vue3选项式api获取当前路由地址
vue2的获取方法 this.$route.pathvue3选项式api获取方法 import { useRouter } from vue-router; const router useRouter(); console.log(router) console.log(router.currentRoute.value.path)...
2023最新大模型实验室解决方案
人工智能是引领未来的新兴战略性技术,是驱动新一轮科技革命和产业变革的重要力量。近年来,人工智能相关技术持续演进,产业化和商业化进程不断提速,正在加快与千行百业深度融合。 大模型实验室架构图 大模型实验室建设内容 一、课…...
leetcode707.设计链表
题目描述 你可以选择使用单链表或者双链表,设计并实现自己的链表。 单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。 如果是双向链表,则还需要属性 prev 以指示链表中的…...
【K8s】Kubernetes CRD 介绍(控制器)
文章目录 CRD 概述1. 操作CRD1.1 创建 CRD1.2 操作 CRD 2. 其他笔记2.1 Kubectl 发现机制2.2 校验 CR2.3 简称和属性 3. 架构设计3.1 控制器概览 参考 CRD 概述 CR(Custom Resource)其实就是在 Kubernetes 中定义一个自己的资源类型,是一个具…...
Python 小程序之PDF文档加解密
PDF文档的加密和解密 文章目录 PDF文档的加密和解密前言一、总体构思二、使用到的库三、PDF文档的加密1.用户输入模块2.打开并读取文档数据3.遍历保存数据到新文档4.新文档进行加密5.新文档命名生成路径6.保存新加密的文档 四、PDF文档的解密1.用户输入模块2.前提准备2.文件解密…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
