一、 Nodejs简介
Node是JavaScript语言的服务器运行环境。
Node.js是一个能够在服务器端运行JavaScript的开放源代码、跨平台JavaScript运行环境。
Node.js主要用于编写像Web服务器一样的网络应用
中文官网:http://nodejs.cn/
测试Node.js是否安装成功
安装成功之后,可以在window控制台(windows +R 输入cmd 打开)查看是否安装成功。
输入下面的命令查看node的版本。
node -v
● 学习Node.js是为了解前后端交互流程
● 同时为后面学习前端框架做准备
● 前端有很多业务不能解决,需要使用Node.js处理
Node的特点
- 单线程和事件驱动:Node.js使用单线程来处理客户端的连接,通过事件驱动机制实现非阻塞I/O,使得程序能够并发处理大量用户连接。这使得Node.js在相同硬件条件下可以处理更多的连接和请求。
- 高性能和可伸缩性:由于采用了非阻塞I/O和事件驱动的特性,Node.js具有出色的性能和可伸缩性。
- 底层是C语言编写:Node.js的底层是用C语言编写的,包括Node.js本身和V8引擎。底层代码中的事件队列、回调函数队列等关键组件是用C语言实现的,这使得Node.js可以高效地处理大量的并发请求。
常见的打开命令行
- windows +R 输入cmd
- 任意文件资源管理器中,地址栏输入:cmd
常见的dos命令
- mkdir —> md 创建一个文件夹
- dir:显示当前目录中的文件列表。
- cd:改变当前目录
- del:删除文件。
- copy:复制文件。
- attrib:更改文件属性。
- edit:打开一个文本文件进行编辑。
- .md:创建一个新目录。
- cls 清屏
注意,这些命令可能因不同版本的操作系统而有所不同。
Node运行与顶层对象
在cmd工具中,使用命令
node 文件名
代码示例:
console.log("hello world")
顶层对象
在浏览器 JavaScript 中,通常 window是顶层对象,而 Node.js 中的顶层对象是 global
globalThis
代码示例:
js
console.log(this);//{}
console.log(global);
console.log(globalThis);//顶级对象
全局变量
Node平台内置了,例如:__filename
和 __dirname
等全局变量 setInterval() setTimeout()等方法
//绝对路径
console.log(__dirname);//E:\郑州20230816\day07\code
//__dirname 表示当前执行脚本所在的目录。
console.log(__filename);//E:\郑州20230816\day07\code\1.全局变量.js
//__filename:表示当前正在执行的脚本的文件名。它将输出文件所在位置的绝对路径,且和命令行参数所指定的文件名不一定相同。 如果在模块中,返回的值是模块文件的路径。
模块系统
在Node.js中,一个js文件就称之为一个模块(Module)。
简述优势:
将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来
在Node中,模块分为两类:一类是Node提供的模块,称为核心模块;另一类是用户编写的模块,称为文件模块(自定义模块、第三方模块)。
内置模块/核心模块
//内置模块 NodeJS中自带的模块,可以直接使用
/*
require("模块名")
fs/url/querystring/qs/path/http....
*/
//url模块 处理url
let myUrl="http://192.168.1.1:3000/admin/login?username=jack&pwd=2342#main";
//协议
//主机名
//端口
//路径
//参数
// const url=require("url");
// // console.log(url);
let newUrl=url.parse(myUrl)
console.log(newUrl);
//Url {
//protocol: 'http:',
//slashes: true,
//auth: null,
//host: '192.168.1.1:3000',
//port: '3000',
//hostname: '192.168.1.1',
// hash: '#main',
// search: '?username=jack&pwd=2342',
// query: 'username=jack&pwd=2342',
// pathname: '/admin/logoin',
// path: '/admin/logoin?username=jack&pwd=2342',
// href: 'http://192.168.1.1:3000/admin/logoin?username=jack&pwd=2342#main'
//}
//解构
let { host, port, protocol, query, pathname } = newUrl;
console.log(protocol);//http:
console.log(host);//192.168.1.1:3000
console.log(pathname);///admin/logoin
console.log(query);//username=jack&pwd=2342
console.log(port);//3000
//这个是上面那个parse的替换写法,parse不支持使用,但可以用
let mmUrl = new URL(myUrl)
console.log(mmUrl);
文件模块
文件模块常见的有:自定义模块、第三方模块
自定义模块:
需要一个入口文件,来接收导出的文件
let fn = function () {
console.log('hello world');
}
let fnx = function () {
console.log('running........');
}
let arr = ['hello', 'yes', 'hi'];
let obj = {
no: "1002",
title: "鞋子",
price: 119
}
//批量导出
module.exports = {
fn: fn, fnx, arr, obj
}
ES6的模块化 (ESM)
使用export和import
- 单个导出 : export.名称=值
- 批量导出: export { 值,…}
- 默认导出 : export default {}
let obj={
id:111,
name:"李强",
age:18
}
//1.单个导出
export let age=20;
export let name="狗蛋"
export let addr="门口狗窝"
/默认导出
// export default {
// id: 1,
// msg: 'ok',
// fn: function () {
// console.log('哈哈哈');
// },
// fnx() {
// console.log("hello world");
// }
// }
let a = 10;
let b = 'hello world';
let fn = function () {
console.log('run.........');
}
let arr = [10, 20, 304, 890]
export default {
ax: a,
b: b,
fn: fn,
arr: arr
}
// export default {
// a,b,fn,arr
// }
//注意:一个模块只能有一个默认导出
// export default {
// name:"李四"
// }
// console.log(obj);//不能直接访问其它模块的内容
//导入其它模块的内容
//1.导入单个导出
import { age } from "./person.js";
// import {age} from "./person";//error 需要完整的后缀
//2.导入批量导出的内容
import { m1 as mm, m2 } from "./strudent.js"
//3.
import {fn,fx,obj} from "./emplyee.js";
//4.导入默认导出的模块
import xx from "./man.js"
// console.log(age);
// console.log(obj);//error person.js没有导出obj
// console.log(m1);
// console.log(m2);
// fn()
// fx();
// console.log(obj);
console.log(mm);
// console.log(m1);//已改名,不可以使用
// console.log(xx);
// console.log(xx.id);
// console.log(xx.msg);
// xx.fn()
//入口文件
CommonJS的模块化 (CJS)
使用exports、module.exports 和require
// let name=‘张三’;
// let age=20;
// let addr=“中州大道”;
//单个导出
exports.name = ‘张三’;
exports.age = 20;
exports.addr = “中州大道”;
let arr=[10,100,300];
let arr = [‘hello’, ‘yes’, ‘hi’];
let obj = {
no: “1002”,
title: “鞋子”,
price: 119
}
//批量导出
module.exports = {
arr, obj
}
模块加载机制和Commonjs简述
-
加载核心模块,如:fs、path等,其实在node运行的时候,已经放到内存中了
-
加上对应文件后缀,优先级为:test.js > test.json > test.node
-
搜索路径,如果有指定路径则按照路径去找,如:require(‘./test’) 则在当前目录寻找,如果没有指定路径,则从当前目录下往上去找 node_modules文件夹,然后从文件夹里去遍历寻找对应模块名,如果找不到则到上一层node_modules去找,直到最顶层目录
-
首次会加载比较慢,后面node.js 会将缓存相关信息到内存避免二次查询
新特性
在node的新版本中,支持使用[node:module API] 即可以使用
node:前缀
来标识核心模块。这种方式导入包,它会绕过所需的缓存。
包和npm
在Nodejs中包由由包结构和包描述文件两个部分组成.
包结构:用于组织包中的各种文件,例如:源代码文件、资源文件
包描述文件:描述包的相关信息,例如:package.json、bin、lib等文件
npm
npm是随着Nodejs一起安装的一个包管理工具,它具有以下用途:
允许用户从NPM服务器下载别人编写的第三方包到本地使用。
允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。
npm常见命令
1.包
nodejs中包有两部分组成:包文件和包的描述信息(配置文件、json文件等...)
2.NPM node package manger node包管理器
1)允许通过NPM从NPM市场下载包
2)允许通过npm将自己开发的包上传到NPM市场
3)允许通过npm上传和下载命令
3.安装
4.常见的命令
1)npm init 初始化代码工程(会在根目录下生成一个package.json的文件)
其它用法:
npm init -y
2)npm install 安装 安装命令执行之后,会在项目的根目录下产生有一个node_modules的目录(以后所有下载的包都会安装到该目录)
简化为:npm i
本地安装:将包安装到项目中
安装到项目/生产依赖:
npm install 包名 新版nodejs的写法
npm install 包名 --save 旧版写法
简化为:
npm install 包名 -S npm i 包名 -S
安装到开发依赖
npm install 包名 --save-dev
简化为:
npm install 包名 -D npm i 包名 -D
注意:修饰符可以在前、在后
npm i 包名 -D
npm i -D 包名
全局安装:将包安装到计算机上(默认C盘)
npm i 包名 -g
区别:
生产依赖:包不仅在开发阶段要使用,在生产阶段也要使用
开发依赖:只在开发阶段使用
本地安装和全局安装:
本地安装:适用于绝大多数项目开发包
全局安装:一般用于安装命令类型包
例子:全局安装cnpm
npm install cnpm -g
换源:
npm config set registry https://registry.npmmirror.com
package.json文件详解
{
"name": "node_demo2", 包名
"version": "1.0.0", 版本号
"description": "", 项目描述信息
"main": "index.js", 入口文件
"scripts": { 命令
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [], 关键字
"author": "", 作者
"license": "ISC", 许可协议
"dependencies": { 生产依赖
"cookie-parser": "^1.4.6",
"jquery": "^3.7.0"
},
"devDependencies": { 开发依赖
"express-session": "^1.17.3",
"less": "^4.2.0"
}
}