一、模块的使用
在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。
为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。(一个js文件就是一个模块)
模块的最大好处:大大提高了代码的可维护性,方便。
优点:防止命名冲突。代码复用。高维护性。
规范:
CommonJS 的 Modules 规范: NodeJs
ES6 模块化规范 import ... from ...
使用:
导出数据方式一:
exports.num = num;
exports.sum = sum;
exports.Animal = Animal;
导出数据方式二:
// 通过module.exports 等于一个对象,来导出数据
// 对象可采用es6简化对象的写法
module.exports = {
num,
sum,
Animal
};
导入数据:const m1 = require("文件位置");
注意: 如果要使用某个模块里面的数据,则需要使用 require 关键字进行导入。
在导入用户自己开发的模块的时候,需要加上路径(1. 相对路径(多) 2. 绝对路径) 注意: ./ 必须写上
模块文件的扩展名(后缀名)可以写,也可以不写
导出的模块一般需要使用一个变量来接收,一般把接收的量定义为常量
定义常量的名称和文件的名称保持一致(这个不是必须,大家都这么做)
二、模块里面this的指向问题
exports实际上是module.exports的引用,
在 nodejs 里面的 this 代表当前的这个模块,也就是 exports 对象
console.log(exports); //{}
console.log(module.exports); //{}
console.log(exports === module.exports); //true exports实际上是module.exports的引用
console.log('this', this); // this {}
console.log(this === exports);// true // 在 nodejs 里面的 this 代表当前的这个模块,也就是 exports 对象 并且,交互模式下,没有exports这个对象
console.log(global === this ); //false this不指向全局对象
三、nodejs中的内置模块
一般项目中模块分为3种,nodejs内置模块、自己书写的模块、第三方模块(使用一个专门的工具npm进行统一管理)
nodejs内置模块的文档网址:http://nodejs.cn/api/
1、path内置模块
const path = require("path");
console.log(__dirname); // 当前执行的文件绝对路径,不包含文件名
console.log(__filename); // 当前执行的文件绝对路径,包含文件名
let extname = path.extname( __filename ); // 获取扩展名(后缀名)
console.log(extname);
let baseName = path.basename( __filename ); // 获取文件名(包含后缀名)
console.log(baseName);
let dirname = path.dirname(__filename); //获取目录(路径)
console.log(dirname);
let parse = path.parse(__filename); //获取路径字符串的对象
console.log(parse);
//路径的拼接操作 join
// join 默认相对路径的拼接 ,以当前操作系统路径分割符进行拼接
let fullPath1 = path.join('path.js');
// fullPath1 = path.join(__dirname,'path.js'); //带目录
// fullPath1 = path.join(__dirname,'a','path.js'); //带多级目录
console.log(fullPath1);
报错提示:看到 <Buffer ..... > 需要 toString() 才能看到里面的真实数据
2、fs文件系统模块
Node.js 的 API 内置有两个模块: path 和 fs ,我们使用 JavaScript 代码编写程序运行在 Node.js 环境中就可以操作文件
四、同步读取文件信息
同步读取:读取的时候,要等文件读取完毕后,才会执行后面的代码 (sync 同步)
const fs = require("fs");
const path = require("path");
let pathName = path.join(__dirname, 'hello.txt');
// const content = fs.readFileSync(pathName); 同步读取文件
// console.log(content);
// console.log(content.toString());
const content = fs.readFileSync(pathName, "utf-8");
console.log(content);
五、异步读取文件信息
不用等待文件读取完毕就会执行后面的代码。
const fs = require("fs");
const path = require("path");
let pathName = path.join(__dirname, "hello2.txt");
// console.log(file);
//参数1 要读取的文件
//参数2 设置读取到内容的编码,设置后读到的内容为字符串,如果不传则读到的数据为 buffer
//参数3 回调函数,读取完文件后执行的代码
fs.readFile(pathName, "utf-8",(error, data)=>{
// console.log(error);
// console.log(data);
if(error){
console.log(error);
return
}
console.log(data);
});
六、http模块
1、http核心模块的使用
四个步骤:
1、导入http模块 const http = require("http");
2、定义服务器程序端口 const port = 8080;
3、创建服务器对象
const server = http.createServer((request, response)=>{
response.write("hello nodejs"); // 书写响应体内容
response.end() //发生响应到浏览器 当我们修改代码后,需要重新执行该文件,重启服务
});
4、调用服务器的监听方法,让服务器监听浏览器请求
server.listen(port,(error)=>{
console.log(error);
console.log(`server is running at port ${port}`);
});
注:
一个端口只能被一个服务进行使用,如果这个端口被某个服务使用,其他的服务不能在使用该端口的。这个时候出现端口冲突。如何解决?答:换个端口
建议:1-1024 端口(有些系统服务会使用这个范围的端口),不建议程序员自己使用。一般都使用 1024 以后的端口。
如果需要解决中文乱码,需遵循http协议:
response.setHeader("Content-type","text/html;charset=utf-8");
2、获取请求的一些信息
const url = require("url");
const server = http.createServer((request, response)=>{
console.log("------------------------------");
let requestUrl = request.url; // 获取本次请求的资源路径
console.log(requestUrl);
let method = request.method; // 获取本次请求的方式
console.log(method);
let obj = url.parse( requestUrl, true);
console.log(obj.query); // 获取get请求的查询字符串
// localhost:8080?name=nodejs&age=11 get请求
//当存在 post 提交数据 data 事件立马执行,postData就是提交过来的数据对象
request.on('data',(postData) => { // 获取post请求的请求参数
console.log(postData.toString());
});
response.write("hello nodejs"); // 书写响应体内容
response.end() //发生响应到浏览器 当我们修改代码后,需要重新执行该文件,重启服务
});
3、书写一个web服务器
创建index.html和其他HTML文件。
const http = require("http");
const fs = require("fs");
const path = require("path");
const server = http.createServer((request, response)=>{
let requestUrl = request.url;
console.log(requestUrl);
if(requestUrl==="/" || requestUrl==="/index.html"){
let content = fs.readFileSync(path.join(__dirname,"assets","html","index.html"));
response.end(content)
}
else if(requestUrl==="/login.html"){
let content = fs.readFileSync(path.join(__dirname,"assets","html","login.html"));
response.end(content)
}
else if(requestUrl.indexOf(".css") > -1){
let content = fs.readFileSync(path.join(__dirname,"assets","css",requestUrl));
response.end(content)
}
else if(requestUrl.indexOf(".js") > -1){
let content = fs.readFileSync(path.join(__dirname,"assets","js",requestUrl));
response.end(content)
}
else{
response.end("404 NOt Fround:找不到该页面")
}
});
const port = 8080;
server.listen(port,(error)=>{
console.log(error);
console.log(`server is running at port ${port}`);
});
七、npm简介
`npm` 全称为 `Node Package Manager`,是一个基于 `Node.js` 的包管理器,也是整个 `Node.js` 社区最流行、支持的第三方模块最多的包管理器。npm的初衷:JavaScript开发人员更容易分享和重用代码。
1. nodejs = ECMAScript + 核心模块
2. 自己遵循 commonjs 规范写出模块,如果写的是功能模块(日期处理datejs,数字处理numberjs)。如果可以把这些模块分享出来,以后谁要进行相关功能开发的时候,直接拿开发好的模块使用即可,没必要自己在开发。在互联网有一个网站专门收集这样的工具包。https://www.npmjs.cn/。
3. 如果我们要使用这个网站里面的包,则我们需要使用一个功能,叫做 npm。
https://www.npmjs.com/package/md5
npm可以用来:
- 允许用户获取第三方包并使用
- 允许用户将自己编写的包或命令行程序进行发布分享
1、安装
在命令提示框中全局安装:npm install npm --g
如果安装不顺利,检查自己是否是以管理员的身份运行的。
2、使用md5模块为例
1、项目目录下,执行命令 npm init,目录下会多一个package.json文件(这个文件1、记录项目相关信息,如项目名称,项目版本2、后期会记录项目中使用的第三方模块)
2、执行命令 npm install md5,这时候就会开始联网下载md5这个包
3、看见以下代码表示下载完成:
4、下载完就可以在项目中去导入然后使用了:
运行就会得到一个加密字符串。
八、nodemon包安装使用
前面使用node的http模块书写过web服务器,但是每次改写一点代码都需要重启服务器,开发不是很方便。nodemon可以监听代码的改动自动更新,不需要重启服务器程序就可以看效果。
命令提示框中全局安装
下载:npm install -g nodemon
-g 表示安装在全局, 这种安装方式不同于前面的安装,它只需要安装一次,就能一直使用。安装的时候会有一个专门的安装目录(安装完成会有提示安装位置,如果忘记了,可以通过npm root -g命令查看安装
这样即使是再修改代码就不用再重新启动服务器。