Day26:NODE模块化

NODE

概念

简单的说 Node.js 就是运行在服务端的 JavaScript。

Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台。

Node.js 是一个事件驱动 I/O 服务端 JavaScript 环境,基于 Google 的 V8 引擎,V8 引擎执行 Javascript 的速度非常快,性能非常好。

作用

  1. 提供了js一个运行环境(保证代码能够正常运行所必须的环境,它提供了一些内置模块,保证js代码执行)
  2. 可以用来开发后台(一些小型网站,论坛都可以使用,开发程度比较低,开发速度比较快)。

组成

ECMAScript

和js中的基础语法是一样的

内置模块

fs文件相关模块

path路径相关模块

http服务器相关模块

第三方模块(自学)

express 可以快速构造web应用

MySQL 可以通过js代码操作数据库

学习路径

js

ECMAScript基础语法 + 对象模型(DOM+BOM)

nodejs

ECMAScript基础语法 + 内置模块(fs+path+http)

模块化思想

模块化概念

概念

为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统。

就是遵循固定的规则,把一个大文件,拆分成独立并且相互依赖的多个小文件

类似函数(方法),对代码的封装。但函数(方法)只能在当前文件中使用,不能跨文件使用

模块化解决了这个问题,它就是把代码放在一个单独的js文件中,需要用到的时候直接引入

这样就可以跨文件使用,这就是模块化思想

优点

提高了代码的复用性和可维护性

可以实现按需加载,提高效率

模块化分类

来源不同

内置模块

由nodejs官方提供,例如fs,path,http等

自定义模块

用户自己创建的每一个js文件,都是自定义模块

第三方模块

由第三方开发出来的,使用之前需要下载

模块化入门

写一个js文件

其实就是创建了一个自定义模块

通过require(路径)加载自定义模块

其实就是把刚写好的模块内容复制进去

模块作用域

概念

在自定义模块中,定义的变量、方法等成员,只能在当前模块中使用,不能跨模块使用

优点

避免了全局变量污染的问题

全局变量污染

使用script:src

这种引入方式,是一种纯粹的拷贝,它里面的变量可以随意访问

就会出现跟当前页面定义的全局变量冲突,这就是全局变量污染问题

模块间共享

module对象

在每一个自定义模块中,都有一个module对象,里面存储了和当前模块相关的信息。

其中有一个属性exports属性,就是专门用来导出模块中定义的变量或者方法

导出对象

module.exports对象(常用)

用于导出模块中定义的变量和方法

exports对象

↑写起来比较复杂,为了简化书写,node提供了一个exports对象。也可以用来导出

默认情况下,module.exports对象和exports对象指向同一个对象

使用结构方法接收导出数据

好处

导入的时候直接解构,不需要再用对象接收

调用的时候,直接用解构中定义的变量和方法即可

常见的内置模块

fs模块

概念

官方提供的用于操作文件的模块,提供一系列操作稳健的属性和方法,方便用户操作文件

  1. 导入模块
    1. const fs = require('fs')
  1. 调用方法
    1. fs.readFile() 读取文件中的数据
    2. fs.writeFile() 向指定文件写入数据
语法

fs.readFile(path,option,callback)

path:文件路径

option:编码等可选操作

callback:回调函数(读取文件完成后,回头再调用的函数)

fs.writeFile(path,data,option,callback)

