美文网首页
Node的模块

Node的模块

作者: 泡杯感冒灵 | 来源:发表于2020-07-12 22:51 被阅读0次

JavaScript 中有一个特殊的对象,称为全局对象(Global Object),它及其所有属性都可以在程序的任何地方访问,即全局变量。
在浏览器 JavaScript 中,通常 window 是全局对象, 而 Node.js 中的全局对象是 global,所有全局变量(除了 global 本身以外)都是 global 对象的属性。
在 Node.js 我们可以直接访问到 global 的属性,而不需要在应用中包含它。

全局模块(对象)

特征:何时何地都可以访问,不需要引用

  • process 对象是一个全局变量,它提供当前 Node.js 进程的有关信息,以及控制当前 Node.js 进程。 因为是全局变量,所以无需使用 require()。
  • process.env (环境变量),我们可以通过console.log(),打印一下


    image.png
image.png

常用来判断是生产环境还是开发环境


image.png
  • process.argv 属性返回一个数组,这个数组包含了启动Node.js进程时的命令行参数,打印出来后,发现:
    数组的第一个元素process.argv[0]——返回启动Node.js进程的可执行文件所在的绝对路径
    第二个元素process.argv[1]——为当前执行的JavaScript文件路径


    image.png

    如果我们在后边再打印一些东西,会发现后边的参数是依次排列的


    image.png
    由此我们可以获取这些参数做一些操作
    image.png
image.png
  • 一些常见的全局变量
    __filename 表示当前正在执行的脚本的文件名。它将输出文件所在位置的绝对路径,且和命令行参数所指定的文件名不一定相同。 如果在模块中,返回的值是模块文件的路径。
    image.png
    __dirname 表示当前执行脚本所在的目录。
    image.png

系统模块

特征:需要 require(),但是不需要单独下载,因为在按照node的时候已经内置好了

  • path 模块
    提供了一些实用工具,用于处理文件和目录的路径。 可以使用以下方式访问它:let path = require('path')
// 引入path模块
let path = require('path')

// path模块会有很多方法

// path.dirname() 方法会返回 path 的目录名
console.log(path.dirname('/node/a/b/c/1.jpg'))  //  /node/a/b/c

// path.basename() 方法会返回 path 的最后一部分
console.log(path.basename('/node/a/b/c/1.jpg')) //  1.jpg

// path.extname() 方法会返回 path 的扩展名
console.log(path.extname('/node/a/b/c/1.jpg'))  //  .jpg

//path.join() 方法会将所有给定的 path 片段连接到一起,然后规范化生成的路径。
console.log(path.join('node', 'a', 'b', 'c/d', '1.jpg'))  //node\a\b\c\d\1.jpg

// path.resolve() 方法会将路径或路径片段的序列解析为绝对路径。
// 给定的路径序列会从右到左进行处理,后面的每个 path 会被追加到前面,直到构造出绝对路径
// 如果在处理完所有给定的 path 片段之后还未生成绝对路径,则会使用当前工作目录
// 生成的路径会被规范化,并且尾部的斜杠会被删除(除非路径被解析为根目录)
console.log(path.resolve('/目录1','/目录2','目录3'))   // '/目录2/目录3'  因为 '目录3' 不是绝对路径,但 '/目录2' + '/' + '目录3' 是
console.log(path.resolve('/目录1/目录2', './目录3'))  // '/目录1/目录2/目录3'
console.log(path.resolve('/目录1/目录2', '/目录3/目录4/'))  //  '/目录3/目录4'
console.log(path.resolve('目录1', '目录2/目录3/', '../目录4/文件.gif'))  //'/目录A/目录B/目录1/目录2/目录4/文件.gif'

// 生成当前文件的绝对路径
console.log(path.resolve(__dirname,'index.js'))  //C:\Users\Administrator\Desktop\NodeJs\index.js
  • fs模块,用于文件的读写
    读文件:fs.readFile(path[, options], callback)
    path 参数是文件名或文件描述符。
    options 参数是配置,如果没有指定字符编码,则返回原始的 buffer。如果 options 是字符串,则它指定字符编码:fs.readFile('/etc/passwd', 'utf8', callback);
    callback 回调函数,回调会传入两个参数 (err, data),其中 data 是文件的内容。
let fs = require('fs')

// fs.readFile 读取文件的全部内容
fs.readFile('./a.txt', (err,data) => {
    if (err) throw err;
    console.log(data)
})

// a.txt内容  hello nodejs  
// 打印出来是  <Buffer 68 65 6c 6c 6f 20 6e 6f 64 65 6a 73 20 20 0d 0a>

// 指定字符编码  
fs.readFile('./a.txt','utf8', (err,data) => {
    if (err) throw err;
    console.log(data)
})
// hello nodejs

//不指定字符编码的话,也可以调用toString()方法,结果跟上边是一样的
fs.readFile('./a.txt', (err,data) => {
    if (err) throw err;
    console.log(data.toString())
})


fs.readFile() 函数会缓冲整个文件。 若要最小化内存成本,则尽可能选择流式(使用 fs.createReadStream())。

写文件:fs.writeFile(file, data[, options], callback)

fs.writeFile('b.txt', '哈哈', (err) => {
    if (err) throw err;
})

// 运行之后,生成b.txt文件,内容是  哈哈
// 当我们修改哈哈为呵呵后再执行,b.txt文件内容变为了 呵呵
// 如果我们不想覆盖原本的内容,而是把新内容追加在旧的内容后边,只需要设置一个参数 {flag:"a"}

fs.writeFile('b.txt', '呵呵',{flag:"a"}, (err) => {
    if (err) throw err;
})

  • 上边的读写都是异步的,fs还有同步的读写方法,跟异步的区别就是没有了回调函数
