​ 今天重点就是两个章节: 利用 http 模块创建服务 和 模块化。

1. HTTP模块创建服务

​ 很多软件都可以启动服务,IIS,Apache,Tomcat...... 但是 node.js 选择的是以 http 内置模块自定创建服务的形式进行启动;

1.1 网络通讯三大要素

​ 网络通讯的三大要素就是:协议,域名(IP),端口;

1.1.1 协议

​ 协议:就是网络通讯时,发送和接收时数据遵循的格式; 网络上比较常见的协议有:ftp,ssh,http,https

前端开发设计的协议有两个:http和https,http是学习期间用的最多的协议,明文传输,没有安全性可言。如果公司内部的系统也可以使用 http 协议开发; 商业开发一般使用https,因为这个协议是在http协议基础上进行了加密,也是就说操作还是按照http协议操作,但是发送和接收过程中需要加密和解密(收费);

1.1.2 域名(IP)

​ IP:现在有两类:IPv4和IPv6;IPv4用的最多,由四部分点分十进制构成; 例如: 127.123.123.123

取值范围:0~255;本机ip为:127.0.0.1 ~ 127.255.255.255;

​ 域名:给网站起个名字,方便用户记忆; 一个域名可以对应多个IP,因为负载均衡(Nginx); 本机域名为:localhost

​ 内网和外网:局域网就是内网 (192.168.1.1 ~ 192.168.255.255),网络内部可以通讯。外网指的就是可以连接互联网的网络;

1.1.3 端口

​ 端口:一台电脑上面会运行很多程序,每个程序可以对应一个端口,这样发送和接收数据的时候,这个程序就可以对应这个端口了; 取值范围:0~65535; 0~1023固定端口; 1024~65535 动态端口,别人放弃我们就可以使用;

1.2 利用 HTTP 模块创建服务

代码如下:( 第一次代开命令行在文件上面右键选择 在命令提示符中打开,第二次以后用ctrl + ~ )

// 1.引包
const http = require("http");
// 2.创建
const server = http.createServer();
// 3.绑定
server.on("request", (req, res) => {
    // 4.1 返回给客户端数据
    console.log("有人访问了我的服务!");
    res.end('Hello world');
    // // 4.2 返回给客户端数据
    // console.log(req.url)
    // console.log(req.method)
    // res.end(`Url: ${req.url} ; Method: ${req.method} `);
    // // 4.3 解决乱码,设置头信息
    // res.setHeader("Content-Type", "text/html; charset=UTF-8");
    // res.end(`<h2>地址:${req.url},方法:${req.method}<h2>`);
})
// 5.监听( 0-1023 固定端口尽量不用,80 / 443 除外)
server.listen(8888, function () {
    console.log("服务器以开启,请访问: http://localhost:8888");
})

1.3 时钟案例

​ 代码(略);

1.4 多次开启服务错误

2. 模块化

​ 为了 降低 文件之间的变量污染,和明晰文件之间的依赖关系,node.js 选择了模块化开发;用户很简单:

和函数作用域类似,在自定义模块中定义的变量、方法等成员,只能在当前模块内被访问,这种模块级别的访问限

制,叫做模块级别作用域,CommonJS 规范:

    1.想要使用别人的模块就用 require();     
    2.想要别人使用当前文件中的变量或者函数就 module.exports

​ node.js中的模块分为三类:核心模块,自定义模块,第三方模块;

2.1 核心模块

​ 内置模块(内置模块是由 Node.js 官方提供的,例如 fs、path、http 等),使用方法:

const 变量 = require("模块");
// 变量.方法/属性   逻辑操作...

2.2 自定义模块

​ 自定义模块(用户创建的每个 .js 文件,都是自定义模块),自定义模块需要加路径前缀(相对路径),后缀名.js可以省略,定义和使用的时候要遵循commonJS规范,导出用module.exports,导入用require();

结论:
   1  导出.属性 那么就用 exports ;
        例如:  exports.username = '张三'
                exports.age = '18'
                exports.address = '北京'

   2  导出 = {}; 那么就用 module.exports ;
        例如:  module.exports = {usernmae: '战三', age: 18}

2.3 第三方模块

​ 第三方模块(由第三方开发出来的模块,并非官方提供的内置模块,也不是用户创建的自定义模块,使用前需要先下载)

2.3.1 第三方包的来源

​ 百度完成某功能有哪些第三方包,然后去 https://www.npmjs.com/ ,查阅;

2.3.2 下载和使用步骤

  • npm init -y : 初始化项目

  • npm i 第三方包名@版本号 : 安装第三方包

  • const foo = require("第三方包名") : 导入第三方包

  • 使用,参考官网

2.4 总结

  • 自定义模块需要加路径前缀(相对路径),后缀名.js可以省略,核心模块和第三方模块直接写模块名即可。
  • 使用 require() 方法加载其它模块时,被加载的模块里面的代码会被立即执行。
  • 导出.属性 那么就用 exports ,可以省略 module,操作简单,书写方便。
  • 导出 = {}; 那么就用 module.exports ,不能省略 module,省略会出现错误。
  • 熟练掌握第三方包的下载和使用。