path:写入文件的路径(必须

data:要写入的数据(必须

option:编码等可选操作

callback:回调函数(写入文件完成后,回头再调用的函数)

使用

封装获取时间模块

function getToday(){
  // 获取当前的时间对象
  const date = new Date()
  // 获取年月日,星期
  const year = date.getFullYear()
  const month = date.getMonth() + 1
  const day = date.getDate()
  const week = date.getDay()
  // 定义一个数组保存星期
  const arr = ['星期日','星期一','星期二','星期三','星期四','星期五','星期六']
  // 返回当前时间
  return `今天是:${year}年${month}月${day}日` + arr[week]
}
// 导出方法1,普通方式
// module.exports.getToday = getToday
// 导出方法2,字面量对象?属性名:属性值(方法)
module.exports = {getToday : getToday}
// 导出方法3,如果属性名和属性值是一样的,可以只写一个
module.exports = {getToday}

调用获取时间模块

// 导入时间模块
const {getToday} = require('./17-封装获取当前时间的模块');
console.log(getToday()) 

path模块

概念

用于处理路径的模块

方法

path.dirname(path)

返回路径中代表文件夹的部分

path.join([...paths])

用于连接路径

path.extname(path)

返回路径中文件的后缀名

path.basename(path[,suffix])

返回文件路径中的最后一个部分

如果第二个参数传后缀名,获取出来的就没有后缀名

__filename

获取当前文件所在的路径

__dirname

获取当前文件所在的目录

console.log(__filename) // D:\web-gis\0814模块化\代码\19-内置模块-path-使用.js
console.log(__dirname) // D:\web-gis\0814模块化\代码
const path = require('path');
console.log(path.dirname(__filename)) //D:\web-gis\0814模块化\代码
console.log(path.join(__dirname,'/file/a.txt')) // D:\web-gis\0814模块化\代码\file\a.txt
console.log(path.extname(__filename)) // .js
console.log(path.basename(__filename)) // 19-内置模块-path-使用.js
console.log(path.basename(__filename,'.js')) // 19-内置模块-path-使用

http模块

Node.js 提供了 http 模块,http 模块主要用于搭建 HTTP 服务端和客户端,使用 HTTP 服务器或客户端功能必须调用 http 模块

概念

跟服务器相关的模块,可以用来搭建web服务器

方法

http.createServer() 创建一个服务器

const http = require('http');
// 创建web服务器
const app = http.createServer()
// 打印服务器
console.log(app)

包的操作

包的概念

来源

跟内置模块和自定义模块不同,是由第三方个人或者团队开发出来,免费给其他人使用的

https://www.npmjs.com

package/moment

优点

包是基于内置模块封装的,提供了一个更高级、更方便的api,提高开发效率

npm包管理工具

概念

由美国的一家公司提供的,用来管理包。现在已经被集成到nodejs中

安装

无需安装,在安装nodejs的时候,已经自动安装好了

使用

npm -v

查询版本

npm i 包名

安装

nrm镜像管理工具

作用

解决国外网站速度慢,可以使用国内镜像

安装

npm install nrm -g 安装镜像管理工具(-g代表全局安装)

C:\Users\albedo\AppData\Roaming\npm\nrm -> C:\Users\albedo\AppData\Roaming\npm\node_modules\nrm\cli.js
+ nrm@1.2.6
added 17 packages from 10 contributors in 4.714s

nrm ls 列出所有镜像

npm config set registry https://registry.npm.taobao.org

npm config get registry 查看当前镜像(为淘宝镜像

npm uninstall 包名

卸载该包

包的规范(package)

组成

node_modules

用来存放所有已经安装到本地的包。require导入第三方包的时候,都先从这个目录中查找

package.json

当前包的配置文件,用于记录当前包的下载信息。例如包名,版本,下载地址

name 包名

version 版本号

main 包的入口

规范
  1. 包必须以单独的目录存在
  2. 包的顶级目录下必须包含package.json配置文件
  3. package.json配置文件中必须要有name,version,main这三个属性
手写一个计算器包(calc,计算两个数的加减法)
  1. 创建文件夹
    1. 在node-modules下面新建一个文件夹calc
  1. 初始化文件夹
    1. 使用cd进入该文件夹
    2. 使用npm init -y来初始化这个包,就会在calc下面自动创建一个package.json的配置文件
  1. 创建包的目录结构
    1. 创建scr文件夹,用于存储源码
    2. 创建dist文件夹,作为发布目录
    3. 在dist文件夹下,创建一个index.js文件,作为包的入口文件
    4. 修改package.json配置文件中的main属性值为'dist/index.js'
  1. 编写源码(src下)
    1. src下创建一个add.js,实现加法操作,并用module.exports导出
    2. src下创建一个sub.js,实现减法操作,并用module.exports导出
  1. 编写头文件(在dist文件夹下的index.js里面)
    1. 步骤:将源码里面的文件都导进去,再统一导出
    2. 好处:将来只需要引入头文件,就可以将整个源码中的文件引入
模块的加载机制

加载步骤

  1. nodejs会假设它是一个内置模块,去系统安装目录下查找
  2. 如果不是内置模块,就去当前目录下的node-modules中查找
  3. 首先看有没有该名字对应的文件。如果有,就直接加载这个文件
  4. 如果没有该名字对应的文件,就看是否有该名字对应的文件夹
  5. 如果有,查看文件夹中的package.json的main属性,确定模块的入口文件
  6. 进入文件夹后没有package.json配置文件,就会加载index.js
  7. 如果index.js也没有,就会报错。

加载总结

  1. 先看是否为内置模块
  2. 不是->到node-modules中查找
  3. 先找同名js文件
  4. 无->找同名文件夹
  5. 有同名文件夹,无package.json->加载index.js
  6. 有同名文件夹,有package.json->到main属性指定的文件中加载

加载注意

  1. 模块在第一次加载后就会被缓存,多次调用require,不会导致模块被加载多册
  2. 不管哪种加载,都是优先从缓存中加载,从而提高加载效率
  3. 内置模块有nodeJs官方提供,加载优先级最高

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值