一、定义
node.js是Javascript 的后端运行环境
二、node内置api
1.fs文件系统模块
fs模块是Node.js官方提供的、用来操作文件的模块。它提供了一系列的方法和属性,用来满足用户对文件的操作需求。读取本地的资源。
- fs.readFile() 方法,用来读取指定文件中的内容
- fs.readFileSync() 异步方法,用来异步读取指定文件中的内容,比如响应返回html内容的展示
- fs.writeFile() 方法,用来向指定的文件中写入内容
node内置fs api,如果要在javascript代码中,使用fs模块中操作文件,则需要使用如下的方式先导入它:
const fs=require('fs')
// path - 必选参数,标识文件的路径 [] - 可选参数,表示以什么编码格式来读取文件 callback - 必选参数 通过回调拿到结果
fs.readFile(path[,options],callback)
// 1. 导入 fs 模块,来操作文件
const fs = require('fs')
// 2. 调用 fs.readFile() 方法读取文件
// 参数1:读取文件的存放路径
// 参数2:读取文件时候采用的编码格式,一般默认指定 utf8
// 参数3:回调函数,拿到读取失败和成功的结果 err dataStr
fs.readFile('./files/1.txt', 'utf8', function(err, dataStr) {
// 2.1 打印失败的结果
// 如果读取成功,则 err 的值为 null
// 如果读取失败,则 err 的值为 错误对象,dataStr 的值为 undefined
console.log(err)
console.log('-------')
// 2.2 打印成功的结果
console.log(dataStr)
})
//一般逻辑可以这么写:
fs.readFile('./files/11.txt', 'utf8', function(err, dataStr) {
if (err) {
return console.log('读取文件失败!' + err.message)
}
console.log('读取文件成功!' + dataStr)
})
2.http 模块
http 模块是 Node.js 官方提供的用来创建 web 服务器的模块
const http = require("http")
创建 web 服务器的基本步骤
- 导入 http 模块
- 创建 web 服务器实例
server.on()为服务器实例绑定 request事件,监听客户端的请求- 启动服务器
// 1. 导入 http 模块
const http = require('http')
// 2. 创建 web 服务器实例
const server = http.createServer()
// 3. 为服务器实例绑定 request 事件,监听客户端的请求
server.on('request', function (req, res) {
//用来获取传送的值
request.on('data', (chunk) => {
array.push(chunk) })
//监听request的事件 传送完成
request.on('end', () => {
console.log('Someone visit our web server.')
})
// 调用 res.setHeader() 方法,设置 Content-Type 响应头,解决中文乱码的问题
res.setHeader('Content-Type', 'text/html; charset=utf-8')
// 将内容响应给客户端
res.end(str)
// 4. 启动服务器
server.listen(8080, function () {
console.log('server running at http://127.0.0.1:8080')
})
三、模块加载机制
1.模块化概念
1.提高了代码的复用性
2.提高了代码的可维护性
3.可以实现按需加载
4.避免全局变量污染
2.Node.js 中的模块化规范
Node.js 遵循了 CommonJS 模块化规范,CommonJS 规定了模块的特性和各模块之间如何相互依赖
1.每个模块内部,module 变量代表当前模块
2.module 变量是一个对象,它的 exports 属性(即 module.exports)是对外的接口
3.加载某个模块,其实是加载该模块的 module.exports 属性。require() 方法用于加载模块
3.模块的加载机制
模块在第一次加载后会被缓存,多次调用 require() 模块的代码只会被执行一次。不论是内置模块、用户自定义模块、还是第三方模块,它们都会优先从缓存中加载,从而提高模块的加载效率。
- 内置模块(内置模块是由 Node.js 官方提供的,例如 fs、path、http 等)
- 自定义模块(用户创建的每个 .js 文件,都是自定义模块)
- 第三方模块(由第三方开发出来的模块,使用前需要先下载)
1.内置模块的加载机制
内置模块的加载优先级最高(当第三方模块和内置模块同名时)
2.自定义模块的加载机制
使用 require() 加载自定义模块时,必须指定以 ./ 或 …/ 开头的路径标识符。在加载自定义模块时,如果没有指定 ./ 或 …/ 这样的路径标识符,则 node 会把它当作内置模块或第三方模块进行加载。
在使用 require() 导入自定义模块时,如果省略了文件的扩展名,Node.js 会按顺序分别尝试加载以下的文件
3.第三方模块的加载机制
假设在 ‘C:\Users\itheima\project\node_modules\a.js’ 里调用 require(‘tools’),Node.js 会按以下顺序查找
- C:\Users\itheima\project\node_modules\tools
- C:\Users\itheima\node_modules\tools
- C:\Users\node_modules\tools
- C:\node_modules\tools
- 报错
4.目录作为模块
当把目录作为模块标识符,传递给 require() 进行加载的时候,有三种加载方式
1.在被加载的目录下查找一个叫做 package.json 的文件,并寻找 main 属性值作为 require() 加载的入口
2.如果目录里没有 package.json 文件,或者 main 入口不存在或无法解析,则 Node.js 将会试图加载目录下的 index.js 文件
3.如果以上两步都失败了,则 Node.js 会在终端打印错误消息,报告模块的缺失:Error: Cannot find module ‘xxx’