Node是什么
Node.js是一个基于V8引擎运行环境。
- v8引擎:JS的渲染器
Node.js是一个服务器平台。
Node.js底层使用C++编写的。
Node.js是安装在操作系统上的一个程序,这个程序的工作的时候是跟操作系统在对话。(交互)
Node执行js的方式
在Node.js中,运行js代码的方式有两种
- 直接运行js文件:
node app.js
- 使用
REPL
模式运行js代码- R:Read读取js代码
- E: Execute执行JS代码
- P:Print打印js代码
- L: Loop 循环js代码
NodeJS VS 浏览器
Node和浏览器都是运行js的环境
Node.js | 浏览器 | |
---|---|---|
语法相同 | 支持ECMAScript | 支持ECMAScript |
API不同 | Global、module、buffer、domain等 | BOM、DOM |
老大不同 | Global | window |
交互对象 | 在node.js运行js,是和操作系统对话 | 在浏览器中运行js,,是和浏览器对话 |
module API是什么
module
是一个内置的全局对象。module
用于表示模块。-
模块:模块就是封装在一个js文件中的代码块。(在Node的模块系统中,每一个js文件都是一个模块)
const sum = (a,b) => { return a + b } const minus = (a,b) => { return a - b }
-
module对象
> module
Module {
id: '<repl>',
path: '.',
exports: {},
filename: null,
loaded: false,
children: [],
paths: [
'/Users/zj/Desktop/7/0327/repl/node_modules',
'/Users/zj/Desktop/7/0327/node_modules',
'/Users/zj/Desktop/7/node_modules',
'/Users/zj/Desktop/node_modules',
'/Users/zj/node_modules',
'/Users/node_modules',
'/node_modules',
'/Users/zj/.node_modules',
'/Users/zj/.node_libraries',
'/usr/local/lib/node'
]
}
NodeJS中的module系统分为几种?
模块系统的背景
JS缺点1:没有模块
-
JS缺点2:存在命名冲突(set map 模块)
<head> <script src='./jquery.js'></script> <script scr='./tquery.js'></script> <script scr='./script.js'></script> </head>
CommonJS : 面向服务器 通过
Require()
RequireJS: 基于CommonJS的一个包装。
AMD: Asynchrouns Module D? :面向浏览器
Node.js的模块系统分为两种
- CommonJS: Node.js的默认模块系统。采用第三方的模块系统。
- ECMAScript: 是Node.js的标准模块系统。(向原生语言看齐)
NodeJS中的module分为几种?
- 本地模块:在项目中,由开发者创建的模块。
- 内置模块:由Node.js提供的预设模块。
- 内置模块是全局模块。
- 内置模块是Node.js的核心模块。
- 第三方模块: 在项目中,由其他开发者创建的模块。
NPM是什么
- NPM: Node Package Manager Node软件包管理器
- NPM就是Node.js平台的商店。
CommonJS模块系统
module对象
定义
- module对象表示一个模块。
- 一个JS文件就是一个模块。
- 模块是封装在js文件中代码块,拥有独立的作用域。
- module对象是一个全局对象。
module.prototype.require()
定义
require()
方法用于加载外部模块。
-
require()
是node的一个内置函数。 -
require()
在工作的时候,它用于包裹(读取+执行)模块文件中的代码块。
语法
module.require(id)
require(id) //module是全局对象,可省略
Id: 表示加载的模块的文件名
返回值
返回从模块文件中导出的模块
示例
module.exports
定义
module.exports
用于暴露/导出/分享模块。(暴露作用域)
-
module.exports
是一个对象。 -
Module.exports
用于包裹要导出的模块。
语法
//语法1:导出单个变量(变量名、函数名、类名)
const sum = (a,b) => {
return a + b
}
module.exports = sum //单个变量名
//语法2:导出单个直接量
module.exports = (a,b) => {
return a + b
}
//语法3:导出多个变量
const sum = (a,b) => {
return a + b
}
const minus = (a,b) => {
return a - b
}
module.exports = {
// sum:sum,
// minus: minus
sum,
minus
}
//语法4:导出多个变量
module.exports.sum = (a,b) => {
return a + b
}
module.exports.minus = (a,b) => {
return a - b
}
//语法5:导出多个变量
module.exports = {
sum : (a,b) => {
return a + b
},
minus : (a,b) => {
return a - b
}
}
//语法6:导出多个变量
const obj = {
sum : (a,b) => {
return a + b
},
minus : (a,b) => {
return a - b
}
}
module.exports = obj
APP1.js
const math = module.require('./lib1')
// const {sum,minus} = math
console.log(math.sum(3,3));
console.log(math.minus(3,3));
// console.log(sumFn(3,3))
http 内置模块
http.createServer()
定义:用于创建node服务器
- 创建服务端和客户端通信的方式
- res对象:使用响应对象设置响应头
- 响应头:用于通知浏览器:
- 状态码
- 数据类型是什么
- 数据
- 其他参数
- 响应头:用于通知浏览器:
- req对象:使用请求对象解析请求头
- 请求头:包含了请求的具体信息
- 请求方法:get post put delete
- 请求数据
- 请求的地址
- 浏览器信息
- 等其他信息
语法
http.createServer((req,res)=>{
//1.解析请求
//2.处理响应
})
返回值
示例
res.weiteHead()
定义:用于设置响应头信息
语法
返回值
示例
res.end()
定义:用于通知客户端响应结束。结束的时候可以携带一些数据
语法
返回值
示例
server.listen()
定义:用于设置服务器的监听端口
语法
返回值
示例
Node监听
定义:Node监听就是在不重启服务器的情况下,自动刷新页面
语法:
node --watch 文件地址
示例:
node --watch './app/index.js'
Content-Type
定义:Content-Type
用于指定响应头的数据类型
语法:
{"Content-Type":属性值}
属性值:
- text/plain:普通文本
- text/html:HTML文本
- application/json:JSON文本
全局变量
__dirname
定义:表示当前文件(模块)所在的目录名称
- Dir:文件夹、目录
- name:名字
语法:
console.log(__dirname)//全局直接调用
示例:
console.log(__dirname);
//D:\web前端\2023第二期\三月\0329
绝对路径 VS 相对路径
# 绝对路径
\Users\zj\Desktop\7\0329
\zj\Desktop\7\0329
\Desktop\7\0329
# 相对路径有三种
images/aaa.jpg
./images/aaa.jpg
../images/aaa.jpg
__filename
定义:表示当前文件(模块)的名称
- file:文件
- name:名字
示例:
console.log(__filename);
//D:\web前端\2023第二期\三月\0329\1.giobai.js
内置模块path
定义:node:path
是一个内置模块,它提供了处理路径的API。路径分为:
- 文件路径
- 文件夹路径
使用path
模块,第一步要做什么?
path.basename()
定义:
语法:
path.basename('路径','删除的后缀名')
返回值:返回路径最后一部分
示例:
const path = require('node:path')
console.log(__filename);
console.log(path.basename(__filename));
console.log(path.basename(__filename,'.js'));
console.log(path.basename(__dirname));
输出结果:
D:\web前端\2023第二期\三月\0329\2-path.js
2-path.js
2-path
0]\]]
path.dirname(path)
定义:用于返回当前目录的路径
语法:
path.dirname('path')
返回值:
示例:
const path = require('node:path')
console.log(__dirname)
console.log(path.dirname(__dirname));
输出结果
D:\web前端\2023第二期\三月\0329
D:\web前端\2023第二期\三月
path.extname(path)
定义:返回的是当前文件的扩展名
语法:
返回值:
path.parse()
定义:从路径字符串返回一个对象
语法:
path.parse('路径')
返回值:返回一个表示路径的对象
示例:
const path = require('node:path')
console.log(__filename)
console.log(path.parse(__filename));
输出结果:
D:\web前端\2023第二期\三月\0329\2-path.js
{
root: 'D:\\',
dir: 'D:\\web前端\\2023第二期\\三月\\0329',
base: '2-path.js',
ext: '.js',
name: '2-path'
}
path.format()
定义:从路径对象转路径字符串
语法
path.format(路径对象)
返回值:返回路径字符串
示例
const path = require('node:path')
console.log(__filename)
console.log(path.parse(__filename));
const obj = path.parse(__filename)
console.log(path.format(obj));
输出结果
D:\web前端\2023第二期\三月\0329\2-path.js
{
root: 'D:\\',
dir: 'D:\\web前端\\2023第二期\\三月\\0329',
base: '2-path.js',
ext: '.js',
name: '2-path'
}
D:\web前端\2023第二期\三月\0329\2-path.js
path.join()
定义:用于把路径片段连接为规范路径
语法:
path.join()
path.join('路径片段1','路径片段2',...)
返回值:
示例
const path = require('node:path')
const p1 = path.join('fold1', 'folder2', 'index.html')
console.log(p1);
const p2 = path.join('/fold1', 'folder2', 'index.html')
console.log(p2);
const p3 = path.join('/fold1', '/folder2', 'index.html')
console.log(p3);
const p4 = path.join('/fold1', '//folder2', 'index.html')
console.log(p4);
const p5 = path.join('/fold1', '//folder2', './index.html')
console.log(p5);
const p6 = path.join('/fold1', '//folder2', '../index.html')
console.log(p6);
输出结果
fold1\folder2\index.html
\fold1\folder2\index.html
\fold1\folder2\index.html
\fold1\folder2\index.html
\fold1\folder2\index.html
\fold1\index.html
path.isAbsolute()
定义:用于检测一个路径是否是绝对路径
语法
path.isAbsolute(path)
返回值:返回布尔值;true或false
示例
console.log(path.isAbsolute(__filename));
//true
path.resolve()
定义:用于解析绝对路径
语法:
path.resolve([...paths])//路径片段
返回值:返回绝对路径字符串
示例:
const p1 = path.resolve('fold1', 'folder2', 'index.html')
console.log(p1);
const p2 = path.resolve('/fold1', 'folder2', 'index.html')
console.log(p2);
const p3 = path.resolve('/fold1', '/folder2', 'index.html')
console.log(p3);
const p4 = path.resolve('/fold1', '//folder2', 'index.html')
console.log(p4);
const p5 = path.resolve('/fold1', '//folder2', './index.html')
console.log(p5);
const p6 = path.resolve('/fold1', '//folder2', '../index.html')
console.log(p6);
输出结果
D:\web前端\2023第二期\三月\0329\fold1\folder2\index.html
D:\fold1\folder2\index.html
D:\folder2\index.html
D:\folder2\index.html
D:\folder2\index.html
D:\index.html
FS模块(FS系统)
定义:FS文件系统模块允许操作计算机系统上的文件。
具体操作如下:
- 读取
- 创建
- 修改
- 删除
引入FS文件系统
要使用fs文件系统,请先引入fs模块
语法:基于Promise API(标准)
语法:基于回调函数(默认)
const fs = require('node:fs')
fs.readFile()
定义:用于异步读取文件内容
语法:
fs.readFile('文件路径','callback')
fs.readFile('文件路径','err,data') => {
if(err) console.log(err)
console.log(data)
}
返回值:返回读取成功的内容
数据类型:buffer
示例:
fs.writeFile
定义:用于异步的写入文件数据
语法:
fs.writeFile(file, data[, options], callback)
返回值:
示例:
npm
定义:Node软件包管理工具
- npm的主要内容
- 安装软件包
- 删除软件包
- 分享你自己写的软件包(npmjs.com)
- npm是世界上最大软件包平台
- npm的构成:
- 官网(http://npmjs.com):查询软件包
- CLI(Command Line Interface):命令行交互工具
- 软件注册表:JS软件包的仓库
node_modules
- 用于存储第三方模块的文件
package是什么
- 意思:软件包
- 一个package由一个或多个模块组成
package.json
- 用于描述你的模块文件
- 用于配置你的模块文件
- package.json描述如何使用软件包
- 一个package(软件包)必须包含一个
package.json
文件。
创建方法:
- 手动创建
- 半自动:npm init命令创建
- 自动:npm init - yes命令创建
node_modules
- 用于存储第三方模块的文件
- 打包项目发给别人之前,可删除node_modules文件夹,以减少文件体积
- 注意:package.json 和 package-lock.json不能删
- 可使用
npm install
重新安装模块
module
- 模块就是一个js文件或文件夹
- 所有的模块必须拥有
package.json
文件
第三方模块的使用方法
第一步:创建文件夹
mkdir buhaoqi-package
第二步:创建index.js
cd buhaoqi-package
New-item index.js
第三步:安装upper-case模块
npm install upper-case
第四步:修改index.js内容
const upperCase = require('upper-case').upperCase
function hello(name){
console.log(upperCase(`hello ${name},good good study!`));
}
hello('zhangsan')
module.exports = hello
第五步:运行index.js
node index
输出结果
HELLO ZHANGSAN,GOOD GOOD STUDY!
版本号
npm采用的是Sementic Version Controls系统
语法
X.Y.Z
1.1.3
初始版本号一般默认:0.1.0
正式发布:1.0.0
X : Major Version 主版本号:较大变化
Y: Minor Version 副版本号:增加了一个函数
Z: patch Version Bug版本号:修复bug
待续……