浅析Node

103 阅读4分钟

一、定义

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 服务器的基本步骤
  1. 导入 http 模块
  2. 创建 web 服务器实例
  3. server.on() 为服务器实例绑定 request事件,监听客户端的请求
  4. 启动服务器
// 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 会按以下顺序查找

  1. C:\Users\itheima\project\node_modules\tools
  2. C:\Users\itheima\node_modules\tools
  3. C:\Users\node_modules\tools
  4. C:\node_modules\tools
  5. 报错
4.目录作为模块

当把目录作为模块标识符,传递给 require() 进行加载的时候,有三种加载方式

1.在被加载的目录下查找一个叫做 package.json 的文件,并寻找 main 属性值作为 require() 加载的入口

2.如果目录里没有 package.json 文件,或者 main 入口不存在或无法解析,则 Node.js 将会试图加载目录下的 index.js 文件

3.如果以上两步都失败了,则 Node.js 会在终端打印错误消息,报告模块的缺失:Error: Cannot find module ‘xxx’