Nodejs 基础

初识Nodejs

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine

Node.js® 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境

在Node.js环境中执行js代码: node XX.js

fs 文件系统模块

读取文件

语法格式::fs.readFile(path[, options], callback)

  • path:文件路径
  • options:配置选项,若是字符串则指定编码格式
    • encoding:编码格式
    • flag:打开方式
  • callback:回调函数
    • err:错误信息
    • data:读取的数据,如果未指定编码格式则返回一个 Buffer

 

1 const fs = require('fs')
2 
3 fs.readFile('./files/1.txt', 'utf-8', function(err, data) => {
4   if(err) {
5     return console.log('failed!' + err.message)
6   }
7   console.log('content:' + data)
8 })

写入文件

语法格式:fs.writeFile(file, data[, options], callback)

  • file:文件路径
  • data:写入内容
  • options:配置选项,包含 encoding, mode, flag;若是字符串则指定编码格式
  • callback:回调函数
1 const fs = require('fs')
2 fs.writeFile('./files/2.txt', 'Hello Nodejs', function (err) {
3   if (err) {
4     return console.log('failed!' + err.message)
5   }
6   console.log('success!')
7 })

路径动态拼接问题 __dirname

  • 在使用 fs 模块操作文件时,如果提供的操作路径是以 ./ 或 ../ 开头的相对路径时,容易出现路径动态拼接错误的问题
  • 原因:代码在运行的时候,会以执行 node 命令时所处的目录,动态拼接出被操作文件的完整路径
  • 解决方案:在使用 fs 模块操作文件时,直接提供完整的路径,从而防止路径动态拼接的问题
  • __dirname 获取文件所处的绝对路径
 fs.readFile(__dirname + '/files/1.txt', 'utf8', function(err, data) {
   ...
 })

path 路径模块

path 模块是 Node.js 官方提供的、用来处理路径的模块。它提供了一系列的方法和属性,用来满足用户对路径的处理需求。

路径拼接 path.join()

 1 const path = require('path')
 2 const fs = require('fs')
 3 
 4 // 注意 ../ 会抵消前面的路径
 5 // ./ 会被忽略
 6 const pathStr = path.join('/a', '/b/c', '../../', './d', 'e')
 7 console.log(pathStr) // \a\d\e
 8 
 9 fs.readFile(path.join(__dirname, './files/1.txt'), 'utf8', function (err, dataStr) {
10   if (err) {
11     return console.log(err.message)
12   }
13   console.log(dataStr)
14 })

获取路径中文件名 path.basename()

使用 path.basename() 方法,可以获取路径中的最后一部分,常通过该方法获取路径中的文件名

 path.basename(path[, ext])
  • path: 文件路径
  • ext: 文件扩展名
 1 const path = require('path')
 2 
 3 // 定义文件的存放路径
 4 const fpath = '/a/b/c/index.html'
 5 
 6 const fullName = path.basename(fpath)
 7 console.log(fullName) // index.html
 8 
 9 const nameWithoutExt = path.basename(fpath, '.html')
10 console.log(nameWithoutExt) // index

获取路径中文件扩展名 path.extname()

 const path = require('path')
 
 const fpath = '/a/b/c/index.html'
 
 const fext = path.extname(fpath)
 console.log(fext) // .html

 

 

http 模块

http 模块是 Node.js 官方提供的、用来创建 web 服务器的模块。

创建基本 Web 服务器

const http = require('http')

// 创建 web 服务器实例
const server = http.createServer()

// 为服务器实例绑定 request 事件,监听客户端的请求
server.on('request', function (req, res) {
  const url = req.url
  const method = req.method
  const str = `Your request url is ${url}, and request method is ${method}`
  console.log(str)

  // 设置 Content-Type 响应头,解决中文乱码的问题
  res.setHeader('Content-Type', 'text/html; charset=utf-8')
  // 向客户端响应内容
  res.end(str)
})

server.listen(8080, function () {
  console.log('server running at http://127.0.0.1:8080')
})

  

实现简陋路由效果

const http = require('http')
const server = http.createServer()

server.on('request', (req, res) => {
  const url = req.url
  // 设置默认的响应内容为 404 Not found
  let content = '<h1>404 Not found!</h1>'
  // 判断用户请求的是否为 / 或 /index.html 首页
  // 判断用户请求的是否为 /about.html 关于页面
  if (url === '/' || url === '/index.html') {
    content = '<h1>首页</h1>'
  } else if (url === '/about.html') {
    content = '<h1>关于页面</h1>'
  }

  res.setHeader('Content-Type', 'text/html; charset=utf-8')
  res.end(content)
})

server.listen(80, () => {
  console.log('server running at http://127.0.0.1')
})

  

模块化

模块化概念

  • 模块化是指解决一个复杂问题时,自顶向下逐层把系统划分为若干模块的过程,模块是可组合、分解和更换的单元。
  • 模块化可提高代码的复用性和可维护性,实现按需加载。
  • 模块化规范是对代码进行模块化拆分和组合时需要遵守的规则,如使用何种语法格式引用模块和向外暴露成员

Node.js 中模块的分类

  • 内置模块
  • 自定义模块
  • 第三方模块

Node.js 中的模块作用域

  • 和函数作用域类似,在自定义模块中定义的变量、方法等成员,只能在当前模块内被访问,这种模块级别的访问限制,叫做模块作用域
  • 防止全局变量污染

模块作用域的成员

  • 自定义模块中都有一个 module 对象,存储了和当前模块有关的信息
  • 在自定义模块中,可以使用 module.exports 对象,将模块内的成员共享出去,供外界使用。导入自定义模块时,得到的就是 module.exports 指向的对象。
  • 默认情况下,exports 和 module.exports 指向同一个对象。最终共享的结果,以 module.exports 指向的对象为准。

 

CommonJS 模块化规范

  • 每个模块内部,module 变量代表当前模块
  • module 变量是一个对象,module.exports 是对外的接口
  • 加载某个模块即加载该模块的 module.exports 属性

模块加载机制

模块第一次加载后会被缓存,即多次调用 require() 不会导致模块的代码被执行多次,提高模块加载效率

内置模块加载 :(内置模块加载优先级最高)

自定义模块加载:(加载自定义模块时,路径要以 ./ 或 ../ 开头,否则会作为内置模块或第三方模块加载)

导入自定义模块时,若省略文件扩展名,则 Node.js 会按顺序尝试加载文件:

  • 按确切的文件名加载
  • 补全 .js 扩展名加载
  • 补全 .json 扩展名加载
  • 补全 .node 扩展名加载
  • 报错

第三方模块加载

  • 若导入第三方模块, Node.js 会从当前模块的父目录开始,尝试从 /node_modules 文件夹中加载第三方模块。
  • 如果没有找到对应的第三方模块,则移动到再上一层父目录中,进行加载,直到文件系统的根目录。

例如,假设在 C:\Users\bruce\project\foo.js 文件里调用了 require('tools'),则 Node.js 会按以下顺序查找:

  • C:\Users\bruce\project\node_modules\tools
  • C:\Users\bruce\node_modules\tools
  • C:\Users\node_modules\tools
  • C:\node_modules\tools

目录作为模块加载

当把目录作为模块标识符进行加载的时候,有三种加载方式:

  • 在被加载的目录下查找 package.json 的文件,并寻找 main 属性,作为 require() 加载的入口
  • 如果没有 package.json 文件,或者 main 入口不存在或无法解析,则 Node.js 将会试图加载目录下的 index.js 文件。
  • 若失败则报错
posted @ 2023-11-13 00:42  wanyujin  阅读(24)  评论(0)    收藏  举报