let fs = require('fs')

let data = fs.readFileSync('a.txt')
console.log(data.toString())   //hello nodejs


fs.writeFileSync('b.text','我是同步的写入方法')

自定义模块

每一个nodejs文件就是一个模块,每一个模块就是一个nodejs文件,一般这个模块会返回一个对象,这个对象包含了这个模块的所有操作方法和属性;

自定义模块需要的三元素 exports,module,require

现在我们自己封装一个模块,mod.js

exports.a = 1;
exports.b = 2;
exports.c = d;

function d() {
    console.log(a)
}

let e = 3;

然后我们在index.js里,通过require引入这个模块,并赋值给遍历mod

const mod = require('mod')
console.log(mod.a)
console.log(mod.b)
console.log(mod.c)
console.log(mod.d)
image.png

这个时候是会报错的,说找不到 mod模块,这主要是因为require的引入方式引起的

  1. 如果有路径就去路径里去找
  2. 如果没有路径就到node_modules里去找
  3. 如果都没有找到,再去node的按照目录里去找

所以,我们引入的时候,可以改为 require('./mod.js'),然后就可以正常执行了

image.png
如果我们不修改引入路径,把模块放入node_modules文件夹,有可以引入成功;
module,是批量导出的意思
// mod.js
module.exports = {
    a:1,b:2
}

// index.js
const mod = require('./mod')
console.log(mod.a)   // 1
console.log(mod.b)  // 2

或者导出一个方法

// mod.js
module.exports = function () {
    console.log('aaa')
}

// index.js
const mod = require('./mod')
mod()   // aaa

也可以导出一个 class

// mod.js
module.exports = class {
    constructor(name) {
        this.name = name
    }
    show() {
        console.log(this.name)
    }
}

// index.js
const mod = require('./mod')

let p = new mod('andy')
p.show()  // andy

重点:HTTP模块

  • 大多数nodejs开发者都是冲着开发web server的目的选择了nodejs。正如官网所展示的,借助http模块,可以几行代码就搞定一个超迷你的web server。
  • 在nodejs中,http可以说是最核心的模块
  • 创建1个web服务器
const http = require('http')

http.createServer(() => {
    console.log('我来了')
}).listen(8080)
image.png

createServer的参数事一个回调函数,这个回调函数正常情况下,是有两个参数的,response,request
我们先看下response的用法

const http = require('http')

http.createServer((req,res) => {
    res.write('index')
    res.end()
}).listen(8080)

image.png
const http = require('http')

http.createServer((req,res) => {
    // res.write('index')
    // res.end()

    // 也可以省略 res.write()
    // 直接写 
    res.end('index2')
}).listen(8080)
image.png

再来看request的用法

const http = require('http')

http.createServer((req,res) => {
    console.log(req.url)
}).listen(8080)
image.png
image.png
image.png
image.png

// 我们把之前学的串联起来

const http = require('http')
const fs = require('fs')

http.createServer((req, res) => {
    // req.url 来判断我们要访问的东西

    // fs读取到内容,然后读取到的内容通过respons返还给页面,包括响应码
    fs.readFile(`${req.url}`, (err, data) => {
        if (err) {
            res.writeHead(404)
            res.end('404 not found')
        } else {
            res.writeHead(200)  // 有数据时 可不写 默认是200
            res.end(data)  // 有数据就返回给页面
        }
    })
    
}).listen(8888)

上面的写法,会导致页面上显示404 ,因为readFile的第一个参数我们没有写对路径,应该加./

image.png
const http = require('http')
const fs = require('fs')

http.createServer((req, res) => {
    // req.url 来判断我们要访问的东西

    fs.readFile(`./${req.url}`, (err, data) => {
        if (err) {
            res.writeHead(404)
            res.end('404 not found')
        } else {
            res.writeHead(200)  // 有数据时 可不写 默认是200
            res.end(data)  // 有数据就返回给页面
        }
    })
    
}).listen(8888)
image.png

相关文章

  • 01-Node 基础使用

    Node 基础使用Node 介绍Node 模块化开发模块成员的导出模块成员的导入Node 系统模块 path 和 ...

  • Node.js 核心模块概述

    模块加载原理与加载方式 Node 中的模块:核心模块/原生模块:Node提供的模块。文件模块:用户编写的模块。 N...

  • Koa系列1:Koa中使用mysql模块操作数据库

    安装 node.js的mysql模块 1.模块介绍 mysql模块是node操作MySQL的引擎,可以在node....

  • node模块载入机制

    node内模块以及载入顺序为: 内置模块 文件模块 文件目录模块 node_modules模块 内置模块 http...

  • 2018-08-20第五天课

    内置模块 => 直接使用 Node 提供好的核心模块 Event 事件模块事件模块是整个 Node.js ...

  • 04-文件读写

    fs模块---》操作文件---》io----》node的特长 fs模块是node非常重要的模块,能体现出node的...

  • Node.js基础-模块

    Node中的JavaScript ECMAScript 核心模块 第三方模块 用户自定义模块 核心模块 Node为...

  • 关于node.js一些模块的记录「FS模块」

    目录 Node.JS教程 FS模块 Path模块 FS模块 Path模块 Node.js path 模块提供了一些...

  • node工具模块

    Node.js工具模块node工具模块分为OS,Path, Net, DNS, Domain模块 OS 字节顺序 ...

  • node中的核心模块

    node的模块有很多,但常用的只有几个核心模块,例如fs文件系统模块,path模块,http模块等。node中的J...

网友评论

      本文标题:Node的模块

      本文链接:https://www.haomeiwen.com/subject/fqancktx.html