Node.js
了解几种模块化规范
模块的分类
-
自定义模块
- Node.js中,创建的JS文件都是自定义模块
-
内置模块 (核心模块)
- 安装Node之后,自带了很多内置模块。我们可以直接加载使用他们
-
第三方模块
- 其他人编写的时候,发布到npm网站上,我们可以下载使用
自定义模块
我们创建的每个JS文件都是一个自定义模块,并且具有模块作用域,也就是在一个模块中创建的变量、常量、函数等等一切,都只能在当前模块中使用
导出模块:module.exports
- 共享 (导出/暴露) 内容给其他模块用,需要使用
module.exports
导出内容module
是Node的一个全局对象,对象包含当前模块的详细信息module.exports
是模块的出口,导出内容使用,默认值是{}
- 例如:
module.exports = {age,name,fn}
const PI = 3.1415926;
function fn(){
console.log('这是来自m1模块的fn方法');
}
// 导出模块 - module.exports 的值是什么外部引入的就是什么
// * 第一种方式 (倾向于导出一个整体)
module.exports = {
PI:PI,
fn:fn
}
// exports是module.exports(对象)的引用
// * 第二种方式 (倾向于导出多个内容,相当于把对象里面的某个属性单独拎出来)
exports.PI = PI;
exports.fn = fn;
导入模块:require(‘模块路径’)
- 如果需要导入模块导出的内容,可以使用
require()
加载 - 例如:
let 结果 = require('模块路径')
=>let test = require('./02-test')
- 加载自定义模块,必须加路径,即使是
./
也必须加,可以省略后缀
// 引入模块
let a = require('./01-m1.js');
console.log(a);
示例:
02-test.js - 导出内容
let age = 20;
let name = '张三';
let height = '175cm';
let sing = function (){
console.log('sing');
}
// 导出age,name,sing给其他模块使用
module.exports = {age,name,sing}
02-use.js - 导入内容
let test = require('./02-test.js');
console.log(test); // {age:20,name:'张三',fn:Function...}
一个模块导出什么,另一个模块就加载什么,就会得到什么 一个模块导出什么,另一个模块就加载什么,就会得到什么 一个模块导出什么,另一个模块就加载什么,就会得到什么
内置模块
内置模块是Node.js平台自带的一套基本的API(功能模块),也称为核心模块
加载内置模块,不能写路径
Path模块
-
path
是Node 本身提供的API,专门用来处理路径 -
使用
-
加载模块
-
// 使用核心模块之前,首先加载核心模块 let path = require('path'); let const = require('path');
-
调用path模块中的方法。来处理相应的问题,下面列举path模块中的几个方法
方法 作用 path.basename(path[, ext]) 返回 path 的最后一部分(文件名) path.dirname(path) 返回目录名 path.extname(path) 返回路径中文件的扩展名(包含.) path.format(pathObject) 将一个对象格式化为一个路径字符串 path.join([…paths]) 拼接路径 path.parse(path) 把路径字符串解析成对象的格式 path.resolve([…paths]) 基于当前工作目录拼接路径 const path = require('path'); // -----------------------basename 获取文件名称 ---------------------- console.log(path.basename('D:\基础班资料\03-path-test.js')); // 03-path-test.js console.log(path.basename('D:\基础班资料\03-path-test.js','.js')) // 03-path-test // 如果第二个参数和第一个获取的文件名的后缀名一样,那么获取过来的文件名的后缀名就会抵消 // ------------------------extname 获取文件后缀 ----------------------- console.log(path.extname('index.html')); // .html consoel.log(path.extname('index.coffee.md')); // .md // ------------------------join 智能拼接路径 -------------------------- console.log(path.join('a','b','c')); // a/b/c console.log(path.join('a','b','c','index.css')); // a/b/c/index.css console.log(path.join('a','b','../','c','index.js')); // a/c/index.js // -----------------_dirname 永远表示当前js文件的绝对路径 --------------- console.log(path.join(_dirname,'css','demo.css')); // PS D:\BaiduNetdiskDownload\基础班资料\Node课程\NodeJS资料\项目前置课-01\css\demo.css>
-
fs模块
-
fs,即
file system文件系统
,该模块可以实现对文件、文件夹的操作 -
使用:
-
加载模块
// 引入模块,引入模块的时候,可以使用var、let、但是建议使用const,因为我们不希望它改变 const fs = require('fs');
-
调用fs模块的方法,下面举例fs模块中的常用方法
API 作用 备注 fs.access(path, callback) 判断路径是否存在 fs.appendFile(file, data, callback) 向文件中追加内容 fs.copyFile(src, callback) 复制文件 fs.mkdir(path, callback) 创建目录 fs.readDir(path, callback) 读取目录列表 fs.rename(oldPath, newPath, callback) 重命名文件/目录 fs.rmdir(path, callback) 删除目录 只能删除空目录 fs.stat(path, callback) 获取文件/目录信息 fs.unlink(path, callback) 删除文件 fs.watch(filename[, options][, listener]) 监视文件/目录 fs.watchFile(filename[, options], listener) 监视文件 // readFile -- 异步读取文件 // 第一个参数:必填,读取文件路径 // 第二个参数:选填,编码类型(utf-8) // 第三个参数:必填,文件读取成功要做的那些事 fs.readFile('./test.json',function(err,data){ // *第一个是错误对象,当读取发生失败时会出现的对象 // *第二个参数是读取文件的结果 if(err) throw err; console.log(data); // 读取到的二进制数据 console.log(data.tostring()); // 得到原始数据 }); fs.readFile('./test.json','utf-8',function(err,data){ if(err){ console.log('读取文件出错'); }else{ console.log(data); // 读取到的原始数据 } });
// writeFile -- 异步写入文件 // 写入文件 // 第一个参数:必填,写入文件的路径,指定文件名和扩展名(会自动创建出来) // 第二个参数:必填,写入文件的数据内容 // 第三个参数:选填,数据内容的编码格式 // 第四个参数:选填,写入完成后的回调函数 fs.writeFile('./abc.html','helloworld',function(err){ if(err !== null){ return console.log('文件写入失败') } console.log('文件写入成功') })
-
读取写入案例:
// 需求,读取score.txt的文件,转换格式后,写入都score1.txt
// 1.引入fs模块
let fs = require('fs')
// 2.读取文件内容
fs.readFile('./score.txt','utf8',function(err,data){
// 判断是否读取成功
if(err !== null){
return console.log('读取文件失败');
}
})
// 3.利用正则把获取到的结果的 “=” 改为 “:”
let firstResult = data.replace(/=/g,':'); // '/='表示所有等于号 '/g'表示全局(全部)
// 4.再次利用正则把获取到的结果的空格改为回车换行
let secondResult = firstResult.replace(/ /g,'\r\n');
// 5.写入文件内容
fs.writeFile('./score1.txt',secondResult,'utf8',function(err){
if(err !== null){
return console.log('文件写入失败');
}
console.log('文件写入成功')
})
创建服务器案例:
// 目标:实现网站服务器
// 1.引入fs和http模块
const fs = require('fs');
const http = require('http');
// 2.创建服务器
let server = http.createServer();
// 3.监听客户端的请求
server.on('request',function(resquest,response){
// 当有客户端请求,就会触发这个回调函数
// request请求对象,包含客户端请求时携带的一些信息(参数,路径,请求头...)
// request.url :指的就是端口号后面的路径 - 获取get参数
console.log(request.url)
// request.method :指的是请求方式
console.log(request.method);
// response响应对象,返回数据时使用
console.log('有人访问了我们的服务器')
// 响应给客户端数据
// ①相应数据
// response.end('数据')
// response.end({"name":"zs","age":"18"});
// response.end('这是一条数据');
// ②响应文件的写法
// 先把要响应过去的页面获取到
// 解决中文乱码
response.setHeader('Content-type','text/html;charset=utf-8');
fs.readFile('./index.html','utf8',function(err,data){
return response.end('404');
})
response.end(data);
})
// 4.启动服务器
// 第一个参数:端口号,必填
// 第二个参数:运行成功的回调,选填
server.listen(80,function(){
console.log('服务器启动成功,运行在http://127.0.0.1:80端口');
})
// 终止服务器运行 Ctrl+c