Node.js
基于Chrome的V8引擎的JavaScript 运行环境
如何使用Node.js
1.在官网下载Node.js https://nodejs.org/en/,然后在电脑中安装
2.在终端中查看Node.js的版本
node -v
3.新建一个js文件 ,例如:创建了一个myNode.js文件
4.在终端运行
// node js文件名字
node myNode.js
Nodejs中的模块
模块化: 解决一个复杂问题,自顶向下逐层把系统划分为若干模块的过程,模块是可组合,分解和更换的单元。
Node.js遵守了 CommonJS模块规范
CommonJS 规定了模块特性和各模块之间如何相互依赖:
- 每个模块内部,module变量代表当前模块
- module变量是一个对象,它的exports属性(即module.exports) 是对外的接口
- 加载某个模块,其实是加载该模块的module.exports属性,require()方法用于加载模块
模块化的优点
- 提高了代码复用性
- 提高了代码可维护性
- 可以实现按需加载
模块作用域
模块内定义的变量、方法等成员,只能在当前模块内被访问这种限制叫做模块作用域,避免了全局污染
模块的分类
1. 内置模块
加载模块通过require(内置模块名字) 省略.js后缀名
fs文件系统模块
1.加载fs模块
const fs = require('fs')
2.使用fs.readFile
读取文件内容
fs.readFile('./01.txt', 'utf8', function(err,data){
// 失败结果
console.log(err)
// 成功结果
console.log(data)
})
3.使用fs.writeFile
写入内容到文件中,会覆盖文件写入前内容
fs.writeFile('./01.txt','这是通过fs写入的文件内容','utf8', function(err){
// 失败结果
console.log(err)
})
path模块
提供了一些工具函数,用于处理文件与目录的路径。
fs.readFile('../01.txt', 'utf8', function(err,data){})
./ 或以 …/ 开头为 相对路径,node命令会动态拼接当前相对路径 ,当我们在文件路径的上一层或其他目录运行时,拼接的路径就不正确。
此时就需要使用绝对路径,在项目中不可能写死一个绝对路径,path模块就提供了解决该问题的相关办法。
1.加载模块
const path = require('path')
__dirname 表示当前文件所处的目录
2.使用path.join
可以把多个路径拼接在一起
// 可在任何目录执行当前js,都能通过文件目录正确找到
fs.readFile(path.join(__dirname,'./01.txt'), 'utf8', function(err,data){})
注意:拼接../
会抵消一个路径
例如 :
path.join('E:\\node\\my\\01.txt','../','./01.txt')
//得到的路径是 E:\node\01.txt
3.使用path.basename
获取文件名
const fpath = '/a/a/b/index.html'
const fullname = path.basename(fpath)
console.log(fullname) // index.html
//只获取名字,不要后缀名
const name = path.basename(fpath,'.html')
console.log(name) //index
3.使用path.extname
获取文件名
const lastpath = path.extname('/a/a/b/index.html')
console.log(path.extname(lastpath)) // .html
http模块
1.导入http模块
2.创建web服务器实例
3.为服务器绑定request事件 监听客户端请求
4.启动服务器
//index.js
//启动当前js文件 就可在浏览器通过http://127.0.0.1:80访问
const http = require('http')
const server = http.createServer()
server.on('request',(req,res)=>{
//访问一次就会打印一次
console.log('有人访问')
})
server.listen(80,() => {
console.log('开启服务 http://127.0.0.1:80')
})
回到调函数(req,res)=>{}
中第一个参数req
为请求对象,第二个res
参数为请求响应对象
可通过req.url
获取请求地址,req.method
获取请求方式
在上面index.js中,访问http://127.0.0.1:80在node终端会打印,但浏览器中是一个空白页面。
可以通过res.end()
向页面返回指定的内容,如果内容包含中文需要设置res.setHeader('Content-Type','text/html; charset=utf-8',)
防止乱码。
//部分代码
server.on('request',(req,res)=>{
const str = `请求的客户端是 ${req.url},method是 ${req.method}`
console.log(str)
let content = '<h4>404 Not found</h4>'
const url = req.url
if(url === '/' || url === '/index.html') {
content = '<h4>首页</h4>'
}else if (url === '/about.html') {
content = '<h4>关于页面</h4>'
}
res.setHeader('Content-Type','text/html; charset=utf-8',)
res.end(content)
})
//在index.js加入这些代码,访问服务器就会就会得到url在服务器返回的对应内容
在index.js中 server.listen(80,() => {console.log('开启服务http://127.0.0.1:80')})
80是端口号,127.0.0.1代表自己的电脑 对应localhost
补充知识点:
1.域名和IP是一一对应关系 存放在域名服务器
2.端口号:一台电脑可以运行多个服务,每个服务对应唯一的端口号
2. 自定义模块
用户创建的每个.js文件都是自定义模块
加载自定义模块使用require(路径加文件名)
3. 第三方模块
第三开发使用需要先下载
npm install 第三方模块名称
加载第三方模块使用require(模块名)
module
module
对象存储了和当前模块有关的信息
module.exports 对象 默认为{}
在自定义模块中,可以使用module.exports
对象,将模块内的成员共享出去,供外界使用
当使用require()
导入时得到的就是module.exports
对象
exports对象
exports
和 module.exports
指向同一个对象
永远以module.exports
指向的对象为准
模块加载机制
- 优先从缓存中加载,模块在第一次加载后会被缓存(意味着多次掉
require()
不会导致模块代码被多次执行) - 内置模块的加载优先级最高
自定模块加载机制
./ 或../
路径标识符开头
如果require自定义模块省略了文件扩展名,按照如下规则:
- 按照确切文件明进行加载
- 补全
.js
扩展名进行加载 - 不全
.json
扩展名进行加载 - 补全
.node
扩展名进行加载 - 加载失败,终端报错
第三方模块加载机制
没有开头会从当前模块的父目录开始,尝试从/node_modules
文件夹中加载第三方模块,没有找到则移动到上一层父目录node_modules
直到文件根目录
目录作为模块(require(模块目录)
)
1.找package.json
文件 main
属性 作为入口
2.则试图加载index.js
文件
npm与包
https://blog.youkuaiyun.com/qq_38367703/article/details/126838942?spm=1001.2014.3001.5501
Express
https://blog.youkuaiyun.com/qq_38367703/article/details/126856387?spm=1001.2014.3001.5501