模块与包管理器
模块化
- 一般在前端我们讲组件开发,在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('服务正在启动中')
})