node学习之——模块与包管理器③

模块与包管理器

模块化

  • 一般在前端我们讲组件开发,在node中讲模块化
    分三种:
    • 内置模块
    • 第三方模块
    • 自定义模块

1.内置模块

直接可以用的,引入要使用的模块,再使用想要的方法即可。

const fs=require('fs')
//同步读取文件 在关键位置捕获错误信息
try{
    
    
	let dirs=fs.readdirSync('./')
	console.log(dirs)
}
catch(err){
    
    
	console.log('出错了')
	console.log(err)
}
console.log('我执行了')

//异步读取文件目录树
fs.readir('./',(err,data)=>{
    
    
	console.log(err) //null
	console.log(data)
	if(err){
    
    
		console.log('读取错误')
	}else{
    
    
		console.log(data)
	}
})

总结:

  • 同步 try catch 异步:错误回调优先
  • curd:create updata read del 数据操作
  • 有文件夹的操作 创建 更新 读 删

2.第三方模块

自定义模块

  • 在node中如何自定义一个模块呢?
  • 创建一个模块(一个js文件就是一个模块)
  • 导出一个模块(module.exports = 定义的名称)
  • 引用一个模块并且调用(require(模块路径))

js天生的缺陷-缺少模块化的管理工具

表现:容易出现变量被覆盖,方法被污染的情况

var num = 123
var num = 456 // 变量被覆盖了
function demo(){
    
    
	console.log('这是demo1的方法')
}
function demo(){
    
    
	console.log('这是demo2的方法')
}
console.log(num) // 456
demo() // 这是demo2的方法
  • 解决方案1:命名空间
let moduleA = {
	num:123,
	demo:function demo(){
		console.log('这是demo1的方法')
	}
}
let moduleB = {
	num:456,
	demo:function demo(){
		console.log('这是demo2的方法')
	}
}
console.log(moduleA.num) //123
console.log(moduleB.num) //456
moduleA.demo() //这是demo1的方法
moduleB.demo() //这是demo2的方法

如jQuery中有许多变量和方法,但是无法直接访问,必须通过jQuery,$调用各个方法

  • 解决方案2:闭包
<script>
(function(){
     
     
	var num = 123
	function demo (){
     
     
		console.log('这是demo1方法')
	}
	console.log(num) //123
	demo() //这是demo1方法
})()
</script>
<script>
(function(){
     
     
	var num = 456
	function demo (){
     
     
		console.log('这是demo2方法')
	}
	console.log(num) //456
	demo() //这是demo2方法
})()
</script>

CommonJS标准

解释:不同于jQuery的命名空间,CommonJS是一套规范,约定了js如何组织,如何编写,包括包、二进制、套接字、单元测试等等。大部分标准在拟定和讨论之中,首先把执行不同任务的代码块和代码文件看为独立的模块,每一个模块都是一个单独的作用域,但不是孤立的,可能存在依赖关系。每个模块氛围三个部分,定义 、标识和引用。
在这里插入图片描述
在这里插入图片描述

NodeJs的模块管理机制

基于commonjs实现了模块管理系统。node中每一个js文件都是一个独立的模块,在其内部不需要有命名空间,不需要担心变量的污染和方法定义时的隔离。同时模块之间可以组合成更强大的模块或功能包。
在Node.js中,模块分成了三类

  • 核心模块
  • 文件模块
  • 第三方模块

在node.js中文件与模块是一一对应的,引用模块有两种方式

  • 通过文件路径引用
  • 通过模块名称引用

模块的流程

创建模块和导出模块

新建 utils.js文件

// 暴露接口
let utils ={
    
    
	sayHello:function(){
    
    
		return 'hello'
	},
	add:function(x,y){
    
    
	return x+y
	}
}
//通过 module.exports 导出
// module.exports = utils
// 通过exports单独导出
exports.sayHello = utils.sayHello
exports.add = utils.add
exports.str= '今天天气不错'

导入和使用模块

新建common.js文件

const http = require('http')
// let utils = require('./utils')
let sayHello = require('./utils').sayHello
let str = require('./utils').str
let server = http.createServer(function(req,res){
    
    
	res.statusCode=200
	res.setHeader('Content-Type','text/html;charset=utf-8')
	res.write(sayHello())
	res.write('<br/>')
	res.end(str)
})
server.listen(3000,'127.0.0.1',()=>{
    
    
	console.log('服务正在启动中')
})

猜你喜欢

转载自blog.csdn.net/weixin_53985543/article/details/115010875